本文主要介绍 Oracle pdb 资源管理 相关内存 如IO、内存、cpu — by Firsouler 2021.06.8
IO资源管理
Oracle12.2开始,引入参数来限制pdb的IO,不对CDB和NO-CDB环境生效,不限制redo log和buffer cache写入磁盘。
- MAX_IOPS : 每秒IO操作次数
- MAX_MBPS : 每秒IO吞吐
命令参考:
--所有pdb
ALTER SYSTEM SET max_iops=100 SCOPE=BOTH;
ALTER SYSTEM SET max_mbps=400 SCOPE=BOTH;
--单独pdb
ALTER SESSION SET CONTAINER = pdbcndba;
ALTER SYSTEM SET max_mbps=400 SCOPE=BOTH;
ALTER SYSTEM SET max_iops=100 SCOPE=BOTH;
--取消
ALTER SYSTEM SET max_iops=0 SCOPE=BOTH;
ALTER SYSTEM SET max_mbps=0 SCOPE=BOTH;
监控PDB的IO使用情况
- v$rsrcpdbmetric:每个pdb一行,保存1分钟样本的最后一个指标值
- v$rsrcpdbmetric_history: 每个pdb61行,保存最后60分钟的样本
- dba_hist_rsrc_pdb_metric :AWR快照,基于AWR保留策略
参考sql:
SET LINESIZE 180
set pages 999
COLUMN pdb_name FORMAT A10
COLUMN begin_time FORMAT A26
COLUMN end_time FORMAT A26
ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS';
ALTER SESSION SET NLS_TIMESTAMP_FORMAT='YYYY/MM/DD HH24:MI:SS';
-- 每个PDB最后样本
SELECT r.con_id,
p.pdb_name,
r.begin_time,
r.end_time,
round(r.iops,2) iops,
round(r.iombps,2) iombps,
round(r.iops_throttle_exempt,2) iops_throttle_exempt,
round(r.iombps_throttle_exempt,2) 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;
--监控pdb最近几个小时的使用情况
ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS';
SELECT r.con_id,
p.pdb_name,
r.begin_time,
r.end_time,
round(r.iops,2) iops,
round(r.iombps,2) iombps,
round(r.iops_throttle_exempt,2) iops_throttle_exempt,
round(r.iombps_throttle_exempt,2) 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 = upper('MYPDB')
ORDER BY r.begin_time;
--基于AWR快照监视PDB
SELECT r.snap_id,
r.con_id,
p.pdb_name,
r.begin_time,
r.end_time,
round(r.iops,2) iops,
round(r.iombps,2) iombps,
round(r.iops_throttle_exempt,2) iops_throttle_exempt,
round(r.iombps_throttle_exempt,2) 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 = 'MYPDB'
ORDER BY r.begin_time;
内存管理
内存控制 需要满足以下条件:
- 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中SGA_TARGET的值50%
-
- SGA_MIN_SIZE值必须要小于PDB中SGA_TARGET值的50%
-
- 所有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的pga
PGA_AGGREGATE_TARGET是目标值,PGA_AGGREGATE_LIMIT是限制值。如果PGA使用量达到PGA_AGGREGATE_LIMIT这个限制值,会话就会报错。
PGA_AGGREGATE_TARGET设置指导如下:
- 必须小于或等于CDB$ROOT的PGA_AGGREGATE_TARGET
- 必须小于或等于CDB$ROOT的PGA_AGGREGATE_LIMIT的50%
- 必须小于或等于PDB的PGA_AGGREGATE_LIMIT的50%
PGA_AGGREGATE_LIMIT设置PDB的最大PGA使用量,设置指导如下:
- 必须小于或等于CDB$ROOT的PGA_AGGREGATE_LIMIT
- 必须大于或等于PDB的PGA_AGGREGATE_TARGET × 2
-- 注意,memory_target 设置为0
ALTER SESSION SET CONTAINER=PDB1;
ALTER SYSTEM SET PGA_AGGREGATE_LIMIT = 500M SCOPE = BOTH;
ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 300M SCOPE = BOTH;
监控PDB内存使用
- V$RSRCPDBMETRIC : 一个PDB对应一条记录,只保留最近一分钟的数据
- V$RSRCPDBMETRIC_HISTORY : 一个PDB对应61行记录,保留最近60分钟的数据
- DBA_HIST_RSRC_PDB_METRIC : AWR快照,保留时间基于AWR的保留时间
--监视最近一分钟指标
col pdb_name for a15
ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS';
SELECT r.con_id,
p.pdb_name,
r.begin_time,
r.end_time,
round(r.sga_bytes/1024/1024,2) sga_mb,
round(r.pga_bytes/1024/1024,2) pga_mb,
round(r.buffer_cache_bytes/1024/1024,2) buffer_cache_mb,
round(r.shared_pool_bytes/1024/1024,2) shared_pool_mb
FROM v$rsrcpdbmetric r,
cdb_pdbs p
WHERE r.con_id = p.con_id
ORDER BY p.pdb_name;
--监视最近1小时指标数据
SELECT r.con_id,
p.pdb_name,
r.begin_time,
r.end_time,
round(r.sga_bytes/1024/1024,2) sga_mb,
round(r.pga_bytes/1024/1024,2) pga_mb,
round(r.buffer_cache_bytes/1024/1024,2) buffer_cache_mb,
round(r.shared_pool_bytes/1024/1024,2) shared_pool_mb
FROM v$rsrcpdbmetric_history r,
cdb_pdbs p
WHERE r.con_id = p.con_id
AND p.pdb_name = 'MYPDB'
ORDER BY r.begin_time;
--基于快照监视
col begin_time for a20
col end_time for a20
ALTER SESSION SET NLS_TIMESTAMP_FORMAT='YYYY/MM/DD HH24:MI:SS';
SELECT r.snap_id,
r.con_id,
p.pdb_name,
r.begin_time,
r.end_time,
round(r.sga_bytes/1024/1024,2) sga_mb,
round(r.pga_bytes/1024/1024,2) pga_mb,
round(r.buffer_cache_bytes/1024/1024,2) buffer_cache_mb,
round(r.shared_pool_bytes/1024/1024,2) shared_pool_mb
FROM dba_hist_rsrc_pdb_metric r,
cdb_pdbs p
WHERE r.con_id = p.con_id
AND p.pdb_name = 'MYPDB'
ORDER BY r.begin_time;
CPU资源管理
从12.1开始,CDB级 resource plans 可用。 使用CDB级 resource plans,我们可以限制特定PDB的资源使用,例如:
- 限制特定PDB的CPU使用率
- 限制特定PDB可以使用的并行执行 Server 的个数
- 限制特定PDB的内存使用
- 限制连接到单个PDB的不同会话的资源使用情况
- 限制特定PDB生成的 I/O
12.2中引入的 Performance Profiles 和 Mandatory PDB Profiles 可以为一组PDB而不是单个PDB配置CDB resource plan 指标.
参考sql(假设为testdb创建 cdb resource plan,该计划包括gold/silver/bronze的每个pdb performance profiles的指标,然后将这些分配给pdb):
--1.创建过程 for cdb
exec DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
--2.创建资源管理计划 for cdb
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN(
plan => 'testdb_plan',
comment => 'CDB resource plan for testdb');
END;
/
--3.创建指标 gold/silver/bronze
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_CDB_PROFILE_DIRECTIVE(
plan => 'testdb_plan',
profile => 'gold',
shares => 3,
utilization_limit => 100,
parallel_server_limit => 100);
END;
/
--silver
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_CDB_PROFILE_DIRECTIVE(
plan => 'testdb_plan',
profile => 'silver',
shares => 2,
utilization_limit => 40,
parallel_server_limit => 40);
END;
/
--bronze
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_CDB_PROFILE_DIRECTIVE(
plan => 'testdb_plan',
profile => 'bronze',
shares => 1,
utilization_limit => 20,
parallel_server_limit => 20);
END;
/
--4.更新
BEGIN
DBMS_RESOURCE_MANAGER.UPDATE_CDB_PROFILE_DIRECTIVE(
plan => 'testdb_plan',
profile => 'bronze',
new_shares => 1,
new_utilization_limit => 10,
new_parallel_server_limit => 20);
END;
/
--5.(可选)使用UPDATE_CDB_AUTOTASK_DIRECTIVE过程更新缺省 autotask 指标,autotask指令适用于在root 维护窗口中运行的自动维护任务
BEGIN
DBMS_RESOURCE_MANAGER.UPDATE_CDB_AUTOTASK_DIRECTIVE(
plan => 'testdb_plan',
new_shares => 1,
new_utilization_limit => 60,
new_parallel_server_limit => 60);
END;
/
--6.使用VALIDATE_PENDING_AREA过程验证 pending area
exec DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();
--7. 使用SUBMIT_PENDING_AREA过程提交 pending area
exec DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
--8.启动 for cdb
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = 'testdb_plan' scope=both;
--9.指定
alter session set container=PDB1;
alter system set db_performance_profile='gold' scope=spfile;
--重启
alter pluggable database all close immediate;
alter pluggable database all open;
检查
--检查确认启用资源管理计划
set lines 168 pages 99
col plan for a32
col comments for a32
col status for a8
col mandatory for a10
select plan_id, plan, comments, status, mandatory from dba_cdb_rsrc_plans;
--查看资源计划配置
col PLUGGABLE_DATABASE for a32
col profile for a24
select plan,pluggable_database,shares,utilization_limit, PARALLEL_SERVER_LIMIT,profile from dba_cdb_rsrc_plan_directives;
set lines 168 pages 99
col plan for a28
col comments for a32
col status for a8
col mandatory for a10
col PLUGGABLE_DATABASE for a28
col profile for a12
select rp.plan_id, rp.plan, rp.status, rp.mandatory, pd.pluggable_database, pd.shares, pd.utilization_limit, pd.parallel_server_limit, pd.profile, rp.comments from dba_cdb_rsrc_plans rp, dba_cdb_rsrc_plan_directives pd
where rp.plan = pd.plan;
--检查pdb参数
col name for a20
col value for a20
select inst_id, name, con_id, value, ispdb_modifiable from gv$system_parameter2 where name = 'db_performance_profile' order by 1,2,3,4;
--pdb 指标细节
set lines 200
select p.name, shares, utilization_limit, PARALLEL_SERVER_LIMIT,profile from v$rsrc_plan r, v$pdbs p where r.con_id = p.con_id;
监控PDB使用
V$RSRCPDBMETRIC 视图使您能够以 毫秒为单位,以会话数量或过去一分钟的利用率来跟踪CPU指标。它为每个PDB提供实时指标,并且在您正在运行工作负载并希望持续监视CPU资源利用率的情况下非常有用。
使用此视图来比较具有其他PDB设置的PDB的最大可能CPU利用率和平均CPU利用率百分比
- CPU使用时间,CPU等待时间,CPU使用的平均会话数以及正在等待的会话数用于CPU分配。
- 可以查看PDB使用的CPU资源数量以及等待资源分配的时间。
- 可以查看每个PDB执行的会话数与活动会话总数的关系。
--根据PDB的CPU利用率跟踪CPU消耗
COLUMN PDB_NAME FORMAT A10
SELECT r.CON_ID, p.PDB_NAME, r.CPU_UTILIZATION_LIMIT, r.AVG_CPU_UTILIZATION
FROM V$RSRCPDBMETRIC r, CDB_PDBS p
WHERE r.CON_ID = p.CON_ID;
--监视PDB的CPU消耗和节流
COLUMN PDB_NAME FORMAT A10
SELECT r.CON_ID, p.PDB_NAME, r.CPU_CONSUMED_TIME, r.CPU_WAIT_TIME, r.NUM_CPUS
FROM V$RSRCPDBMETRIC r, CDB_PDBS p
WHERE r.CON_ID = p.CON_ID;
--监视PDB会话数跟踪CPU消耗和节流
COLUMN PDB_NAME FORMAT A10
SELECT r.CON_ID, p.PDB_NAME, r.RUNNING_SESSIONS_LIMIT, r.AVG_RUNNING_SESSIONS, r.AVG_WAITING_SESSIONS
FROM V$RSRCPDBMETRIC r, CDB_PDBS p
WHERE r.CON_ID = p.CON_ID;
参考
- Managing OS Resources Among PDBs Using PDB Perfromance Profiles - 12.2 New Feature (文档 ID 2171135.1)
- https://www.cnblogs.com/binliubiao/p/13328593.html
- https://docs.oracle.com/en/database/oracle/oracle-database/12.2/admin/using-oracle-resource-manager-for-pdbs-with-sql-plus.html#GUID-2708E76D-E18B-4586-920A-BD4B904AE14D