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;