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

MySQL 調優基礎(二):Linux 記憶體管理與 Swap 優化

     編輯:MySQL 綜合教學

MySQL 調優基礎(二):Linux 記憶體管理與 Swap 優化

進程記憶體分佈圖

進程虛擬記憶體 = 物理常駐記憶體 + Swap Out 頁面。關鍵指標:

  • VIRT:虛擬記憶體總量(含程式碼、資料、共享庫、Swap Out 頁面)
  • RES:常駐物理記憶體(Real RSS)

top 顯示 mysqld VIRT/RES

1. Linux 虛擬記憶體機制

  • 應用程式不直接分配物理記憶體,而是向核心請求虛擬記憶體映射
  • 核心以 4KB Page 為單位管理,透過 Buddy System 維護空閒頁面鏈表,減少碎片
  • 記憶體回收優先順序:Page Cache(檔案快取) > 非活躍進程匿名頁面 Swap Out
  • kswapd 核心執行緒負責回收,掃描 Active/Inactive LRU 列表

2. 避免 Swap 影響 MySQL 的關鍵參數

vm.swappiness

  • 範圍 0~100,預設 60。值越小越傾向回收 Page Cache 而非 Swap Out
  • 舊核心(<2.6.32-303): 設 vm.swappiness = 0
  • 新核心(≥2.6.32-303): 設 0 可能觸發 OOM Killer 殺掉 mysqld,**建議設為 1**

oom_adj / oom_score_adj 保護 mysqld

# 查看目前值
cat /proc/$(pidof -s mysqld)/oom_adj

# 設為 -17 完全禁用 OOM Killer 對此進程
echo -17 > /proc/$(pidof -s mysqld)/oom_adj

參考核心定義 OOM_DISABLE (-17)、OOM_ADJUST_MIN (-16)、OOM_ADJUST_MAX (15)。但最佳做法仍是保障足夠實體記憶體 + 設 swappiness=1,避免犧牲其他進程。

3. 記憶體瓶頸偵測工具

vmstat 觀察 Swap Out

vmstat 2
# 關鍵欄位:si (swap in/s), so (swap out/s)

sar -B 觀察 Page Out

sar -B 2 3
# pgpgout/s: 每秒 page out KB 數
# majflt/s: Major Page Fault(需從磁碟讀取頁面),極重要指標

free / ps / pmap 分析進程記憶體

  • free -m:關注 -/+ buffers/cache 行的 free 值,而非首行
  • ps -mp <PID> -o THREAD,pmem,rss,vsz,tid,pid:mysqld 記憶體佔用
  • pmap -x <PID>:詳細映射表,Mapping 欄顯示 [anon](匿名分配)、[stack]、或檔案映射

pmap 輸出範例

4. 記憶體調優策略總結

  1. HugePages: 鎖定記憶體避免 Swap Out,但會增加 Page 爭用,**必須壓測驗證**
  2. vm.swappiness=1: 優先回收 Page Cache,減少 Swap Out,但可能增加 Major Page Fault
  3. 調整髒頁刷新閾值:
    • vm.dirty_background_ratio=10(非同步刷新觸發點)
    • vm.dirty_ratio=20(同步刷新阻塞點,降低可減輕 MySQL 記憶體壓力但增加磁碟 I/O)
  4. 增加實體記憶體: 根治之道
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved