1. 程式人生 > 實用技巧 >Oracle- 資源隔離(IO、記憶體、CPU)

Oracle- 資源隔離(IO、記憶體、CPU)

資源隔離-IO、記憶體、CPU

​ 伺服器主機提供IO、記憶體、CPU、儲存空間等資源為資料庫使用,Oracle使用Flex Diskgroup為資料庫提供儲存空間並做了相應的資源隔離。下面看下Oracle是如何為不同的PDB做IO、記憶體、CPU限制的。

IO 資源管理

IO對資料庫效能至關重要。如果某個PDB產生了大量的IO,那可能導致CDB中的其它PDB也受影響。

12cR2中,引入了兩個引數MAX_IOPS和MAX_MBPS來限制PDB的物理IO。這兩個引數只作用於PDB,不對CDB和非多租戶環境生效。另外,這兩個引數不限制redo log的寫入(LGWR程序)和buffer cache髒塊寫入磁碟(DBWR程序)。

  • MAX_IOPS引數限制每個可插拔資料庫(PDB)每秒IO操作次數

  • MAX_MBPS引數限制每個可插拔資料庫(PDB)每秒IO吞吐

這兩個引數可以在PDB中設定。如果引數在CDB中設定,則該CDB中的所有PDB將繼承CDB中的引數值。該引數不能在非CDB環境中設定。

預設情況下,這兩個引數都為0。如果在PDB中這兩個引數為0,CDB$ROOT中也為0,那對於PDB來講,沒有IO限制。

有些情況下,雖然物理IO限制已經達到,但是一些關鍵IO仍然允許,比如:對控制檔案的訪問或對口令檔案的訪問,但是這些關鍵IO也是計入到IO數統計裡的。不推薦設定MAX_IOPS的值小於100,MAX_MBPS的值小於25。

引數配置

下面是在CDB級別設定MAX_IOPS 和MAX_MBPS引數,值是對所有PDB。

--設定引數值
SQL>ALTER SYSTEM SET max_iops=100 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=100 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;

監控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保留期保留

監視PDB實時的IO使用

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;

監視PDB最近N個小時的使用情況

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 = upper('pdbcndba')
ORDER BY r.begin_time;

基於AWR快照監視PDB的使用情況

可以使用DBA_HIST_RSRC_PDB_METRIC來計算一個PDB合理的IO限制。

當計算IO限制值時,可以參考以下列:IOPS、IOMBPS、IOPS_THROTTLE_EXEMPT和IOMBPS_THROTTLE_EXEMPT。

-- 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;            

記憶體資源管理

在12cR2的多租戶環境中,PDB的SGA使用情況可能會很不均衡,有些PDB佔用了大量的SGA記憶體,導致某些PDB得不到足夠的SGA,進而影響效能。在12cR2的多租戶環境中,可以控制和監控每個PDB的主機的記憶體情況。

滿足條件

要控制每個PDB記憶體使用,下面兩個條件必須滿足:

  • CDB$ROOT中初始化引數NONCDB_COMPATIBLE保持為預設的FALSE。
  • CDB$ROOT中初始化引數MEMORY_TARGET沒有設定或設定為0,即關閉記憶體自動管理

管理PDB記憶體資源

管理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的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這個限制值,會話就會報錯。

引數配置標準

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

設定PDB的記憶體引數

show parameter NONCDB_COMPATIBLE
show parameter MEMORY_TARGET
alter system set MEMORY_TARGET=0 SCOPE = BOTH;
show parameter MEMORY_TARGET

-- 連線對應PDB並配置
alter session set container=PDB1;

ALTER SYSTEM SET SGA_TARGET = 500M SCOPE = BOTH;
ALTER SYSTEM SET SGA_MIN_SIZE = 100M SCOPE = BOTH;

ALTER SYSTEM SET PGA_AGGREGATE_LIMIT  = 500M SCOPE = BOTH;
ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 300M SCOPE = BOTH;

控制PDB記憶體管理的初始化引數

當您使用PDB作為當前容器設定以下初始化引數時,這些引數將控制當前PDB的記憶體使用情況。當為PDB設定了一個或多個這些引數時,請確保CDB和其他PDB具有足夠的記憶體用於其操作。

DB_CACHE_SIZE:

為PDB設定最小保證緩衝區快取空間。

必須滿足以下要求:

• 它必須小於或等於DB_CACHE_SIZECDB根目錄設定的50%。

• DB_CACHE_SIZE所有PDB 的設定總和必須小於或等於DB_CACHE_SIZECDB根目錄中設定的50%。

如果SGA_TARGET初始化引數在CDB根目錄中設定為非零值,則這些要求不適用。

當SGA_TARGET初始化引數設定為非零,下列要求必須滿足:

• DB_CACHE_SIZE的值加上SHARED_POOL_SIZE在PDB必須小於或等於該PDB的50%SGA_TARGET值。

• PDB中的DB_CACHE_SIZE加號值SHARED_POOL_SIZE必須小於或等於SGA_TARGETCDB級別值的50%。

• CDB中所有PDB 的DB_CACHE_SIZE加和總和SHARED_POOL_SIZE必須小於或等於SGA_TARGETCDB級別的50%。

SHARED_POOL_SIZE:

設定PDB的最小保證共享池空間。

必須滿足以下要求:

•它必須小於或等於SHARED_POOL_SIZECDB根目錄設定的50%。

•SHARED_POOL_SIZE所有PDB 的設定總和必須小於或等於SHARED_POOL_SIZECDB根目錄中設定的50%。

如果SGA_TARGET初始化引數在CDB根目錄中設定為非零值,則這些要求不適用。

當SGA_TARGET初始化引數設定為非零,下列要求必須滿足:

•DB_CACHE_SIZE的值加上SHARED_POOL_SIZE在PDB必須小於或等於該PDB的50%SGA_TARGET值。

•PDB中的DB_CACHE_SIZE加號值SHARED_POOL_SIZE必須小於或等於SGA_TARGETCDB級別值的50%。

•CDB中所有PDB 的DB_CACHE_SIZE加和總和SHARED_POOL_SIZE必須小於或等於SGA_TARGETCDB級別的50%。

PGA_AGGREGATE_LIMIT:

設定PDB的最大PGA尺寸。

必須滿足以下要求:

•它必須小於或等於PGA_AGGREGATE_LIMITCDB根目錄中的設定。

•它必須大於或等於PGA_AGGREGATE_TARGETPDB中設定的兩倍。

PGA_AGGREGATE_TARGET:

設定PDB的目標聚合PGA大小。

必須滿足以下要求:

•它必須小於或等於PGA_AGGREGATE_TARGETCDB級別設定的值。

•它必須小於或等於PGA_AGGREGATE_LIMIT在CDB級設定的初始化引數值的50%。

•它必須小於或等於PGA_AGGREGATE_LIMITPDB中設定的值的50%。

SGA_MIN_SIZE:

設定PDB的最小SGA大小。

必須滿足以下要求:

•它必須小於或等於SGA_TARGETCDB根目錄設定的50%。

•它必須小於或等於SGA_TARGETPDB中設定的50%。

•SGA_MIN_SIZE所有PDB 的設定總和必須小於或等於SGA_TARGETCDB根目錄中設定的50%。

如果SGA_TARGET初始化引數未設定或0在CDB根目錄中設定為(零),則這些要求不適用。

最佳做法是將SGA_MIN_SIZE所有PDB 的值的總和限制為CDB的SGA大小的50%或更少。

SGA_TARGET:

設定PDB的最大SGA大小。

SGA_TARGET只有在SGA_TARGET初始化引數在CDB根目錄中設定為非零值時,才會強制執行PDB中的設定。SGA_TARGETPDB中的設定必須小於或等於SGA_TARGETCDB根中的設定。

下面說明記憶體元件在資料庫中設定時需要滿足的條件。

如下引數可以控制pdb的記憶體使用,如果當前pdb設定了引數,那麼就控制當前pdb使用的記憶體大小,如果一個或者多個引數被設定了,請確保其他pdb或者cdb有足夠的記憶體使用。

Initialization Parameter Description
DB_CACHE_SIZE Sets the minimum, guaranteed buffer cache space for the PDB.The following requirements must be met:It must be less than or equal to 50% of the setting for the DB_CACHE_SIZE in the CDB root.The sum of the DB_CACHE_SIZE settings for all PDBs must be less than or equal to 50% of the setting for the DB_CACHE_SIZE in the CDB root.These requirements do not apply if the SGA_TARGET initialization parameter is set to a non-zero value in the CDB root.When the SGA_TARGET initialization parameter is set to a non-zero, the following requirements must be met:The values of DB_CACHE_SIZE plus SHARED_POOL_SIZE in a PDB must be less than or equal to 50% of the PDB’s SGA_TARGET value.The values of DB_CACHE_SIZE plus SHARED_POOL_SIZE in a PDB must be less than or equal to 50% of the SGA_TARGET value at the CDB level.The sum of DB_CACHE_SIZE plus SHARED_POOL_SIZE across all the PDBs in a CDB must be less than or equal to 50% of the SGA_TARGET value at the CDB level.
SHARED_POOL_SIZE Sets the minimum, guaranteed shared pool space for the PDB.The following requirements must be met:It must be less than or equal to 50% of the setting for the SHARED_POOL_SIZE in the CDB root.The sum of the SHARED_POOL_SIZE settings for all PDBs must be less than or equal to 50% of the setting for the SHARED_POOL_SIZE in the CDB root.These requirements do not apply if the SGA_TARGET initialization parameter is set to a non-zero value in the CDB root.When the SGA_TARGET initialization parameter is set to a non-zero, the following requirements must be met:The values of DB_CACHE_SIZE plus SHARED_POOL_SIZE in a PDB must be less than or equal to 50% of the PDB’s SGA_TARGET value.The values of DB_CACHE_SIZE plus SHARED_POOL_SIZE in a PDB must be less than or equal to 50% of the SGA_TARGET value at the CDB level.The sum of DB_CACHE_SIZE plus SHARED_POOL_SIZE across all the PDBs in a CDB must be less than or equal to 50% of the SGA_TARGET value at the CDB level.
PGA_AGGREGATE_LIMIT Sets the maximum PGA size for the PDB.The following requirements must be met:It must be less than or equal to the setting for the PGA_AGGREGATE_LIMIT in the CDB root.It must be greater than or equal to two times the setting for the PGA_AGGREGATE_TARGET in the PDB.
PGA_AGGREGATE_TARGET Sets the target aggregate PGA size for the PDB.The following requirements must be met:It must be less than or equal to the PGA_AGGREGATE_TARGET value set at the CDB level.It must be less than or equal to 50% of the PGA_AGGREGATE_LIMIT initialization parameter value set at the CDB level.It must be less than or equal to 50% of the PGA_AGGREGATE_LIMIT value set in the PDB.
SGA_MIN_SIZE Sets the minimum SGA size for the PDB.The following requirements must be met:It must be less than or equal to 50% of the setting for the SGA_TARGET in the CDB root.It must be less than or equal to 50% of the setting for the SGA_TARGET in the PDB.The sum of the SGA_MIN_SIZE settings for all PDBs must be less than or equal to 50% of the setting for the SGA_TARGET in the CDB root.These requirements do not apply if the SGA_TARGET initialization parameter is not set or is set to 0 (zero) in the CDB root.The best practice is to limit the sum of the SGA_MIN_SIZE values for all PDBs to 50% or less of the SGA size of the CDB.
SGA_TARGET Sets the maximum SGA size for the PDB.The SGA_TARGET setting in the PDB is enforced only if the SGA_TARGET initialization parameter is set to a non-zero value in the CDB root. The SGA_TARGET setting in the PDB must be less than or equal to the SGA_TARGET setting in the CDB root.

監控PDB的記憶體使用

以下檢視用於監控PDB的資源使用

  • V$RSRCPDBMETRIC : 一個PDB對應一條記錄,只保留最近一分鐘的資料
  • V$RSRCPDBMETRIC_HISTORY : 一個PDB對應61行記錄,保留最近60分鐘的資料
  • DBA_HIST_RSRC_PDB_METRIC : AWR快照,保留時間基於AWR的保留時間

監視記憶體SQL語句

監視最近一分鐘指標資料
SET LINESIZE 150
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'; 

-- Last sample per PDB.
SELECT r.con_id,
       p.pdb_name,
       r.begin_time,
       r.end_time,
       r.sga_bytes,
       r.pga_bytes,
       r.buffer_cache_bytes,
       r.shared_pool_bytes
FROM   v$rsrcpdbmetric r,
       cdb_pdbs p
WHERE  r.con_id = p.con_id
ORDER BY p.pdb_name;

SGA_BYTES : PDB當前SGA大小

BUFFER_CACHE_BYTES : PDB當前buffer cache大小

SHARED_POOL_BYTES : PDB當前shared pool大小

PGA_BYTES : PDB當前PGA大小

監視最近一小時指標資料
-- Last hours samples for PDB1
SELECT r.con_id,
       p.pdb_name,
       r.begin_time,
       r.end_time,
       r.sga_bytes,
       r.pga_bytes,
       r.buffer_cache_bytes,
       r.shared_pool_bytes
FROM   v$rsrcpdbmetric_history r,
       cdb_pdbs p
WHERE  r.con_id = p.con_id
AND    p.pdb_name = 'PDB1'
ORDER BY r.begin_time;
基於快照時間資源指標資料
-- All AWR snapshot information for PDB1.
SELECT r.snap_id,
       r.con_id,
       p.pdb_name,
       r.begin_time,
       r.end_time,
       r.sga_bytes,
       r.pga_bytes,
       r.buffer_cache_bytes,
       r.shared_pool_bytes
FROM   dba_hist_rsrc_pdb_metric r,
       cdb_pdbs p
WHERE  r.con_id = p.con_id
AND    p.pdb_name = 'PDB1'
ORDER BY r.begin_time;

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初始化引數,就可以使用相同的效能配置。

Oracle資源管理器(Oracle Database Resource Manager,以下簡稱DBRM)管理資料庫資源,為不同的會話分配不同的資料庫資源。DBRM管理的資源主要包括CPU時間。

給PDB分配資源配額

要在PDB之間分配資源,請為每個PDB或每個PDB效能配置檔案分配一個共享值。較高的份額值可為PDB或使用PDB效能配置檔案的PDB提供更多的保證資源。

使用DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN_DIRECTIVE為PDB指定共享值,shares引數指定PDB的份額值。

使用DBMS_RESOURCE_MANAGER.CREATE_CDB_PROFILE_DIRECTIVE為PDB效能配置檔案指定共享值,shares引數指定PDB效能配置檔案的份額值。

多個PDB可以使用相同的PDB效能配置檔案profile。

指令中的share引數意義

下圖顯示了一個在CDB資源計劃中為他們指定了共享值的三個PDB的示例

顯示shares總數為7(3加3加1)。salespdb和servicespdbPDB是資源的每個保證資源的3/7,而hrpdbPDB是保證資源的1/7。但是,如果沒有資源爭用,任何PDB都可以使用比保證的資源更多的資源。

Resource Resource Allocation
CPU The salespdb and servicespdb PDBs can consume the same amount of CPU resources. The salespdb and servicespdb PDBs are each guaranteed three times more CPU resource than the hrpdb PDB.See "CPU" for more information about this resource.
Parallel execution servers Queued parallel queries from the salespdb and servicespdb PDBs are selected equally. Queued parallel queries from the salespdb and servicespdb PDBs are selected three times as often as queued parallel queries from the hrpdb PDB.See "Degree of Parallelism Limit" for more information about this resource.

PDB的資源限制,我們既可以設定CDB resource plan同樣也可以設定pdb的初始化引數控制,兩者皆可。當PDB資料很多時,更建議使用CDB resource plan結合pdb performance profile使用。

引數指令

PDB指令

當一個PDB從CDB拔出時,PDB的指令被保留。如果同一個PDB被插回到CDB中

指令 屬性值
shares 1
utilization_limit 100
parallel_server_limit 100
CDB 資源計劃中的預設指令

上圖說明預設的pdb指令share值為1,utilization_limit為50%,parallel_server_limit 是50%,當pdb沒有指定指令時,例如marketingpdb和testingpdb就會使用預設的performance profile,因此marketingpdb和testingpdb每個都拿到1份額和cpu使用的50%。

一個指令可以給多個PDB使用,但是一個PDB不能用多個指令。

CDB Resource Plans

建立PDB效能配置的CDB資源計劃

建立CDB資源計劃:newcdb_plan。裡面包括PDB performance profile,gold、silver、bronze。

建立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.

建立一個新的CDB資源計劃

在CDB$ROOT中建立計劃的名字是newcdb_plan的資源計劃

BEGIN
  DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN(
    plan    => 'newcdb_plan',
    comment => 'CDB resource plan for newcdb');
END;
/
建立PDB Performance profile

在CDB$ROOT中建立profile

建立PDB profile (gold)
-- 建立PDB profile, gold
BEGIN
  DBMS_RESOURCE_MANAGER.CREATE_CDB_PROFILE_DIRECTIVE(
    plan                  => 'newcdb_plan', 
    profile               => 'gold', 
    shares                => 3, 
    utilization_limit     => 100,
    parallel_server_limit => 100);
END;
/
建立PDB Profile (silver)
-- 建立PDB profile, silver
BEGIN
  DBMS_RESOURCE_MANAGER.CREATE_CDB_PROFILE_DIRECTIVE(
    plan                  => 'newcdb_plan', 
    profile               => 'silver', 
    shares                => 2, 
    utilization_limit     => 40,
    parallel_server_limit => 40);
END;
/
建立PDB Profile (bronze)
--建立PDB profile, bronze
BEGIN
  DBMS_RESOURCE_MANAGER.CREATE_CDB_PROFILE_DIRECTIVE(
    plan                  => 'newcdb_plan', 
    profile               => 'bronze', 
    shares                => 1, 
    utilization_limit     => 20,
    parallel_server_limit => 20);
END;
/
更新資源計劃
更新預設的CDB directive

如果PDB的當前預設CDB資源計劃指令不符合您的要求,則使用該UPDATE_CDB_DEFAULT_DIRECTIVE過程更新

-- 如果PDB的當前預設CDB資源計劃指令不符合您的要求,則使用該UPDATE_CDB_DEFAULT_DIRECTIVE過程更新指令
BEGIN
  DBMS_RESOURCE_MANAGER.UPDATE_CDB_DEFAULT_DIRECTIVE(
    plan                      => 'newcdb_plan', 
    new_shares                => 1, 
    new_utilization_limit     => 10,
    new_parallel_server_limit => 10);
END;
/
更新指定profile的資源計劃
BEGIN
  DBMS_RESOURCE_MANAGER.UPDATE_CDB_PROFILE_DIRECTIVE(
    plan                      => 'newcdb_plan', 
    profile                   => 'bronze'
    new_shares                => 1, 
    new_utilization_limit     => 10,
    new_parallel_server_limit => 10);
END;
/
更新當前自動任務CDB資源計劃指令

如果當前自動任務CDB資源計劃指令不符合您的要求,則使用該UPDATE_CDB_AUTOTASK_DIRECTIVE過程更新指令, autotask指令適用於在root 維護視窗中執行的自動維護任務

BEGIN
  DBMS_RESOURCE_MANAGER.UPDATE_CDB_AUTOTASK_DIRECTIVE(
    plan                      => 'newcdb_plan', 
    new_shares                => 1, 
    new_utilization_limit     => 60,
    new_parallel_server_limit => 60);
END;
/
校驗pending area
exec DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();
提交pending area
exec DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
啟用CDB資源管理
-- 在CDB$ROOT中配置
alter session set container=CDB$ROOT;
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = 'newcdb_plan' scope=both;
檢查確認啟用資源管理計劃
alter session set container=cdb$root; 
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中設定db_performance_profile
alter session set container=PDB1;
ALTER SYSTEM SET DB_PERFORMANCE_PROFILE=gold SCOPE=spfile;

alter session set container=PDB2;
alter system set db_performance_profile='silver' scope=spfile;

alter session set container=PDB3;
alter system set db_performance_profile='bronze' scope=spfile;
重啟PDB
-- 所有PDB
ALTER PLUGGABLE DATABASE CLOSE IMMEDIATE INSTANCES=all;
ALTER PLUGGABLE DATABASE OPEN INSTANCES=all;

也可以在PDB中一個個單獨設定並重啟

alter session set container=PDB1;
alter system set db_performance_profile=gold scope=spfile;
alter pluggable database close immediate;
alter pluggable database open;
檢查PDB的引數
alter session set container=CDB$ROOT;
col value for a20
col name from a50
set line 200

select inst_id, name, con_id, value, ispdb_modifiable 
from gv$system_parameter2 where name = 'db_performance_profile' order by 1,2,3,4;

   INST_ID NAME   CON_ID VALUE      ISPDB
---------- -------------------------------------------------- ---------- -------------------- -----
 1 db_performance_profile       0      TRUE
 1 db_performance_profile       3 GOLD      TRUE
 
alter session set container=cdb$root; 
set lines 168 pages 99
col name for a24
col value for a24
select p.inst_id, p.name, c.name, p.value, p.ispdb_modifiable, c.con_id 
from gv$system_parameter2 p, gv$containers c 
where p.con_id = c.con_id and p.inst_id = c.inst_id and p.name = 'db_performance_profile'
order by p.con_id ;
檢查PDB的資源管理設定
alter session set container=CDB$ROOT;
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中設定db_performance_profile初始化引數即可讓當前的PDB使用哪個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的CPU使用情況

V$RSRCPDBMETRIC檢視使您能夠以毫秒為單位,以會話數量或過去一分鐘的利用率來跟蹤CPU指標。它為每個PDB提供實時指標,並且在您正在執行工作負載並希望持續監視CPU資源利用率的情況下非常有用。

PDB的CPU使用率是使用PDB的CDB的活動CDB資源計劃管理的。

使用此檢視來比較具有其他PDB設定的PDB的最大可能CPU利用率和平均CPU利用率百分比

  • CPU使用時間,CPU等待時間,CPU使用的平均會話數以及正在等待的會話數用於CPU分配。
  • 可以檢視PDB使用的CPU資源數量以及等待資源分配的時間。
  • 可以檢視每個PDB執行的會話數與活動會話總數的關係。

根據PDB的CPU利用率跟蹤CPU消耗

要根據CPU利用率跟蹤CPU消耗,請使用CPU_UTILIZATION_LIMIT和AVG_CPU_UTILIZATION列。AVG_CPU_UTILIZATION列出PDB消耗的伺服器CPU的平均百分比。CPU_UTILIZATION_LIMIT表示PDB可以使用的伺服器CPU的最大百分比。此限制是使用UTILIZATION_LIMIT指令屬性設定

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消耗和節流

使用CPU_CONSUMED_TIME和CPU_TIME_WAIT列來跟蹤每個PDB的CPU消耗和限制(以毫秒為單位)。該列NUM_CPUS表示Resource Manager正在管理的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消耗和節流

跟蹤會話的數量方面的CPU消耗和限制,使用RUNNING_SESSIONS_LIMIT,AVG_RUNNING_SESSIONS和AVG_WAITING_SESSIONS列。RUNNING_SESSIONS_LIMIT列出可以隨時執行的特定PDB的最大會話數。此限制由UTILIZATION_LIMIT您為PDB設定的指令屬性定義。AVG_RUNNING_SESSIONS列出正在使用CPU的會話的平均數量,並AVG_WAITING_SESSIONS列出正在等待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;

參考文件

1) 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

2)Managing OS Resources Among PDBs Using PDB Perfromance Profiles - 12.2 New Feature (文件 ID 2171135.1)