SHARED_POOL_RESERVED_SIZE引數的設定及作用

y81277241發表於2014-11-13

 SHARED_POOL_RESERVED_SIZE引數的設定及作用

shared_pool_reserved_size:
該引數指定了保留的共享池空間,用於滿足將來的大的連續的共享池空間請求。當共享池出現過多碎片,請求大塊
空間會導致Oracle大範圍的查詢並釋放共享池記憶體來滿足請求,由此可能會帶來較為嚴重的效能下降,設定合適的
shared_pool_reserved_size引數,結合_shared_pool_reserved_min_alloc引數可以用來避免由此導致的效能下降。

這個引數理想值應該大到足以滿足任何對RESERVED LIST的記憶體請求,而無需從共享池中重新整理物件。這個引數的
預設值是shared_pool_size的5%,通常這個引數的建議值為shared_pool_size引數的10%~20%大小,最大不得
超過shared_pool_size的50%。

同樣地,在trace檔案中,可以找到關於保留列表(RESERVED LIST)的記憶體資訊:

RESERVED FREE LISTS:
Reserved bucket 0 size=16
Reserved bucket 1 size=4400
Reserved bucket 2 size=8204
Reserved bucket 3 size=8460
Reserved bucket 4 size=8464
Reserved bucket 5 size=8468
Reserved bucket 6 size=8472
Reserved bucket 7 size=9296
Reserved bucket 8 size=9300
Reserved bucket 9 size=12320
Reserved bucket 10 size=12324
Reserved bucket 11 size=16396
Reserved bucket 12 size=32780
Reserved bucket 13 size=65548
Chunk 41000050 sz=   212888 R-free      "               "
Chunk 41400050 sz=   212888 R-free      "               "
Chunk 41800050 sz=   212888 R-free      "               "
Chunk 41c00050 sz=   212888 R-free      "               "
Chunk 42000050 sz=   212888 R-free      "               "
Chunk 42400050 sz=   212888 R-free      "               "
Chunk 42800050 sz=   212888 R-free      "               "
Chunk 42c00050 sz=   212888 R-free      "               "
Chunk 43000050 sz=   212888 R-free      "               "
Chunk 43400050 sz=   212888 R-free      "               "
Chunk 43800050 sz=   212888 R-free      "               "
Chunk 44000050 sz=   212888 R-free      "               "
Total reserved free space   = 2554656

_shared_pool_reserved_min_alloc這個引數的值控制保留記憶體的使用和分配。如果一個足夠尺寸的大塊記憶體請求在共享池空閒列表(FREE LIST)中沒能找到,記憶體就從保留列表(RESERVED LIST)中分配一塊比這個值大的空間。

在不同的版本中,該引數的預設值一直都是4400,以下輸出來自Oracle 11gR1版本:

> @GetHidPar
Enter value for par: shared_pool_reserved_min_alloc
old   4: AND x.ksppinm LIKE '%&par%'
new   4: AND x.ksppinm LIKE '%shared_pool_reserved_min_alloc%'
NAME                                VALUE      DESCRIB
----------------------------------- ---------- ----------------------------------------------------------------------
_shared_pool_reserved_min_alloc    4400       minimum allocation size in bytes for reserved area of shared pool

這個引數預設的值對於大多數系統來說都足夠了。如果系統經常出現ORA-04031錯誤都是請求大於4400的記憶體塊,那麼就
可能需要增加shared_pool_reserved_size引數設定。

而如果主要的引發LRU合併、老化並出現ORA-04031錯誤的記憶體請求在4100~4400bytes之間,
那麼降低_shared_pool_reserved_min_alloc同時適當增大SHARED_POOL_RESERVED_SIZE引數值通常會有所幫助。
設定_shared_pool_reserved_min_alloc=4100可以增加Shared Pool成功滿足請求的機率。需要注意的是,這個引數
的修改應對結合Shared Pool Size 和 Shared Pool Reserved Size的修改。設定_shared_pool_reserved_min_alloc=4100
是經過證明的可靠方式,不建議設定更低。
查詢v$shared_pool_reserved檢視可以用於判斷共享池問題的引發原因,以下查詢來自一個業務系統,注意系統出現過2次的
請求失敗,最後一次請求的記憶體塊大小是3896Bytes。由於這個環境沒有報ORA-04031錯誤,所以不對_shared_pool_reserved_min_alloc
引數進行修改。

> select free_space,avg_free_size,used_space,avg_used_size,request_failures,last_failure_size
2 from v$shared_pool_reserved;

FREE_SPACE AVG_FREE_SIZE USED_SPACE AVG_USED_SIZE REQUEST_FAILURES LAST_FAILURE_SIZE
---------- ------------- ---------- ------------- ---------------- -----------------
44406648    727977.836      86640    1420.32787               2              3896

如果request_failures > 0 並且 last_failure_size > _shared_pool_reserved_min_alloc,那麼ORA-04031錯誤就可能是因
為共享池保留空間缺少連續空間所致。要解決這個問題,可以考慮加大_shared_pool_reserved_min_alloc來降低緩衝進共享
池保留空間的物件數目,並增大shared_pool_reserved_size 和 shared_pool_size來加大共享池保留空間的可用記憶體。

如果request_failures > 0 並且 last_failure_size < _shared_pool_reserved_min_alloc,那麼是因為在庫高速緩衝缺少
連續空間導致ORA-04031錯誤。

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

相關文章