Oracle 12c系列(四)|資源隔離之IO、記憶體、CPU

shilei1發表於2018-05-13
沃趣科技資料庫技術專家  姚崇


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

一、IO 資源隔離

Oracle 12c系列(四)|資源隔離之IO、記憶體、CPU

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;

二、記憶體資源隔離

Oracle 12c系列(四)|資源隔離之IO、記憶體、CPU

在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的記憶體使用情況

Oracle 12c系列(四)|資源隔離之IO、記憶體、CPU

歷史使用資訊可以參考檢視:DBA_HIST_RSRC_PDB_METRIC

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

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

三、CPU資源隔離

Oracle 12c系列(四)|資源隔離之IO、記憶體、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

Oracle 12c系列(四)|資源隔離之IO、記憶體、CPU

除了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(''); 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;


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/196700/viewspace-2154402/,如需轉載,請註明出處,否則將追究法律責任。

相關文章