12c 新特性之 Limiting the Size of the Program Global Area

huangxuemail發表於2016-07-13
在自動PGA管理模式下,Oracle使用動態引數PGA_ARRGREATE_TARGET來控制PGA中Work Areas大小的分配。不過,PGA記憶體的分配是可以超過PGA_ARRGREATE_TARGET設定的值的,原因如下:

1.引數PGA_ARRGREATE_TARGET實際上只作為一個目標,而不是實際的限制。
2.引數PGA_ARRGREATE_TARGET僅僅能夠限制那些可調的記憶體(work areas)。

PGA記憶體分配過多可能導致伺服器記憶體不足進而產生換頁操作,如果發生大量換頁,系統將變得響應緩慢效能不穩,如果是RAC還可能引起腦裂。從12c開始,如果遇到這種情況,可以考慮使用PGA_AGGREGATE_LIMIT引數來徹底限制PGA記憶體的過度分配問題。

引數PGA_AGGREGATE_LIMIT允許你對PGA記憶體的使用指定一個硬性的限制。如果PGA記憶體的使用超過了引數設定的值,Oracle會根據下面的順序中止或終結耗費了大部分不可調節PGA記憶體的程式或會話:

1.耗費了大部分不可調節PGA記憶體的會話呼叫將被中止(注意是會話呼叫被中止,而不是會話或程式)。
2.在上面的情況被處理後,如果PGA記憶體仍然超過PGA_AGGREGATE_LIMIT值,則耗費大部分PGA記憶體的程式和會話將被終止(相當於被kill掉)。

Oracle會將並行執行的查詢作為一個整體單位進行處理。

預設情況下,PGA_AGGREGATE_LIMIT引數至少被設定為大於2GB,或者PGA_ARRGREATE_TARGET值的2倍,或者PROCESSES引數值的3倍,三者之中取最大值。無論怎樣,它都不應該超過實體記憶體減去SGA記憶體大小的120%,該引數的預設值會被記錄在alert log中。

無論是否使用自動記憶體管理,你都可以設定PGA_AGGREGATE_LIMIT,該引數是動態引數,修改後即生效,不需要重啟資料庫。
PGA_AGGREGATE_LIMIT值可以是K,M,G。設定為0則禁止PGA記憶體分配的硬限制。


Example:
ALTER SYSTEM SET PGA_AGGREGATE_LIMIT=12G;

以下內容來自我的測試環境,pga_aggregate_target設定為500M,根據上面的演算法,500M*2=1000M,300*3=900M。 這兩個條件均還沒有超過2G,所以pga_aggregate_limit預設值為2G。


SQL> show parameter pga
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_limit                  big integer 2G
pga_aggregate_target                 big integer 500M


SQL> show parameter processes
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
processes                            integer     300


現在我將processes引數擴大至1000,可以看到根據演算法pga_aggregate_limit被修改成了3GB。
SQL> alter system set processes=1000 scope=spfile;
System altered.


SQL> startup force
ORACLE instance started.


Total System Global Area 2147483648 bytes
Fixed Size                  3712904 bytes
Variable Size            1056966776 bytes
Database Buffers         1073741824 bytes
Redo Buffers               13062144 bytes
Database mounted.
Database opened.
SQL> show parameter processes
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
processes                            integer     1000

SQL> show parameter pga
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_limit                  big integer 3000M
pga_aggregate_target                 big integer 500M


再來看我的另一個測試環境,由於pga_aggregate_target值較大,所以該引數預設被設定成了pga_aggregate_target的2倍大小。
SQL> show parameter pga
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_limit                  big integer 12880M
pga_aggregate_target                 big integer 6440M


SQL> show parameter processes


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
processes                            integer     300




結論就是pga_aggregate_limit引數的預設值取自2G,pga_aggregate_target*2,processes*3這三個值中的最大值。


原文來自
Oracle Database Performance Tuning Guide-->Tuning the Program Global Area-->Limiting the Size of the Program Global Area

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

相關文章