PDB资源管理之IO
1.1 参数介绍
MAX_IOPS设置每个可插拔数据库(PDB)每秒可发出的最大I/O数
MAX_MBPS设置每个可插拔数据库(PDB)的基础上每秒发出的I/O的最大兆字节(MB)数
12cR2中,引入了两个参数MAX_IOPS和MAX_MBPS来限制PDB的物理IO。这两个参数只作用于PDB,不对CDB和非多租户环境生效。另外,这两个参数不限制redo log的写入(LGWR进程)和buffercache脏块写入磁盘(DBWR进程)
此功能仅对多租户容器数据库(CDB)启用。该功能在Oracle Exadata上不受支持。
这两个参数可以在PDB中设置。如果参数在CDB中设置,则该CDB中的所有PDB将继承CDB中的参数值。该参数不能在非CDB环境中设置。
MAX_IOPS默认值0意味着在PDB中每秒可以发出的最大I/O数量上没有设置限制。
MAX_MBP默认值0意味着在PDB中每秒可发出的I/O的最大兆字节数(MB)上不设置限制。
MAX_IOPS,MAX_MBP 不推荐使用非常低的值,例如:MAX_IOPS 小于100 , MAX_MBP 小于25
一些需要注意的地方:
·参数是独立的。 您可以使用none,one或both。
·当参数设置在CDB级别时,它们成为所有PDB使用的默认值。
·当它们设置在PDB级别时,它们覆盖任何默认值。
·如果在CDB和PDB级别的值为“0”,则没有I / O限制。
·实例的正常功能所必需的关键I/O不受限制,但只要涉及极限,就会计入总I/O,因此I/O可能暂时超过限制。
·这些参数仅适用于多租户架构。
·此功能不适用于Exadata。
·限制将导致名为I/O rate limit的等待事件。
1.2 设置I/O参数
下面是在CDB级别设置MAX_IOPS 和MAX_MBPS参数,值是对所有PDB。
--设置参数值
SQL>ALTER SYSTEM SET max_iops=1000 SCOPE=BOTH;
SQL>ALTER SYSTEM SET max_mbps=400 SCOPE=BOTH;
--移除参数值
SQL>ALTER SYSTEM SET max_iops=0 SCOPE=BOTH;
SQL>ALTER SYSTEM SET max_mbps=0 SCOPE=BOTH;
下面是PDB级别设置这两个参数:
SQL>ALTER SESSION SET CONTAINER = pdbcndba;
-- 设置指定PDB参数值
SQL>ALTER SYSTEM SET max_iops=1000 SCOPE=BOTH;
SQL>ALTER SYSTEM SET max_mbps=400 SCOPE=BOTH;
-- 移除指定PDB参数值
SQL>ALTER SYSTEM SET max_iops=0 SCOPE=BOTH;
SQL>ALTER SYSTEM SET max_mbps=0 SCOPE=BOTH;
1.3 监控PDB的I/O使用情况
Oracle现在提供视图去监控PDB的资源使用(CPU, I/O, parallel execution, memory)
如:
·V$RSRCPDBMETRIC:每个PDB一行,保存1分钟样本的最后一个。
·V$RSRCPDBMETRIC_HISTORY:每个PDB有61行,从V $ RSRCPDBMETRIC视图保存最后60分钟的样本。
·DBA_HIST_RSRC_PDB_METRIC:AWR快照,基于AWR保留期保留。
下面是具体的SQL:
SET LINESIZE 180
COLUMN pdb_name FORMAT A10
COLUMN begin_time FORMAT A26
COLUMN end_time FORMAT A26
ALTER SESSION SET NLS_DATE_FORMAT='DD-MON-YYYY HH24:MI:SS';
ALTER SESSION SET NLS_TIMESTAMP_FORMAT='DD-MON-YYYY HH24:MI:SS.FF';
-- 每个PDB最后样本
SELECT r.con_id,
p.pdb_name,
r.begin_time,
r.end_time,
r.iops,
r.iombps,
r.iops_throttle_exempt,
r.iombps_throttle_exempt,
r.avg_io_throttle
FROM v$rsrcpdbmetric r,
cdb_pdbs p
WHERE r.con_id = p.con_id
ORDER BY p.pdb_name;
CON_ID PDB_NAME BEGIN_TIME END_TIME IOPS IOMBPS IOPS_THROTTLE_EXEMPT IOMBPS_THROTTLE_EXEMPT AVG_IO_THROTTLE
---------- ---------- -------------------------- -------------------------- ---------- ---------- -------------------- ---------------------- ---------------
3 PDBCNDBA 10-JUN-2018 17:27:01 10-JUN-2018 17:28:01 .583333333 .016666667 .583333333 0 0
5 PDBCNDBA2 10-JUN-2018 17:27:01 10-JUN-2018 17:28:01 .3 .016666667 .3 0 0
-- pdbcndba的最后几个小时的样本
SELECT r.con_id,
p.pdb_name,
r.begin_time,
r.end_time,
r.iops,
r.iombps,
r.iops_throttle_exempt,
r.iombps_throttle_exempt,
r.avg_io_throttle
FROM v$rsrcpdbmetric_history r,
cdb_pdbs p
WHERE r.con_id = p.con_id
AND p.pdb_name = 'pdbcndba'
ORDER BY r.begin_time;
-- pdbcndba的所有AWR快照的信息
SELECT r.snap_id,
r.con_id,
p.pdb_name,
r.begin_time,
r.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
AND p.pdb_name = 'pdbcndba'
ORDER BY r.begin_time;
当数据库中出现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;