首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 11g 自動記憶體管理 (AMM) 實戰:兩個參數搞定 SGA+PGA

     編輯:Oracle 資料庫基礎

演進脈絡

版本里程碑關鍵參數
8i → 9iPGA 自動管理PGA_AGGREGATE_TARGET
9i → 10gSGA 自動管理 (ASMM)SGA_TARGET
10g → 11g記憶體全自動管理 (AMM)MEMORY_TARGET, MEMORY_MAX_TARGET

11g AMM 將 SGA 與 PGA 統一納入單一記憶體池動態分配,DBA 僅需設定兩個參數。

核心參數詳解

  • MEMORY_TARGET:Oracle 可用的目標總記憶體(SGA + PGA),動態可調,上限受 MEMORY_MAX_TARGET 限制。
  • MEMORY_MAX_TARGET:MEMORY_TARGET 的硬性上限,靜態參數,修改需重啟實例。

相容性:若只設 SGA_TARGET/PGA_AGGREGATE_TARGET,11g 退化為 10g ASMM 模式;若都不設,退化為 9i/8i 手動模式。

實戰觀測與驗證

1. 檢視動態元件分配

SELECT component, current_size, min_size, max_size
FROM v$memory_dynamic_components
ORDER BY component;

輸出範例:

COMPONENTCURRENT_SIZEMIN_SIZEMAX_SIZE
shared pool130,023,424109,051,904130,023,424
large pool4,194,3044,194,3044,194,304
java pool4,194,3044,194,3044,194,304
SGA Target322,961,408322,961,408322,961,408
DEFAULT buffer cache176,160,768176,160,768197,132,288
PGA Target218,103,808213,909,504218,103,808

2. 驗證 MEMORY_TARGET = SGA + PGA

SHOW PARAMETER memory_target;
-- NAME              TYPE        VALUE
-- memory_target     big integer 516M

SELECT (322961408 + 218103808)/1024/1024 || 'M' AS "SGA+PGA" FROM dual;
-- SGA+PGA
-- 516M  ← 精確等於 MEMORY_TARGET

3. 細分 SGA 靜態與動態佔用

  • 動態元件總和:Shared Pool + Large Pool + Java Pool + Buffer Cache = 314,572,800 Bytes。
  • SGA Target - 動態總和 = 8,388,608 Bytes → 這部分為固定靜態區(Fixed SGA + Log Buffer)。
  • 查詢 V$SGASTAT WHERE POOL IS NULL 可見:fixed_sga (1,375,792) + log_buffer (5,804,032) = 7,179,824,差值 1,208,784 為其他微小固定結構。

4. Shared IO Pool 解析

Shared IO Pool 現值 0,屬 PGA 範疇,用於緩解進程 I/O 等待。若出現非零值,表示系統正動態分配緩衝區應對 I/O 壓力。

AMM 啟用與調整實務

  1. 啟用 AMM(需關閉 ASMM 參數):
    ALTER SYSTEM SET SGA_TARGET=0 SCOPE=SPFILE;
    ALTER SYSTEM SET PGA_AGGREGATE_TARGET=0 SCOPE=SPFILE;
    ALTER SYSTEM SET MEMORY_MAX_TARGET=2G SCOPE=SPFILE;
    ALTER SYSTEM SET MEMORY_TARGET=1.5G SCOPE=BOTH;
    -- 重啟實例生效 MEMORY_MAX_TARGET
  2. 動態調整:
    -- 增加總記憶體(不超過 MAX_TARGET)
    ALTER SYSTEM SET MEMORY_TARGET=1.8G SCOPE=BOTH;
    
    -- 僅調整當前實例(重啟失效)
    ALTER SYSTEM SET MEMORY_TARGET=1.6G SCOPE=MEMORY;
  3. 監控關鍵視圖:
    • V$MEMORY_DYNAMIC_COMPONENTS:元件級分配追蹤。
    • V$MEMORY_TARGET_ADVICE:目標值建議(模擬不同大小下的估計 DB Time)。
    • V$PGA_TARGET_ADVICE、V$SGA_TARGET_ADVICE:子池建議。

常見問題與避坑

  • /dev/shm 空間不足:AMM 依賴 Linux 共享記憶體檔案系統(/dev/shm),大小必須 ≥ MEMORY_MAX_TARGET。df -h /dev/shm 確認,不足時掛載更大:mount -o remount,size=4G /dev/shm。
  • HugePages 衝突:AMM 與 HugePages 不相容。若已配置 HugePages,請勿啟用 AMM,改用 ASMM(設定 SGA_TARGET、PGA_AGGREGATE_TARGET)。
  • 32 位元限制:32 位元 Oracle 最大可定址 ~2.5GB,AMM 目標值受限。
  • 診斷建議:V$MEMORY_TARGET_ADVICE 顯示 ESTD_DB_TIME 隨目標值下降則受益明確;平坦曲線表示記憶體非瓶頸。

總結

Oracle 11g AMM 以 MEMORY_TARGET/MEMORY_MAX_TARGET 兩參數實現 SGA+PGA 統一池化管理,大幅降低 DBA 記憶體調優門檻。關鍵在於:確保 /dev/shm 足夠、避開 HugePages、善用 *_ADVICE 視圖科學決策。對於記憶體壓力大、負載波動劇烈的系統,AMM 是極具性價比的選擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved