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

Oracle DB Server 記憶體暴漲根因分析:Page Tables 暴增與 HugePages 解決方案

     編輯:Oracle 資料庫基礎

現象

  • 核心交易系統試運行期,DB Server 記憶體飆升
  • SGA/PGA 監控正常,但 OS 記憶體耗盡、Swap 狂飆 20+ GB
  • 系統緩慢無法登入,唯有重啟

根因定位

cat /proc/meminfo
# 發現 PageTables: 16 GB (異常巨大)

原理分析

  • Page Table = 進程虛擬地址 → 物理地址映射表
  • Linux 預設頁面 4 KB,SGA 32 GB,單進程映射條目 = 32G/4K = 8M
  • 64-bit 系統每條目約 24 Bytes → **單進程佔 24 GB**
  • 1000 連接 → **理論需 24 TB 映射表** (實際受限於物理記憶體,導致 Swap 暴增)

解決方案:HugePages (大頁面 2 MB)

  • 映射粒度 4 KB → 2 MB,**放大 500 倍**
  • 映射條目數 ↓ 1/500,Page Tables 記憶體 **GB 級 → MB 級**
  • Oracle 11g 建議:SGA > 12 GB、連接 > 1000 時啟用
  • **不相容 AMM** (memory_target/memory_max_target),需改用手動 SGA/PGA

實施步驟

1. 關閉 AMM,設定手動 SGA/PGA

SQL> ALTER SYSTEM RESET MEMORY_TARGET SCOPE=SPFILE;
SQL> ALTER SYSTEM RESET MEMORY_MAX_TARGET SCOPE=SPFILE;
-- 重啟後分別設定 SGA_TARGET, PGA_AGGREGATE_TARGET

2. 計算 HugePages 需求

SQL> SHOW PARAMETER SGA;
-- 假設 SGA = 32 GB
-- 32 GB / 2 MB = 16384 頁
-- 取稍大整數:17000

3. 系統層面配置 HugePages

# /etc/sysctl.conf
vm.nr_hugepages = 17000

# /etc/security/limits.conf (memlock 單位 KB,略小於總記憶體)
* soft memlock 60000000
* hard memlock 60000000

4. 重啟 OS 驗證

# free -m
Mem: 64509 total, 37152 used, 27356 free
Swap: 66399 total, 478 used, 65921 free  # Swap 幾乎歸零

# grep Huge /proc/meminfo
HugePages_Total: 17000
HugePages_Free: 14452
HugePages_Rsvd: 13837
Hugepagesize: 2048 kB

# grep PageTables /proc/meminfo
PageTables: 73256 kB  # 從 16 GB 降至 72 MB!

後續分析與建議

  • 高連接數是 Page Tables 暴增主因,**應用層優先用連接池複用**、降低併發連接
  • 若連接數不可控,**HugePages 是必須選項**
  • 監控 PageTables 指標納入日常巡檢
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved