Oracle 12c系列(四)|资源隔离之IO、内存、CPU


服务器主机提供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参数的设置指导如下:

    1.SGA_MIN_SIZE值必须要小于CDB$ROOT中SGA_TARGET的值50%

    2.SGA_MIN_SIZE值必须要小于PDB中SGA_TARGET值的50%

    3.所有PDB的SGA_MIN_SIZE值总和必须要小于CDB$ROOT中SGA_TARGET的值50%

    注意:只有当CDB$ROOT中SGA_TARGET为非0值时,PDB中的SGA_TARGET和SGA_MIN_SIZE才生效。

命令如下:

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

在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的内存使用

以下两个视图用于监控PDB的内存使用情况


历史使用信息可以参考视图:DBA_HIST_RSRC_PDB_METRIC

下面说明内存组件在数据库中设置时需要满足的条件。

如下参数可以控制pdb的内存使用,如果当前pdb设置了参数,那么就控制当前pdb使用的内存大小,如果一个或者多个参数被设置了,请确保其他pdb或者cdb有足够的内存使用。

三、CPU资源隔离

数据库中,不同的PDB对主机CPU资源使用要求不同,那么我们就可以使用CDB resourceplans来管理不同pdb对CPU资源的使用。

CDB Resource Plans

PDB数量很多的情况下,使用这种CDB级别的资源计划对每个PDB进行资源限制会很麻烦。在12cR2版本中,引入了PDB Performance profile特性,来使一组PDB使用相同的resource plan,而不是一个个PDB进行配置。一些资源需求相同的PDB,可以创建一个performance profile,这些PDB只要设置一下DB_PERFORMANCE_PROFILE初始化参数,就可以使用相同的性能配置。

创建PDB性能配置的CDB资源计划

创建CDB资源计划:woqucdb_plan。里面包括PDB performance profile,gold、silver、bronze。

1)创建pending area

在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.

2)创建CDB资源计划

计划的名字是woqucdb_plan

BEGIN
DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN(
plan => 'woqucdb_plan',
comment => 'CDB resource plan for woqucdb');
END;
/
3)创建PDB Performance profile

创建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;
/
4)更新默认的PDBdirective
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;
/
5)更新自动PDB directive

使用UPDATE_CDB_AUTOTASK_DIRECTIVE

6)校验pending area
execDBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();
7)提交pending area
execDBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
8)启用CDB资源管理

在CDB$ROOT中

ALTERSYSTEM SET RESOURCE_MANAGER_PLAN = 'woqucdb_plan' scope=both;
9)在PDB中设置performanceprofile
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;
10)检查PDB的参数
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了。

指令中的share参数意义

DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN_DIRECTIVE中shares来明确给PDB的共享值。多个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使用。


默认performance profile

我们可以通过show parameter 命令查看当前pdb的performance profile,如果是空值的话,即为默认的performanceprofile。默认的performance profile中,shares值默认为1,utilization_limit和parallel_server_limit都为100,也就是说不对当前的pdb做任何的有关cpu资源的限制。


更改默认performance profile

我们可以用下面的过程来更改默认的指令。

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的操作,增强某些操作的安全性。

关于PDB Lockdown Profiles

以下通过一个简单的测试来看看这个特性的基本功能。 首先在CDB root下创建一个profile,这个profile将对全局可用,并且需要:

创建PDB Lockdown 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 :

使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

删除PDB Lockdown Profile

DROP LOCKDOWN_PROFILE woqutech;


猜你喜欢

转载自blog.csdn.net/woqutechteam/article/details/80339974