出品 沃趣技术
服务器主机提供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内存使用,下面两个条件必须满足:
命令如下:
ALTER SESSION SET CONTAINER=PDB1;
ALTER SYSTEM SET SGA_TARGET = 1500M SCOPE = BOTH;
ALTER SYSTEM SET SGA_MIN_SIZE = 500M SCOPE = BOTH;
对于更细致的控制,也可以设置PDB的DB_CACHE_SIZE和SHARED_POOL_SIZE。
在PDB级别上设置PGA_AGGREGATE_TARGET和PGA_AGGREGATE_LIMIT可以控制某个PDB的PGA使用情况。
PGA_AGGREGATE_TARGET是目标值,PGA_AGGREGATE_LIMIT是限制值。如果PGA使用量达到PGA_AGGREGATE_LIMIT这个限制值,会话就会报错:
altersession set container=PDB1;
ALTERSYSTEM SET PGA_AGGREGATE_LIMIT = 500M SCOPE = BOTH;
ALTERSYSTEM SET PGA_AGGREGATE_TARGET = 300M SCOPE = BOTH;
以下两个视图用于监控PDB的内存使用情况
历史使用信息可以参考视图:DBA_HIST_RSRC_PDB_METRIC
下面说明内存组件在数据库中设置时需要满足的条件。
如下参数可以控制pdb的内存使用,如果当前pdb设置了参数,那么就控制当前pdb使用的内存大小,如果一个或者多个参数被设置了,请确保其他pdb或者cdb有足够的内存使用。
三、CPU资源隔离
数据库中,不同的PDB对主机CPU资源使用要求不同,那么我们就可以使用CDB resourceplans来管理不同pdb对CPU资源的使用。
PDB数量很多的情况下,使用这种CDB级别的资源计划对每个PDB进行资源限制会很麻烦。在12cR2版本中,引入了PDB Performance profile特性,来使一组PDB使用相同的resource plan,而不是一个个PDB进行配置。一些资源需求相同的PDB,可以创建一个performance profile,这些PDB只要设置一下DB_PERFORMANCE_PROFILE初始化参数,就可以使用相同的性能配置。
在CDB$ROOT中
exec DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
This proceduremakes changes to resource manager objects.
All changes tothe plan schema must be done within a pending area. The pending area can bethought of as a "scratch" area for plan schema changes. The administratorcreates this pending area, makes changes as necessary, possibly validates thesechanges, and only when the submit is completed do these changes become active.
计划的名字是woqucdb_plan
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN(
plan => 'woqucdb_plan',
comment => 'CDB resource plan for woqucdb');
END;
/
创建PDBprofile, gold
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_CDB_PROFILE_DIRECTIVE(
plan => 'woqucdb_plan,
profile => 'gold',
shares => 3,
utilization_limit => 100,
parallel_server_limit => 100);
END;
/
创建PDBProfile, silver
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_CDB_PROFILE_DIRECTIVE(
plan => 'newcdb_plan',
profile => 'silver',
shares => 2,
utilization_limit => 40,
parallel_server_limit => 40);
END;
/
创建PDBProfile, bronze
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_CDB_PROFILE_DIRECTIVE(
plan => 'newcdb_plan',
profile => 'bronze',
shares => 1,
utilization_limit => 20,
parallel_server_limit => 20);
END;
/
BEGIN
DBMS_RESOURCE_MANAGER.UPDATE_CDB_PROFILE_DIRECTIVE(
plan=> 'woqucdb_plan',
profile=> 'gold',
new_shares=> 1,
new_utilization_limit=> 10,
new_parallel_server_limit=> 20);
END;
/
使用UPDATE_CDB_AUTOTASK_DIRECTIVE
execDBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();
execDBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
在CDB$ROOT中
ALTERSYSTEM SET RESOURCE_MANAGER_PLAN = 'woqucdb_plan' scope=both;
altersession set container=PDB1;
altersystem set db_performance_profile='gold' scope=spfile;
altersession set container=PDB2;
altersystem set db_performance_profile='silver' scope=spfile;
altersession set container=PDB3;
altersystem set db_performance_profile='bronze' scope=spfile;
重启PDB
conn/as sysdba
alterpluggable database all close immediate;
alterpluggable database all open;
也可以在PDB中一个个单独设置并重启
altersession set container=PDB4;
altersystem set db_performance_profile=gold scope=spfile;
alterpluggable database close immediate;
alterpluggable database open;
altersession set container=CDB$ROOT;
selectinst_id, name, con_id, value, ispdb_modifiable from gv$system_parameter2 wherename = 'db_performance_profile' order by 1,2,3,4;
11)检查PDB的资源管理设置
altersession set container=CDB$ROOT;
selectp.name,shares,utilization_limit,parallel_server_limit,profile from v$rsrc_planr,v$pdbs p where r.con_id = p.con_id;
我们只需要在相应的pdb中设置db_performance_profile初始化参数即可让当前的PDB使用哪个profile了。
the total number of shares is seven (3 plus 3 plus 1).
The salespdb andthe servicespdb PDBare each guaranteed 3/7th of the resources, while the hrpdb PDB isguaranteed 1/7th of the resources. However, any PDB can use more than theguaranteed amount of a resource if there is no resource contention.
PDB的资源限制,我们既可以设置CDB resource plan同样也可以设置pdb的初始化参数控制,两者皆可。当PDB数据很多时,更建议使用CDB resource plan结合pdb performance profile使用。
我们可以通过show parameter 命令查看当前pdb的performance profile,如果是空值的话,即为默认的performanceprofile。默认的performance profile中,shares值默认为1,utilization_limit和parallel_server_limit都为100,也就是说不对当前的pdb做任何的有关cpu资源的限制。
我们可以用下面的过程来更改默认的指令。
BEGIN
DBMS_RESOURCE_MANAGER. UPDATE_CDB_DEFAULT_DIRECTIVE (
PLAN =>'newcdb_plan',
NEW_COMMENT => 'CDB resourceplan for newcdb1',
NEW_SHARES => 3,
NEW_UTILIZATION_LIMIT => 100,
NEW_PARALLEL_SERVER_LIMIT => 100);
END;
/
当一个PDB从CDB中拔出时,相应的指令默认保留,当这个PDB迁移回来,它就会继续使用这个指令。除非手工删除。
上图说明默认的pdb指令share值为1,utilization_limit为50%,parallel_server_limit 是50%,当pdb没有指定指令时,例如marketingpdb和testingpdb就会使用默认的performance profile,因此marketingpdb和testingpdb每个都拿到1和cpu使用的50%。
一个指令可以给多个PDB使用,但是一个PDB不能用多个指令。
四、PDBLockdown Profiles
除了IO、内存、CPU之外,还有一些限制,比如:限制在pdb中的操作命令,我们可以创建一个lockdown profile来限制对当前PDB的操作,增强某些操作的安全性。
以下通过一个简单的测试来看看这个特性的基本功能。 首先在CDB root下创建一个profile,这个profile将对全局可用,并且需要:
SQL> connect / as sysdba
Connected.
SQL> CREATE LOCKDOWN PROFILE woqutech;
Lockdown Profile created.
SQL> ALTER LOCKDOWN PROFILE woqutechDISABLE STATEMENT = ('ALTER SYSTEM');
Lockdown Profile altered.
连接到PDB WXH,在PDB级别启用lockdown profile :
SQL> alter session set container = wxh;
Connected.
SQL> ALTER SYSTEM SET PDB_LOCKDOWN =woqutech;
System altered.
测试一下,可以看到所有的ALTER SYSTEM的操作都被禁用了:
LOCKDOWN PROFILE可以限制到非常细粒度的权限,比如以下限制仅仅限制用户执行ARCHIVE LOG和CHECKPOINT操作。
SQL> connect / as sysdba
Connected.
SQL> alter lockdown profile woqutechenable statement = ('ALTER SYSTEM') clause all except = ('ARCHIVE LOG','CHECKPOINT');
Lockdown Profile altered.
现在测试一下,可以看到在PDB上,限制精确的生效,CHECKPOINT操作不允许被执行:
SQL>alter session set container = wxh;
禁止当前PDB所有的alter system语句
ALTER LOCKDOWN PROFILE woqutech DISABLESTATEMENT = ('ALTER SYSTEM');
禁止除了altersystem flush shared_pool外的所有altersystem 语句。
ALTER LOCKDOWN PROFILE woqutech ENABLESTATEMENT = ('ALTER SYSTEM') clause = ('flush shared_pool');
禁止PDB中XDB protocols(FTP, HTTP, HTTPS)的使用
ALTER LOCKDOWN PROFILE woqutech DISABLEFEATURE = ('XDB_PROTOCOLS')
除了特定的权限,还可以对某些数据库功能特点进行限制,比如调用和执行UTL_HTTP 和 UTL_TCP 包可能是高风险的,那么以下的PROFILE设置可以禁用这些特性:
SQL> alter lockdown profile woqutechdisable feature = ('UTL_HTTP', 'UTL_TCP');
Lockdown profile altered.
SQL> conn system/oracle@woqu
Connected.
SQL> declare
2 l_request utl_http.req;
3 l_response utl_http.resp;
4begin
5 l_request :=utl_http.begin_request('http://www.woqutech.com');
6 l_response :=utl_http.get_response(l_request);
7end;
8/
declare
*
ERROR at line 1:
ORA-29273: HTTP request failed
ORA-01031: insufficient privileges
ORA-06512: at "SYS.UTL_HTTP",line 380
ORA-06512: at "SYS.UTL_HTTP",line 1127
ORA-06512: at line 5
DROP LOCKDOWN_PROFILE woqutech;