12cR2 中,引入了两个参数 MAX_IOPS 和 MAX_MBPS 来限度 PDB 的物理 IO。这两个参数只作用于 PDB,不对 CDB 和非多租户环境失效。另外,这两个参数不限度 redo log 的写入(LGWR 过程)和 buffer cache 脏块写入磁盘(DBWR 过程)。
IO 对数据库性能至关重要。如果某个 PDB 产生了大量的 IO,那可能导致 CDB 中的其它 PDB 也受影响。MAX_IOPS 参数限度每秒 IO 操作次数,MAX_MBPS 参数限度每秒 IO 吞吐,如果这两个参数同时在 pdb 中设置,都会失效起作用。如果在 CDB$ROOT 中设置这两个值,那么以后 CDB 中每个 PDB 都采取此作为默认值。
默认状况下,这两个参数都为 0。如果在 PDB 中这两个参数为 0,CDB$ROOT 中也为 0,那对于 PDB 来讲,没有 IO 限度。
有些状况下,尽管物理 IO 限度曾经达到,然而一些要害 IO 依然容许,比方:对管制文件的拜访或对口令文件的拜访,然而这些要害 IO 也是计入到 IO 数统计里的。
能够应用 DBA_HIST_RSRC_PDB_METRIC 来计算一个 PDB 正当的 IO 限度。当计算 IO 限度值时,能够参考以下列:IOPS、IOMBPS、IOPS_THROTTLE_EXEMPT 和 IOMBPS_THROTTLE_EXEMPT。不举荐设置 MAX_IOPS 的值小于 100,MAX_MBPS 的值小于 25。
set linesize 400
col PDB_NAME for a10
col BEGIN_TIME for a30
col END_TIME for a30
SELECT R.SNAP_ID,
R.CON_ID,
P.PDB_NAME,
TO_CHAR(R.BEGIN_TIME, ‘YYYY-MM-D HH24:MI’) AS BEGIN_TIME,
TO_CHAR(END_TIME, ‘YYYY-MM-D HH24:MI’) AS END_TIME,
R.IOPS,
R.IOMBPS,
R.IOPS_THROTTLE_EXEMPT,
R.IOMBPS_THROTTLE_EXEMPT,
R.AVG_IO_THROTTLE
FROM DBA_HIST_RSRC_PDB_METRIC R, CDB_PDBS P
WHERE R.CON_ID = P.CON_ID
ORDER BY R.BEGIN_TIME;
ALTER SYSTEM SET MAX_IOPS = 1000 SCOPE = BOTH;
ALTER SYSTEM SET MAX_MBPS = 50 SCOPE = BOTH;
上面在同一数据库中,设置不同的 max_iops 和 max_mbps 查问雷同的语句所须要的工夫,能够看出 max_iops 和 max_mbps 对 IO 的限度是起作用的。
MAX_IOPS | MAX_MBPS | Elapsed(1) | Elapsed(2) | Elapsed(3) | Avg elapsed time |
---|---|---|---|---|---|
0 | 0 | 00:27.16 | 00:27.55 | 00:26.94 | 27.22 |
100 | 0 | 00:26.87 | 00:26.90 | 00:27.25 | 27.01 |
10 | 0 | 00:37.13 | 00:34.23 | 00:36.43 | 35.93 |
8 | 0 | 00:46.24 | 00:44.99 | 00:48.33 | 46.52 |
6 | 0 | 01:13.92 | 01:11.29 | 01:01.08 | 01:08.75 |
4 | 0 | 01:39.16 | 01:41.31 | 01:38.91 | 01:39:80 |
2 | 0 | 03:53.82 | 03:41.95 | 03:52.01 | 03:49:26 |
1 | 0 | 08:04.78 | 08:38.85 | 10:07.79 | 08::57:14 |
0 | 1 | 05:50.68 | 05:54.03 | 05:52.32 | 05:52:34 |
0 | 10 | 00:33.51 | 00:33.38 | 00:33.48 | 00:33.46 |
0 | 20 | 00:29.71 | 00:27.06 | 00:28.37 | 00:28.38 |
当零碎呈现 resmgr: I/O rate limit 期待事件时,能够通过如下视图查问以后 IO 过载影响到的 sql,p1 值标示以后 pdb_id 呈现此期待事件就须要调整 max_iops 和 max_mbps 正当值,防止影响到关键性业务。
SELECT H.EVENT,
H.P1 AS PDB_ID,
C.PDB_NAME,
H.SQL_ID,
TO_CHAR(H.SAMPLE_TIME, ‘YYYY-MM-D HH24:MI’) AS SAMPLE_TIME,
H.INSTANCE_NUMBER
FROM DBA_HIST_ACTIVE_SESS_HISTORY H
JOIN CDB_PDBS C
ON C.PDB_ID = H.P1
AND H.EVENT = ‘resmgr: I/O rate limit’
ORDER BY 4;