華為網(wǎng)站開發(fā)流程怎么seo快速排名
在自動化 PGA 內(nèi)存管理模式下,Oracle 數(shù)據(jù)庫通過動態(tài)控制分配到工作區(qū)的 PGA 內(nèi)存量來嘗試遵從 PGA_AGGREGATE_TARGET 值。但是,有時因為以下原因,PGA 內(nèi)存使用量可能會超過 PGA_AGGREGATE_TARGET 設(shè)置:
-
PGA_AGGREGATE_TARGET 設(shè)置起到的是目標的作用,而非限制。
-
PGA_AGGREGATE_TARGET 僅控制可優(yōu)化部分內(nèi)存的分配。
使用大量 PGA 可能會導致高交換率。出現(xiàn)這種情況時,系統(tǒng)可能會無法響應(yīng),并且不穩(wěn)定。這種時候需要考慮使用 PGA_AGGREGATE_LIMIT 初始化參數(shù)限制整體 PGA 使用量。
12c 引入了新的參數(shù) PGA_AGGREGATE_LIMIT 以允許數(shù)據(jù)庫管理員限制 pga 內(nèi)存使用總量。
使用 PGA_AGGREGATE_LIMIT初始化參數(shù)可以為 PGA 內(nèi)存使用量指定硬性限制。如果超過了 PGA_AGGREGATE_LIMIT 值,則 Oracle 數(shù)據(jù)庫按照以下順序,中斷或者終止使用了最多不可優(yōu)化 PGA 內(nèi)存的會話或進程:
-
中止使用了最多不可優(yōu)化 PGA 內(nèi)存的會話調(diào)用。
-
如果 PGA 內(nèi)存使用量仍超過 PGA_AGGREGATE_LIMIT,則終止使用了最多不可優(yōu)化 PGA 內(nèi)存的會話和進程。
使用最多不可優(yōu)化內(nèi)存會話的調(diào)用將被中止。并行查詢將被視為一個單元。如果 PGA 內(nèi)存使用總量仍超過限制,則將終止使用最多不可優(yōu)化內(nèi)存的會話。
不會對除作業(yè)隊列進程之外的 SYS 進程和后臺進程執(zhí)行這一部分中所述的任何操作。取而代之的操作是,如果它們使用了最多不可優(yōu)化內(nèi)存,則會定期將其 PGA 使用量的簡短摘要寫入到跟蹤文件中。
不可調(diào)的 PGA 內(nèi)存就像每個會話、每個打開/活動游標、PL/SQL 或 Java 內(nèi)存的上下文信息。
可調(diào) PGA 內(nèi)存是為密集型內(nèi)存 SQL 運算符分配的內(nèi)存,例如排序、哈希連接、分組、位圖合并和位圖索引創(chuàng)建。
PGA 不是 Oracle 中唯一的內(nèi)存“全局區(qū)域”。還有 MGA(Managed Global Area)和 DGA(Dynamic Global Area)(當然還有 SGA):
MGA 或 Managed Global Area:允許“較小的一組”進程(甚至所有進程)在某段時間(通常是查詢)內(nèi)共享地址空間(命名空間)。
DGA 或 Dynamic Global Area:允許在 PGA 初始化期間初始化并且在運行時不可修改的變量池。
它們不會跨進程更改,但需要在 SGA 初始化之前可用。因此,它們可作為全局變量供其他進程使用。
MGA 和 DGA 至少從 12.1 開始就存在了。但是只有在最近的版本中,數(shù)據(jù)庫組件才開始使用它,所以這個池可能比 12.1.0.2 上的要大得多。我們開始在18c 的 v$pgastat 中統(tǒng)計 MGA 和 DGA。
由于 MGA 和 DGA 在 Oracle 進程之間共享,因此它們不能歸屬于單個進程。
所以 v$process 和 v$sesstat 不能包含它們。它們僅計入 v$pgastat,其中一部分計入“使用中的總 PGA”。
您可以運行以下查詢以查看這些池的屬性,例如(注意“PGA”后面的空格):
SQL> col name for a40
SQL> select * from v$pgastat where name like '%GA%' and name not like '%PGA %';
NAME VALUE UNIT CON_ID
---------------------------------------- ---------- ------------ ----------
DGA allocated (under PGA) 10566656 bytes 0
maximum DGA allocated 12103680 bytes 0
MGA allocated (under PGA) 0 bytes 0
maximum MGA allocated 0 bytes 0
一般來說,最新版本的內(nèi)存使用率總是會更高,因此在從 12.1.0.2 升級到 19c 時,可預(yù)期會看到更多的 PGA 分配。
PGA_AGGREGATE_LIMIT 初始化參數(shù)動態(tài)設(shè)置為 PGA 內(nèi)存的實例范圍硬性限制。由于該參數(shù)根據(jù)內(nèi)存情況的變化做出響應(yīng),您無需顯式設(shè)置參數(shù)值。默認情況下,PGA_AGGREGATE_LIMIT被設(shè)置為:
在Oracle 12.1版本: PGA_AGGREGATE_LIMIT默認為如下值中的最大者:
- 2 GB
- 200% 的 PGA_AGGREGATE_TARGET
- (PROCESSES 初始化參數(shù)設(shè)置值)* 3 MB
該參數(shù)不會超過物理內(nèi)存大小減去總 SGA 大小的 120%。
在Oracle 12.2版本: PGA_AGGREGATE_LIMIT的默認值為:
* 如果設(shè)置了MEMORY_TARGET, 那么PGA_AGGREGATE_LIMIT默認值為MEMORY_MAX_TARGET的值.
* 如果MEMORY_TARGET沒有設(shè)置, 那么PGA_AGGREGATE_LIMIT默認值為 200%的PGA_AGGREGATE_TARGET值.
* 如果MEMORY_TARGET沒有設(shè)置, 并且PGA_AGGREGATE_TARGET被顯式的設(shè)置為0, 那么PGA_AGGREGATE_LIMIT的默認值為90%的物理內(nèi)存減去SGA的大小.
在以上所有情況中,默認的PGA_AGGREGATE_LIMIT至少是2GB 并且至少是數(shù)據(jù)庫參數(shù)PROCESSES乘以3MB的大小. 在 Oracle 版本 18c 及更高版本中,它應(yīng)該是 Oracle RAC 實例的 PROCESSES 參數(shù)的至少 5MB 倍。
注意: 如果指定PGA_AGGREGATE_LIMIT的值為0,則表示實例所使用的 PGA 內(nèi)存總量沒有限制。
在 Oracle 版本 18c 及更高版本中:
MGA(Managed Global Area)在 PGA 之外進行計算。
這實際上意味著在 18c 及以上版本中必須增加 PGA 大小以適應(yīng) MGA。
一個經(jīng)驗法則是:
PGA_AGGREGATE_LIMIT = (原始 PGA_AGGREGATE_LIMIT 值) + ((最大連接進程數(shù)) * 4M)
但是,有一種更“科學”的方法可以根據(jù)數(shù)據(jù)庫中可檢索的指標來確定該值(有關(guān)參考,請參閱 Note 2808761.1):
((實例生命周期內(nèi)使用的最大 PGA) + ((實例生命周期內(nèi)連接的最大進程數(shù)) * 5M)) * 1.1
此問題的另一個影響是客戶可能會報告升級到 18c 及更高版本后 PGA 使用量增加。
這是意料之中的,因為 MGA 現(xiàn)在已從 PGA 中扣除。
?
PGA_AGGREGATE_LIMIT 初始化參數(shù)可以動態(tài)設(shè)置;并不需要數(shù)據(jù)庫重新啟動。可以設(shè)置 PGA_AGGREGATE_LIMIT 的值,不論是否使用了自動內(nèi)存管理。
后臺進程 CKPT 每三秒檢查一次內(nèi)存用量是否超過了 PGA_AGGREGATE_LIMIT 初始化參數(shù)的值。如果達到或超過了限制,則此進程中斷使用最多不可優(yōu)化 PGA 內(nèi)存的會話調(diào)用。如果這些會話仍沒有釋放足夠內(nèi)存,則終止它們。
請注意,由于 pga 值僅每三秒檢查一次,因此 pga 內(nèi)存有可能超過 PGA_AGGREGATE_LIMIT。此外,如果在此期間該 pga 值減少到限制之下,則將不會捕獲在這三秒間隔內(nèi)超過限制的情況。如果進程在三秒的間隔內(nèi)快速分配然后釋放內(nèi)存,則可能會出現(xiàn)這種情況。
示例:
如下的信息會被寫入到CKPT trace 文件,
PGA LIMIT: pid 317111 is ineligible for an ORA-4036 interrupt
System processes and most background processes cannot receive ORA-4036
interrupts. When they are contributing to the instance exceeding
PGA_AGGREGATE_LIMIT, they will periodically dump their PGA usage.
PGA LIMIT: pid 317124 is a top contributor to going over PGA_AGGREGATE_LIMIT
PGA LIMIT: pid 317124 is ineligible for an ORA-4036 interrupt
PGA LIMIT: pid 317120 is a top contributor to going over PGA_AGGREGATE_LIMIT
PGA LIMIT: pid 317120 is ineligible for an ORA-4036 interrupt
如果達到了 PGA_AGGREGATE_LIMIT 值,則將報告如下錯誤。
ORA-04036: PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT
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.
Action:?Increase the PGA_AGGREGATE_LIMIT initialization parameter or reduce memory usage.
示例:
?此示例將展示使用 pl/sql 填充內(nèi)存中數(shù)組可以超過 pga_aggregate_limit 的值。
首先請查看當前 pga_aggregate_target。由于 pl/sql 內(nèi)存區(qū)不是 pga 目標控制的可優(yōu)化區(qū)域,進程 pga 將超過此值。
-- V$PGASTAT 的 PGA 統(tǒng)計信息:
-- 顯示自實例啟動以來分配的最大 pga 總量
select name, ROUND(value/1024/1024) as Mbytes from v$pgastat
where name in ('maximum PGA allocated','aggregate PGA target parameter','aggregate PGA auto target');
NAME???????????????????????? Mbytes
---------------------- ------------
aggregate PGA target p????????? 208
arameter
aggregate PGA auto tar????????? 138
get
maximum PGA allocated?????????? 119
?
?請注意 pga_aggregate_limit 顯式設(shè)置為 512M。
select con_id, name as Parameter, value/1024/1024 as Mbytes from V$SYSTEM_PARAMETER
where name in ('pga_aggregate_target','memory_target','memory_max_target','sga_max_size','sga_target','pga_aggregate_limit','processes')
order by name;
CON_ID PARAMETER??????????????????????????? Mbytes
------ ------------------------------ ------------
???? 0 memory_max_target?????????????????????? 600
???? 0 memory_target?????????????????????????? 600
???? 0 pga_aggregate_limit???????????????????? 512
???? 0 pga_aggregate_target????????????????????? 0
???? 0 processes???????????????????????????????? 0
???? 0 sga_max_size??????????????????????????? 600
???? 0 sga_target??????????????????????????????? 0
?
運行這個過程的會話收到此錯誤:
ERROR at line 1:
ORA-04036: PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT
針對 V$PROCESS 的查詢顯示進程在 ckpt進程捕獲到這種情況并中止其對內(nèi)存的調(diào)用之前,在 3 秒時間內(nèi)增長到 2.5G 大小。
SET PAGESIZE 120
COLUMN con_id HEADING 'CON_ID' FORMAT 9999999
COLUMN spid HEADING 'OSpid' FORMAT a8
COLUMN pid HEADING 'Orapid' FORMAT 999999
COLUMN sid HEADING 'Sess id' FORMAT 99999
COLUMN serial# HEADING 'Serial#' FORMAT 999999
COLUMN status HEADING 'Status' FORMAT a8
COLUMN pga_alloc_mem HEADING 'PGA alloc' FORMAT 99,999,999,999
COLUMN pga_used_mem HEADING 'PGA used' FORMAT 99,999,999,999
COLUMN username HEADING 'Oracle user' FORMAT a12
COLUMN osuser HEADING 'OS user' FORMAT a12
COLUMN program HEADING 'Program' FORMAT a20
SELECT p.con_id,
p.spid,
p.pid,
s.sid,
s.serial#,
s.status,
p.pga_alloc_mem,
p.pga_used_mem,
s.username,
s.osuser,
s.program
FROM v$process p, v$session s
WHERE s.paddr( + ) = p.addr
ORDER BY p.pga_alloc_mem DESC;
CON_ID OSpid???? Orapid Sess id Serial# Status????? PGA alloc???? PGA used????? PGA Max PNAME oracleuser?? OS user????? Program
------ -------- ------- ------- ------- -------- ------------ ------------ ------------ ----- ------------ ------------ ------------------------
???? 4 5349????????? 33???? 258????? 41 INACTIVE??????????? 3??????????? 2??????? 2,536?????? SYSTEM?????? oracle?????? sqlplus@localhost.locald
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? omain (TNS V1-V3)
?
alert.log 顯示以下錯誤。
Errors in file /u01/app/oracle/diag/rdbms/cdb1/cdb1/trace/cdb1_ora_5349.trc? (incident=79479):
ORA-04036: PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT
Incident details in: /u01/app/oracle/diag/rdbms/cdb1/cdb1/incident/incdir_79479/cdb1_ora_5349_i79479.trc
Dumping diagnostic data in directory=[cdmp_20130128072143], requested by (instance=1, osid=5349), summary=[incident=79479].
?
進程的跟蹤文件顯示與導致此錯誤的進程相關(guān)的信息。
通過顯示的服務(wù)名您可以知道是哪個容器發(fā)生了錯誤。
跟蹤文件還提供了摘要 heap dump(堆轉(zhuǎn)儲)。在本例中,主堆具有 2159MB 的“koh-kghu call”。在該堆中,子堆包括 2154 MB 的“pl/sql vc2”。可以使用這些內(nèi)容在 MOS 上搜索有關(guān)這些分配的任何已知問題。諸如這樣一些與 pl/sql 相關(guān)的分配通常是 pl/sql 程序一次性將大量數(shù)據(jù)加載到內(nèi)存中造成的。在這樣的情況下,應(yīng)該變更程序,一次將有限數(shù)量的記錄加載到內(nèi)存中。替代方法是允許這樣大的分配并增加 pga_aggregate_limit 的值
*** SERVICE NAME:(pdb1.example.com) 2013-01-28 07:44:27.902? <===-----------請注意指示哪個容器出現(xiàn)錯誤的服務(wù)的名稱。
*** MODULE NAME:(SQL*Plus) 2013-01-28 07:44:27.902
*** ACTION NAME:() 2013-01-28 07:44:27.902
*** CONTAINER ID:(4) 2013-01-28 07:44:27.902
?
*** TRACE FILE RECREATED AFTER BEING REMOVED ***
Process may have gone over pga_aggregate_limit
Just allocated 65536 bytes
Dumping short stack in preparation for potential ORA-4036
----- Abridged Call Stack Trace -----
ksedsts()+313<-ksm_pga_limit_short_stack()+456<-ksm_check_over_limit()+540<-ksmapg()+351<-kghgex()+1426<-kghfnd()+745<-kghalo()+693<-kghgex()
+401<-kghalf()+403<-kghualloc()+794<-kohalmc()+295<-kohalc()+110<-plsm0vc_rsz()+197<-pevm_MOVC_i()+1021<-pfrinstr_MOVC()+52
<-pfrrun_no_tool()+60<-pfrrun()+809<-plsql_run()+617<-peicnt()+287<-kkxexe()+789
----- End of Abridged Call Stack Trace -----
=======================================
PRIVATE MEMORY SUMMARY FOR THIS PROCESS
---------------------------------------
******************************************************
PRIVATE HEAP SUMMARY DUMP
2161 MB total:
? 2161 MB commented, 261 KB permanent
?? 481 KB free (256 KB in empty extents),
??? 2159 MB,?? 1 heap:??? "koh-kghu call? "??????????? 1 KB free held? <=============指示在 pga 中使用內(nèi)存的命名內(nèi)存分配
------------------------------------------------------
Summary of subheaps at depth 1
2155 MB total:
? 2155 MB commented, 104 KB permanent
?? 295 KB free (20 KB in empty extents),
??? 2154 MB, 138274 chunks:? "pl/sql vc2??????????????? " <--------------------指示 pga heap(堆)中包含的子堆內(nèi)存分配
*** 2013-01-28 07:44:28.045
Incident 79480 created, dump file: /u01/app/oracle/diag/rdbms/cdb1/cdb1/incident/incdir_79480/cdb1_ora_5349_i79480.trc
ORA-04036: PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT
*********START PLSQL RUNTIME DUMP************
***Got internal error Exception caught in pl/sql run-time while running PLSQL***
***Got ORA-4036 while running PLSQL***
PROCEDURE SYSTEM.FILL_MEMORY:
意外事件文件顯示程序堆棧及行號
Dump continued from file: /u01/app/oracle/diag/rdbms/cdb1/cdb1/trace/cdb1_ora_5349.trc
ORA-04036: PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT
========= Dump for incident 79480 (ORA 4036) ========
*** 2013-01-28 07:44:28.045
dbkedDefDump(): Starting incident default dumps (flags=0x2, level=3, mask=0x0)
----- Current SQL Statement for this session (sql_id=gqbtzt92rm1ck) -----
BEGIN fill_memory(2680000); END;
----- PL/SQL Stack -----
----- PL/SQL Call Stack -----
? object????? line? object
? handle??? number? name
0x77335850???????? 7? procedure SYSTEM.FILL_MEMORY <-------程序的行號
0x77238760???????? 1? anonymous block
----- Call Stack Trace -----