Oracle實例內存(SGA和PGA)調整(轉載)

一、名詞解釋

(1)SGASystemGlobal AreaOracleInstance的基本組成部分,在實例啓動時分配;系統全局域SGA主要由三部分構成:共享池、數據緩衝區、日誌緩衝區。

(2)共享池:Shared Pool用於緩存最近被執行的SQL語句和最近被使用的數據定義,主要包括:Librarycache(共享SQL區)和Datadictionarycache(數據字典緩衝區)。 共享SQL區是存放用戶SQL命令的區域,數據字典緩衝區存放數據庫運行的動態信息。

(3)緩衝區高速緩存:DatabaseBufferCache用於緩存從數據文件中檢索出來的數據塊,可以大大提高查詢和更新數據的性能。

(4)大型池:Large PoolSGA中一個可選的內存區域,它只用於shared server環境。

(5)Java池:Java PoolJava命令的語法分析提供服務。

(6)PGAProcessGlobal Area是爲每個連接到Oracledatabase的用戶進程保留的內存。

二、分析與調整

(1)系統全局域:

SGA與操作系統、內存大小、cpu、同時登錄的用戶數有關。可佔OS系統物理內存的1/31/2

a.共享池Shared Pool

查看共享池大小Sql代碼

SQL>show parameter shared_pool_size

 

查看共享SQL區的使用率:

Sql代碼

select(sum(pins-reloads))/sum(pins)"Library cache"from v$librarycache;

--動態性能表

LIBRARY命中率應該在90%以上,否則需要增加共享池的大小。


查看數據字典緩衝區的使用率:

Sql代碼

select(sum(gets-getmisses-usage-fixed))/sum(gets)"Data dictionary cache"from v$rowcache;

--動態性能表

這個使用率也應該在90%以上,否則需要增加共享池的大小。


修改共享池的大小:

Sql代碼

ALTERSYSTEMSET SHARED_POOL_SIZE =64M;

b.緩衝區高速緩存DatabaseBufferCache

查看共享池大小Sql代碼

SQL>show parameter db_cache_size

 

查看數據庫數據緩衝區的使用情況:

Sql代碼

SELECTname,valueFROM v$sysstat orderbynameWHEREnameIN(''DBBLOCK GETS'',''CONSISTENT GETS'',''PHYSICALREADS'');


SELECT * FROM V$SYSSTAT WHERENAMEIN('parse_time_cpu','parse_time_elapsed','parse_count_ hard');

計算出來數據緩衝區的使用命中率=1-(physicalreads/(dbblock gets+consistent gets)),這個命中率應該在90%以上,否則需要增加數據緩衝區的大小。


c.日誌緩衝區

查看日誌緩衝區的使用情況:

Sql代碼

SELECTname,valueFROM v$sysstat WHEREnameIN('redo entries','redo log space requests')

查詢出的結果可以計算出日誌緩衝區的申請失敗率:

申請失敗率=requests/entries,申請失敗率應該接近於0,否則說明日誌緩衝區開設太小,需要增加Oracle數據庫的日誌緩衝區。


d.大型池:

可以減輕共享池的負擔,可以爲備份、恢復等操作來使用,不使用LRU算法來管理。其大小由數據庫的'共享模式/db模式'如果是共享模式的話,要分配的大一些。

指定Large Pool的大小:

Sql代碼

ALTERSYSTEMSET LARGE_POOL_SIZE=64M

 

e.Java池:

在安裝和使用Java的情況下使用。


(2)PGA調整

a.PGA_AGGREGATE_TARGET初始化設置


PGA_AGGREGATE_TARGET的值應該基於Oracle實例可利用內存的總量來設置,這個參數可以被動態的修改。假設Oracle實例可分配4GB的物理內存,剩下的內存分配給操作系統和其它應用程序。你也許會分配80%的可用內存給Oracle實例,即3.2G。現在必須在內存中劃分SGAPGA區域。


OLTP(聯機事務處理)系統中,典型PGA內存設置應該是總內存的較小部分(例如20%),剩下80%分配給SGA

OLTPPGA_AGGREGATE_TARGET=(total_mem * 80%) * 20%=2.5G


DSS(數據集)系統中,由於會運行一些很大的查詢,典型的PGA內存最多分配70%的內存。

DSSPGA_AGGREGATE_TARGET=(total_mem * 80%) * 50%


在這個例子中,總內存4GBDSS系統,你可以設置PGA_AGGREGATE_TARGET1600MBOLTP則爲655MB


b.配置PGA自動管理

不用重啓DB,直接在線修改。

SQL>altersystemset workarea_size_policy=autoscope=both;

System altered.

SQL>altersystemset pga_aggregate_target=512mscope=both;

System altered.

SQL>show parameter workarea

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
workarea_size_policy                 string      AUTO  --這個設置成AUTO

 

SQL>show parameter pga

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target                 big integer 500M

 

c.監控自動PGA內存管理的性能

V$PGASTAT:這個視圖給出了一個實例級別的PGA內存使用和自動分配的統計。


SQL>set lines 256

SQL>set pages 42

SQL>SELECT * FROM V$PGASTAT;

 

NAMEVALUE UNIT

---------------------------------------------------------------- ---------- -----

aggregate PGA target parameter536870912 bytes

--當前PGA_AGGREGATE_TARGET的值

aggregate PGAauto target 477379584 bytes

--當前可用於自動分配了的PGA大小,應該比PGA_AGGREGATE_TARGET

globalmemorybound26843136 bytes

--自動模式下工作區域的最大大小,Oracle根據工作負載自動調整。

total PGA inuse6448128 bytes

total PGA allocated11598848 bytes

--PGA的最大分配

maximum PGA allocated166175744 bytes

total freeable PGAmemory393216 bytes

--PGA的最大空閒大小

PGAmemory freed back to OS 69074944 bytes

total PGA usedforauto workareas 0 bytes

--PGA分配給auto workareas的大小

maximum PGA usedforauto workareas 1049600 bytes

total PGA usedformanual workareas 0 bytes

maximum PGA usedformanual workareas 530432 bytes

over allocation count1118

--實例啓動後,發生的分配次數,如果這個值大於0,就要考慮增加pga的值

bytes processed114895872 bytes

extra bytesread/written4608000 bytes

cache hit percentage 96.14percent

--命中率

16rows selected.

--V$PGA_TARGET_ADVICE


SQL>SELECTround(PGA_TARGET_FOR_ESTIMATE/1024/1024) target_mb,

ESTD_PGA_CACHE_HIT_PERCENTAGE cache_hit_perc,

ESTD_OVERALLOC_COUNT

FROM v$pga_target_advice;

The output of this query might look likethefollowing:

 

TARGET_MB CACHE_HIT_PERC ESTD_OVERALLOC_COUNT

---------- -------------- --------------------

6323367

1252430

250303

375390

500580

600590

700590

800600

900600

1000610

1500670

2000760

3000830

4000850


可以看出當TARGET_MB375MESTD_OVERALLOC_COUNT=0,所以可以將PGA_AGGREGATE_TARGET設置成375M

 

附:Oracle SGAPGA區別:

SGA:是用於存儲數據庫信息的內存區,該信息爲數據庫進程所共享。它包含Oracle服務器的數據和控制信息,它是在Oracle服務器所駐留的計算機的實際內存中得以分配,如果實際內存不夠再往虛擬內存中寫。

PGA:包含單個服務器進程或單個後臺進程的數據和控制信息,與幾個進程共享的SGA正相反,PGA是隻被一個進程使用的區域,PGA在創建進程時分配,在終止進程時回收。



另一篇文章中也這樣寫了相關的調整記錄


如何估算PGASGA的大小,配置數據庫服務器的內存

Oracle給的建議是: OLTP系統PGA=(TotalMemory)*80%*20%

DSS系統PGA=(TotalMemory)*80%*50%

Oracle建議一個數據庫服務器,分80%的內存給數據庫,20%的內存給操作系統,那怎麼給一個數據庫服務器配內存呢?

SQL>select * from v$pgastat;

NAMEVALUE UNIT

---------------------------------------------------------------- ---------- ------------

aggregate PGA target parameter104857600 bytes

-----這個值等於參數PGA_AGGREGATE_TARGET的值,如果此值爲0,表示禁用了PGA自動管理。

aggregate PGAauto target 75220992 bytes

-----表示PGA還能提供多少內存給自動運行模式,通常這個值接近pga_aggregate_target-total pga inuse.

globalmemorybound20971520 bytes

-----工作區執行的最大值,如果這個值小於1M,馬上增加PGA大小

total PGA inuse30167040 bytes

-----當前分配PGA的總大小,這個值有可能大於PGA,如果PGA設置太小.這個值接近select sum(pga_used_mem) from v$process.

total PGA allocated52124672 bytes

-----工作區花費的總大小

maximum PGA allocated67066880 bytes

total freeable PGAmemory0 bytes ----沒有了空閒的PGA

processcount23----當前一個有23process

max processes count25

PGAmemory freed back to OS 0 bytes

total PGA usedforauto workareas 8891392 bytes

maximum PGA usedforauto workareas 22263808 bytes

total PGA usedformanual workareas 0 bytes ---0自動管理

maximum PGA usedformanual workareas 0 bytes ---0自動管理

over allocation count0

--如果PGA設置太小,導致PGA有時大於PGA_AGGREGATE_TARGET的值,此處爲0,說明PGA沒有擴展大於TARGET的值,如果此值出現過,那麼增加PGA大小。

bytes processed124434432 bytes

extra bytesread/written0 bytes

cache hit percentage 100percent

---命中率爲100%,如果太小增加PGA

recomputecount(total)6651

19rows selected

SQL>selectmax(pga_used_mem)/1024/1024Mfrom v$process;

----當前一個process消耗最大的內存

M

----------

9.12815189

SQL>selectmin(pga_used_mem)/1024/1024Mfrom v$process where pga_used_mem>0;---process消耗最少內存

M

----------

0.19186878

SQL>selectmax(pga_used_mem)/1024/1024Mfrom v$process ;

----process曾經消耗的最大內存

M

----------

9.12815189

SQL>selectsum(pga_used_mem)/1024/1024from v$process;----當前process一共消耗的PGA

SUM(PGA_USED_MEM)/1024/1024

---------------------------

28.8192501068115

如何設置PGA呢?我們可以在壓力測試階段,模擬一下系統的運行,然後運行

select(selectsum(pga_used_mem)/1024/1024from v$process)/(selectcount(*)from v$process)fromdual;

得到一個process大約佔用了多少的內存,然後估算系統一共會有多少連接,比如一共有500個連接,

那麼sessions=1.1*process+5=500,那麼processes=450,

再乘以一個process需要消耗的內存,就能大約估算出PGA需要設置多大。


EG = 1.1 * 450 = 495M估算的大一點550MOK


最好將PGA設置的值比計算出的值大一點,PGA值設定好後,就可以根據系統的性質,如果系統爲OLTOP,那麼總的內存可以設置爲PGA/0.16,最後也能估算出SGA的大小,建議還是多配點內存,反正便宜。



下面摘抄eygle的關於一個process能夠分配的最大內存(串行操作)的規則:

10gR1之前,對於串行操作(非並行)一個process能夠分配的最大的內存爲min(5%pga_aggregate_target,100m)

10gR2之後,對於串行操作(非並行)一個process能夠分配的最大內存有如下規則:

如果pga_aggregate_target<=500m,那麼最大的內存爲20%*pga_aggregate_target.

如果500m<pga_aggregate_target<=1000m,那麼最大內存爲100m.

如果1000m<pga_aggregate_target<=2.5G,那麼最大內存爲10%*pga_aggregate_target.

如果pga_aggregate_target>2.5G,那麼最大內存爲2.5G.

SQL>SELECT x.ksppinmNAME, y.ksppstvlVALUE, x.ksppdesc describ

FROM SYS.x$ksppi x, SYS.x$ksppcv y WHERE x.inst_id=USERENV('Instance')

AND y.inst_id=USERENV('Instance')AND x.indx= y.indxAND x.ksppinmLIKE'%&par%'



NAMEVALUE DESCRIB

--------------------------------------------------------------------------------

_smm_max_size20480 maximum work area sizeinautomode(serial)

SQL>show parameter pga

NAMETYPEVALUE

------------------------------------ ----------- ------------------------------

pga_aggregate_target biginteger100M

此處我的一個process能夠分配的最大內存爲20M,因爲我的PGA=100M,符合上面的規則。

隱含參數_smm_max_size表示一個process能夠分配最大的memory.



==========================================================

買了piner的《Oracle高可用環境》一書,正好趁這段時間學習一下。

把看到的東西總結一下發表於此,今天先發第一章關於SGAPGA的內容。


以後會陸續將總結在此發表,與大家共享。


SGAPGA的結構如下圖:


SGA:

查看SGA

Sqlp>show sga

select * from v$sga;

TotalSystemGlobal Area 289406976 bytes

FixedSize1248600 bytes

VariableSize176161448 bytes

Database Buffers 109051904 bytes

Redo Buffers2945024 bytes


FixedSize:包括了數據庫與實例的控制信息、狀態信息、字典信息等,啓動時就被固定在SGA中,不會改變。

VariableSize:包括了shard poollarge pooljava poolstream pool、遊標區和其他結構

Database Buffers:數據庫中數據塊緩衝的地方,是SGA中最大的地方,決定數據庫性能

Redo Buffers:提供REDO緩衝的地方,在OLAP中不需要太大


V$sgastat記錄了SGA的一些統計信息

V$sga_dynamic_components保存SGA中可以手動調整的區域的一些調整記錄


Shard pool:

Shard_pool_size決定其大小,10g以後自動管理

Shard_pool中數據字典和控制區結構用戶無法直接控制,與用戶有關的只有sql緩衝區(librarycache)。

將經常訪問的過程或包用DBMS_SHARED_POOL.KEEP存儲過程將該包pin在共享池中。

手工清除共享池的內容:altersystemflush shard_pool;


共享池相關的幾個常用的視圖:

V$sqlarea記錄了所有sql的統計信息,包括執行次數、物理讀、邏輯讀、耗費時間等

V$sqltext_with_newline完全顯示sql語句,通過hash_value來標示語句,piece排序

V$sql_plan保存了sql的執行計劃,通過工具查看

V$shared_pool_advice對共享池的預測,可以做調整SGA的參考


Databuffer


OLTP系統中要求databuffer的命中率在95%以上

selectsum(pins)"execution",sum(pinhits)"hits",

((sum(pinhits)/sum(pins))*100)"pinhitration",

sum(reloads)"misses",((sum(pins)/(sum(pins)

+sum(reloads)))*100)"relhitratio"

from V$librarycache


計算命中率的語句

select round((1 - (physical.value - direct.value - lobs.value)/logical.value)*100,2) "Buffer Cache Hit Ratio"

from v$sysstat physical,v$sysstat direct,v$sysstat lobs,v$sysstat logical

where physical.name ='physical reads'

and direct.name ='physical reads direct'

and lobs.name ='physical reads direct (lob)'

and logical.name ='session logical reads';



PINSNUMBERNumberof times a PIN was requested for objects of this namespace

PINHITSNUMBERNumberof times allofthe metadata pieces ofthelibraryobject were foundinmemory

RELOADSNUMBERAny PIN of an object that isnotthefirst PIN performed since theobject handle was created,and which requires loading theobjectfromdisk


Oracle把從databuffer中獲得的數據庫叫cache hit,把從磁盤獲得的腳cache miss

數據緩衝區中的數據塊通過髒列表(dirtylist)和LRU列表(LRUlist)來管理。


Databuffer可細分爲:default poolkeep poolrecycle pool對應的參數爲db_cache_sizedb_keep_cache_sizedb_recycle_size分別表示緩衝區大小


9i開始Oracle支持不同塊大小的表空間,相應的可以爲不同塊大小的表空間指定不同塊大小的數據緩衝區,不同塊大小的數據緩衝區可以用相應的db_nk_cache_size來指定,其中n可以是2461632


V$db_cache_advice對數據緩衝區的預測,可以做調整databuffer的參考


V$bhx$bh記錄了數據塊在databuffer中緩衝的情況,通過這個視圖可以找系統中的熱點塊。

通過下面語句找系統中top10熱點快所在的熱點對象:


Select/*+ rule*/ owner,object_namefrom dba_objects

Where data_object_id in

(select obj from

(select obj from x$bh orderby tch desc)

Whererownum<11);


PGA

用來保存於用戶進程相關的內存段。

9i開始使用PGA自動管理,pga_aggregate_target參數指定session一共使用的最大PGA內存的上限。Workarea_size_policy參數用於開關PGA內存自動管理功能,auto/manual


OLTP環境中,自動PGA管理只要設置到一定的值,如2G左右就能滿足系統的要求。


自動內存管理:

9i開始,sga_max_size參數設置SGA的內存大小,不能動態修改


10g開始,指定了sga_target參數後,所有的SGA組件如:shared pooldatabufferlarge pool都不用手工指定了,Oracle會自動管理。這一特性就是自動共享內存管理ASMM。如果設置了sga_target=0,就自動關閉自動共享內存管理功能。Sga_target大小不能超過sga_max_size的大小。

手動管理SGA

Altersystemset sga_target=2000m;

Altersystemset db_cache_size=1000m;

Altersystemsetshared_pool=200m;

Altersystemset sga_target=0---------關閉自動共享內存管理ASMM


11G以後sga+pga整個內存可以自動管理AMM,相關參數memory_max_target memory_target.設置好這兩個參數後就不用關心SGAPGA

11g手動內存管理:

Altersystemset memory_target=3000m;

Altersystemset sga_target=2000m;

Altersystemset pga_aggregate_target=1000m;

Altersystemset memory_target=0;---------關閉自動內存管理AMM

 
 
發佈了4 篇原創文章 · 獲贊 2 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章