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
3)建立PDB Performance profileBEGIN 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
4)更新預設的PDBdirectiveBEGIN DBMS_RESOURCE_MANAGER.CREATE_CDB_PROFILE_DIRECTIVE( plan => 'newcdb_plan', profile => 'bronze', shares => 1, utilization_limit => 20, parallel_server_limit => 20); END; /
5)更新自動PDB directiveBEGIN 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
6)校驗pending area7)提交pending areaexecDBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();
8)啟用CDB資源管理execDBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
在CDB$ROOT中
9)在PDB中設定performanceprofileALTERSYSTEM 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中一個個單獨設定並重啟
10)檢查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了。
丨指令中的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(''); 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資源隔離技術之記憶體隔離記憶體
- docker的資源控制(CPU、記憶體、IO)Docker記憶體
- Oracle 12c系列(三)|儲存資源隔離 Flex DiskgroupOracleFlex
- 如何使用 Docker 來限制 CPU、記憶體和 IO等資源?Docker記憶體
- CPU、記憶體、磁碟IO之間的關係記憶體
- 混部之殤-論雲原生資源隔離技術之CPU隔離(一)
- Cgroups控制cpu,記憶體,io示例記憶體
- ORACLE 記憶體管理 之四 SGAOracle記憶體
- 效能調優(cpu/IO/JVM記憶體分析)JVM記憶體
- 由淺入深 docker 系列: (5) 資源隔離Docker
- 記憶體與IO,磁碟IO,網路IO記憶體
- KVM之十一:調整cpu和記憶體記憶體
- JavaScript之記憶體洩漏【四】JavaScript記憶體
- Docker實踐(5)—資源隔離Docker
- Oracle 12c 多租戶專題|12cR2中PDB記憶體資源管理Oracle記憶體
- 統計和分析系統效能【IO CPU 記憶體】的工具集合記憶體
- 億級流量架構之資源隔離思路與方法架構
- CPU快取記憶體快取記憶體
- 記憶體CPU監控記憶體
- Docker之CPU和記憶體磁碟設定(八)Docker記憶體
- 為容器指定cpu和記憶體資源(k8s官翻)記憶體K8S
- 資源供給:記憶體和虛擬記憶體記憶體
- 資源記憶體佔用記憶體
- Oracle 之 配置HugePages記憶體Oracle記憶體
- io記憶體,io埠,彙編 in out 指令記憶體
- Akka系列(四):Akka中的共享記憶體模型記憶體模型
- Akka 系列(四):Akka 中的共享記憶體模型記憶體模型
- 【JVM】JVM系列之記憶體模型(六)JVM記憶體模型
- 資料庫的四種隔離級別資料庫
- win10系統中Windows音訊裝置圖形隔離佔用CPU和記憶體高如何解決Win10Windows音訊記憶體
- 資源供給:再談記憶體和虛擬記憶體記憶體
- 【功能筆記】Ubuntu檢視系統資源佔用(記憶體,cpu和程式) {轉載}筆記Ubuntu記憶體
- 利用Kubernetes名稱空間來管理記憶體和CPU資源(二)記憶體
- 利用Kubernetes名稱空間來管理記憶體和CPU資源(一)記憶體
- Linux下如何檢視哪些程式佔用的CPU記憶體資源最多Linux記憶體
- Oracle記憶體結構(四)----如何獲得Oracle各記憶體段的內部資訊(轉)Oracle記憶體
- JVM記憶體系列JVM記憶體
- 談談CPU快取記憶體快取記憶體