虛擬記憶體管理是 Linux 核心最複雜的子系統之一。本文聚焦與效能監測直接相關的兩個核心執行緒 kswapd 與 pdflush,並透過 vmstat 實戰解讀記憶體壓力指標。
pages_high、pages_low、pages_min 三個水位線pages_low 時喚醒,掃描並釋放 32 頁為單位,直到 > pages_highvm.dirty_background_ratio (預設 10%) 與 vm.dirty_ratio (預設 20%) 控制sysctl vm.dirty_background_ratio
# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 3 252696 2432 268 7148 3604 2368 3608 2372 288 288 0 0 21 78 1
0 2 253484 2216 228 7104 5368 2976 5372 3036 930 519 0 0 0 100 0
| 欄位 | 含義 | 異常判讀 |
|---|---|---|
swpd | 已用 Swap 大小 (KB) | 持續增長 = 記憶體嚴重不足 |
free | 空閒實體記憶體 (KB) | 長期極低 = 系統處於記憶體壓力 |
buff | Block I/O 緩衝區 (KB) | 穩步下降 = kswapd 正從這裡借用記憶體 |
cache | 頁面快取 (KB) | 包含檔案快取,可被回收 |
si | Swap in (KB/s) - 從 Swap 讀入 | 持續 > 0 = 頻繁換頁讀取,效能嚴重下降 |
so | Swap out (KB/s) - 寫入 Swap | 持續 > 0 = 記憶體不足被迫換出 |
bi | Block in (磁碟塊讀入, blocks/s) | 含檔案讀取與 Swap 讀入 |
bo | Block out (磁碟塊寫出, blocks/s) | 含檔案寫回與 Swap 寫出 |
r | 可執行行程數 (含正在跑) | 長期 > CPU 核心數 = CPU 飽和 |
b | 不可中斷睡眠行程數 (通常等 I/O) | > 0 = I/O 瓶頸 |
wa | CPU 等待 I/O 百分比 | 高 = 磁碟子系統跟不上 |
觀察上述輸出:
free 維持極低 (~2-3 MB),系統維持在最小可用記憶體邊緣swpd 持續增長 (252M → 262M),so (Swap out) 持續發生buff 從 268 降至 128,kswapd 正侵佔 buffer 空間wa (I/O wait) 高達 78-100%,CPU 大部分時間在等磁碟結論:系統實體記憶體嚴重不足,觸發 vm.dirty_background_ratio=10% 導致 pdflush/kswapd 瘋狂回寫髒頁與換出匿名頁,磁碟 I/O 成為瓶頸,整體效能崩潰。
sysctl vm.swappiness=10 (預設 60),降低主動換出傾向vm.dirty_background_ratio=5, vm.dirty_ratio=10,更積極回寫,避免瞬間大量 I/Ovmstat 是診斷記憶體壓力的「聽診器」。關鍵在於觀察 si/so 持續非零、wa 高、free 長期極低 三大鐵律。理解 kswapd/pdflush 機制,才能從根源解決 Swap 暴增問題,而非單純調大 Swap 分區。
CentOS/RHEL 系統 Apache prefork 與 worker 模式快速切換操作手冊
Java 在 Linux 服務器無圖形界面下報錯 "Can't connect to X11 window server" 根因與三大解決方案
Corel Linux 常見安裝與使用問題全攻略:顯卡/滑鼠/開機/分區/聲卡/上網/啟動管理器/記憶體/軟體包/移除完整解答
Linux C/C++ 連接 MySQL 編譯鏈接完全指南:mysql_config 最佳實踐與常見錯誤排查
CentOS 64 位修改 MySQL 5.5.25 預設字元集為 UTF-8 完整步驟
忘記 Ubuntu Root 密碼?單用戶模式與 GRUB 參數修改實戰教學
VMware vCenter Converter Standalone Linux P2V 遷移排錯清單:9 大關鍵檢查點