數據庫參數 PGA_AGGREGATE_LIMIT 限制進程大小


如何使用新參數 PGA_AGGREGATE_LIMIT 限制數據庫進程可以增長到的最大大小。

在自動化 PGA 內存管理模式下,Oracle 數據庫通過動態控制分配到工作區的 PGA 內存量來嘗試遵從 PGA_AGGREGATE_TARGET 值。
但是,有時因為以下原因,PGA 內存使用量可能會超過 PGA_AGGREGATE_TARGET 設置:
PGA_AGGREGATE_TARGET 設置起到的是目標的作用,而非限制。
PGA_AGGREGATE_TARGET 僅控制可優化部分內存的分配。
使用大量 PGA 可能會導致高交換率。出現這種情況時,系統可能會無法響應,並且不穩定。這種時候需要考慮使用 PGA_AGGREGATE_LIMIT 初始化參數限制整體 PGA 使用量。

12c 引入了新的參數 PGA_AGGREGATE_LIMIT 以允許數據庫管理員限制 pga 內存使用總量。
使用 PGA_AGGREGATE_LIMIT初始化參數可以為 PGA 內存使用量指定硬性限制。如果超過了 PGA_AGGREGATE_LIMIT 值,
則 Oracle 數據庫按照以下順序,中斷或者終止使用了最多不可優化 PGA 內存的會話或進程:
中止使用最多不可優化 PGA 內存的會話調用。
如果 PGA 內存使用量仍超過 PGA_AGGREGATE_LIMIT,則終止使用了最多不可優化 PGA 內存的會話和進程。
使用最多不可優化內存會話的調用將被中止。並行查詢將被視為一個單元。如果 PGA 內存使用總量仍超過限制,則將終止使用最多不可優化內存的會話。
不會對除作業隊列進程之外的 SYS 進程和后台進程執行這一部分中所述的任何操作。取而代之的操作是,
如果它們使用了最多不可優化內存,則會定期將其 PGA 使用量的簡短摘要寫入到跟蹤文件中。
顯式設置 PGA_AGGREGATE_LIMIT 與將其設置為默認值,在行為上沒有差別。
PGA_AGGREGATE_LIMIT 初始化參數動態設置為 PGA 內存的實例范圍硬性限制。由於該參數根據內存情況的變化做出響應,您無需顯式設置參數值。默認情況下,PGA_AGGREGATE_LIMIT 設置為以下值中的較大者:

2 GB
200% 的 PGA_AGGREGATE_TARGET
(PROCESSES 初始化參數設置值)* 3 MB
該參數不會超過物理內存大小減去總 SGA 大小的 120%。

如果指定了值 0,則表示實例所使用的 PGA 內存總量沒有限制。
PGA_AGGREGATE_LIMIT 初始化參數可以動態設置;並不需要數據庫重新啟動。可以設置 PGA_AGGREGATE_LIMIT 的值,不論是否使用了自動內存管理。

后台進程 CKPT 每三秒檢查一次內存用量是否超過了 PGA_AGGREGATE_LIMIT 初始化參數的值。如果達到或超過了限制,
則此進程中斷使用最多不可優化 PGA 內存的會話調用。如果這些會話仍沒有釋放足夠內存,則終止它們。
請注意,由於 pga 值僅每三秒檢查一次,因此 pga 內存有可能超過 PGA_AGGREGATE_LIMIT。此外,如果在此期間該 pga 值減少到限制之下,
則將不會捕獲在這三秒間隔內超過限制的情況。如果進程在三秒的間隔內快速分配然后釋放內存,則可能會出現這種情況。

如果達到了 PGA_AGGREGATE_LIMIT 值,則將報告如下錯誤。

1 ORA-04036: PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT
2 Cause: Private memory across the instance exceeded the limit specified in the PGA_AGGREGATE_LIMIT initialization parameter. The largest sessions using Program Global Area (PGA) memory were interrupted to get under the limit.
3 Action: Increase the PGA_AGGREGATE_LIMIT initialization parameter or reduce memory usage.

 

示例:
此示例將展示使用 pl/sql 填充內存中數組可以超過 pga_aggregate_limit 的值。

首先請查看當前 pga_aggregate_target。由於 pl/sql 內存區不是 pga 目標控制的可優化區域,進程 pga 將超過此值。
-- V$PGASTAT 的 PGA 統計信息:
-- 顯示自實例啟動以來分配的最大 pga 總量

復制代碼
1 select name, ROUND(value/1024/1024) as Mbytes from v$pgastat
2 where name in ('maximum PGA allocated','aggregate PGA target parameter','aggregate PGA auto target');
3 NAME Mbytes
4 ---------------------- ------------
5 aggregate PGA target p 208
6 arameter
7 aggregate PGA auto tar 138
8 get
9 maximum PGA allocated 119
復制代碼

 

請注意 pga_aggregate_limit 顯式設置為 512M。

復制代碼
 1 select con_id, name as Parameter, value/1024/1024 as Mbytes from V$SYSTEM_PARAMETER
 2 where name in ('pga_aggregate_target','memory_target','memory_max_target','sga_max_size','sga_target','pga_aggregate_limit','processes')
 3 order by name;
 4 CON_ID PARAMETER Mbytes
 5 ------ ------------------------------ ------------
 6 0 memory_max_target 600
 7 0 memory_target 600
 8 0 pga_aggregate_limit 512
 9 0 pga_aggregate_target 0
10 0 processes 0
11 0 sga_max_size 600
12 0 sga_target 0
復制代碼

 

運行這個過程的會話收到此錯誤:

1 ERROR at line 1:
2 ORA-04036: PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT


針對 V$PROCESS 的查詢顯示進程在 ckpt進程捕獲到這種情況並中止其對內存的調用之前,在 3 秒時間內增長到 2.5G 大小。

1 [Insert code here]
2 CON_ID OSpid Orapid Sess id Serial# Status PGA alloc PGA used PGA Max PNAME oracleuser OS user Program
3 ------ -------- ------- ------- ------- -------- ------------ ------------ ------------ ----- ------------ ------------ ------------------------
4 4 5349 33 258 41 INACTIVE 3 2 2,536 SYSTEM oracle sqlplus@localhost.locald
5 omain (TNS V1-V3)

 

alert.log 顯示以下錯誤。

1 Errors in file /u01/app/oracle/diag/rdbms/cdb1/cdb1/trace/cdb1_ora_5349.trc (incident=79479):
2 ORA-04036: PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT
3 Incident details in: /u01/app/oracle/diag/rdbms/cdb1/cdb1/incident/incdir_79479/cdb1_ora_5349_i79479.trc
4 Dumping diagnostic data in directory=[cdmp_20130128072143], requested by (instance=1, osid=5349), summary=[incident=79479].

 

進程的跟蹤文件顯示與導致此錯誤的進程相關的信息。
通過顯示的服務名您可以知道是哪個容器發生了錯誤。
跟蹤文件還提供了摘要 heap dump(堆轉儲)。在本例中,主堆具有 2159MB 的“koh-kghu call”。在該堆中,子堆包括 2154 MB 的“pl/sql vc2”。
可以使用這些內容在 MOS 上搜索有關這些分配的任何已知問題。諸如這樣一些與 pl/sql 相關的分配通常是 pl/sql 程序一次性將大量數據加載到內存中造成的。
在這樣的情況下,應該變更程序,一次將有限數量的記錄加載到內存中。替代方法是允許這樣大的分配並增加 pga_aggregate_limit 的值

復制代碼
 1 *** SERVICE NAME:(pdb1.example.com) 2013-01-28 07:44:27.902 <===-----------請注意指示哪個容器出現錯誤的服務的名稱。
 2 *** MODULE NAME:(SQL*Plus) 2013-01-28 07:44:27.902
 3 *** ACTION NAME:() 2013-01-28 07:44:27.902
 4 *** CONTAINER ID:(4) 2013-01-28 07:44:27.902
 5 *** TRACE FILE RECREATED AFTER BEING REMOVED ***
 6 
 7 Process may have gone over pga_aggregate_limit
 8 Just allocated 65536 bytes
 9 Dumping short stack in preparation for potential ORA-4036
10 ----- Abridged Call Stack Trace -----
11 ksedsts()+313<-ksm_pga_limit_short_stack()+456<-ksm_check_over_limit()+540<-ksmapg()+351<-kghgex()+1426<-kghfnd()+745<-kghalo()+693<-kghgex()
12 +401<-kghalf()+403<-kghualloc()+794<-kohalmc()+295<-kohalc()+110<-plsm0vc_rsz()+197<-pevm_MOVC_i()+1021<-pfrinstr_MOVC()+52
13 <-pfrrun_no_tool()+60<-pfrrun()+809<-plsql_run()+617<-peicnt()+287<-kkxexe()+789 
14 ----- End of Abridged Call Stack Trace -----
15 =======================================
16 PRIVATE MEMORY SUMMARY FOR THIS PROCESS
17 ---------------------------------------
18 ******************************************************
19 PRIVATE HEAP SUMMARY DUMP
20 2161 MB total:
21 2161 MB commented, 261 KB permanent
22 481 KB free (256 KB in empty extents),
23 2159 MB, 1 heap: "koh-kghu call " 1 KB free held <=============指示在 pga 中使用內存的命名內存分配
24 ------------------------------------------------------
25 Summary of subheaps at depth 1
26 2155 MB total:
27 2155 MB commented, 104 KB permanent
28 295 KB free (20 KB in empty extents),
29 2154 MB, 138274 chunks: "pl/sql vc2 " <--------------------指示 pga heap(堆)中包含的子堆內存分配
30 
31 *** 2013-01-28 07:44:28.045
32 Incident 79480 created, dump file: /u01/app/oracle/diag/rdbms/cdb1/cdb1/incident/incdir_79480/cdb1_ora_5349_i79480.trc
33 ORA-04036: PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT
34 
35 *********START PLSQL RUNTIME DUMP************
36 ***Got internal error Exception caught in pl/sql run-time while running PLSQL***
37 ***Got ORA-4036 while running PLSQL***
38 PROCEDURE SYSTEM.FILL_MEMORY:
39 意外事件文件顯示程序堆棧及行號
40 
41 Dump continued from file: /u01/app/oracle/diag/rdbms/cdb1/cdb1/trace/cdb1_ora_5349.trc
42 ORA-04036: PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT
43 
44 ========= Dump for incident 79480 (ORA 4036) ========
45 
46 *** 2013-01-28 07:44:28.045
47 dbkedDefDump(): Starting incident default dumps (flags=0x2, level=3, mask=0x0)
48 ----- Current SQL Statement for this session (sql_id=gqbtzt92rm1ck) -----
49 BEGIN fill_memory(2680000); END;
50 ----- PL/SQL Stack -----
51 ----- PL/SQL Call Stack -----
52 object line object
53 handle number name
54 0x77335850 7 procedure SYSTEM.FILL_MEMORY <-------程序的行號
55 0x77238760 1 anonymous block
56 
57 ----- Call Stack Trace -----
復制代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM