服务器主机提供IO、内存、CPU、存储空间等资源为数据库使用,Oracle使用Flex Diskgroup为数据库提供存储空间并做了相应的资源隔离。下面我们来看下Oracle是如何为不同的PDB做IO、内存、CPU限制的。
一、IO 资源隔离
12cR2中,引入了两个参数MAX_IOPS和MAX_MBPS
来限制PDB的物理IO。这两个参数只作用于PDB,不对CDB和非多租户环境生效。另外,这两个参数不限制redo log的写入(LGWR进程)和buffercache脏块写入磁盘(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数统计里的。不推荐设置MAX_IOPS
的值小于100,MAX_MBPS
的值小于25。
可以使用DBA_HIST_RSRC_PDB_METRIC
来计算一个PDB合理的IO限制。当计算IO限制值时,可以参考以下列:IOPS、IOMBPS、IOPS_THROTTLE_EXEMPT
和IOMBPS_THROTTLE_EXEMPT
。
set linesize 400
col PDB_NAME for a10
col BEGIN_TIME for a30
col END_TIME for a30
SELECTR.SNAP_ID,
R.CON_ID,
P.PDB_NAME,
TO_CHAR(R.BEGIN_TIME, 'YYYY-MM-DHH24: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的限制是起作用的。
当数据库中出现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
FROMDBA_HIST_ACTIVE_SESS_HISTORY H
JOINCDB_PDBS C
ONC.PDB_ID = H.P1
ANDH.EVENT = 'resmgr: I/O rate limit'
ORDER BY 4;
二、内存资源隔离
在12cR2的多租户环境中,PDB的SGA使用情况可能会很不均衡,有些PDB占用了大量的SGA内存,导致某些PDB得不到足够的SGA,进而影响性能。在12cR2的多租户环境中,可以控制和监控每个PDB的主机的内存情况。
满足条件
要控制每个PDB内存使用,下面两个条件必须满足:
CDB$ROOT
中初始化参数NONCDB_COMPATIBLE
保持为默认的FALSE。CDB$ROOT
中初始化参数MEMORY_TARGET
没有设置或设置为0,关闭内存自动管理,这是我们期待的。
管理PDB的SGA
SGA_TARGET
参数控制PDB使用的最大SGA大小,在PDB中,SGA_TARGET
必须要小于或等于CDB$ROOT
中的SGA_TARGET
SGA_MIN_SIZE
参数控制PDB最小SGA大小,SGA_MIN_SIZE
参数的设置指导如下:SGA_MIN_SIZE
值必须要小于CDB$ROOT
中S