記憶體是 Linux 核心管理最關鍵的資源之一。由於物理記憶體總是有限,Linux 採用虛擬記憶體機制,利用磁碟(Swap)作為 RAM 的延伸,並透過「頁框回收」、「快取/緩衝區」等技術,讓系統看似擁有超過實體記憶體的可用空間。理解這些機制,是進行有效監控與調校的基礎。
free 指令——最基礎的查看工具# free -h
total used free shared buff/cache available
Mem: 250M 188M 62M 0M 10M 171M
Swap: 512M 0B 512M
total 不含核心佔用;used 含快取;free 完全未使用;buff/cache 可隨時釋放。available(新版 free 提供)才是真正可給新程序用的記憶體。常用參數:-b/-k/-m/-g 指定單位;-s 2 每 2 秒更新一次;-h 人類可讀單位。
watch 搭配 free 持續監看# watch -n 2 -d free -h
-n 2:每 2 秒執行一次。-d:高亮顯示變動欄位。pdflush/flusher 執行緒定期回寫。si/so(vmstat)長期為 0 即代表記憶體充足。vmstat 綜合效能分析# vmstat 5 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 62792 3460 9116 88092 6 30 189 89 1061 569 17 28 54 2
0 0 62792 3400 9124 88092 0 0 0 14 884 434 4 14 81 0
...
| 區塊 | 欄位 | 含義 | 警戒值 |
|---|---|---|---|
| Procs | r | 可執行佇列進程數 | > CPU 核心數 × 2–4 持續偏高 |
| b | 等待 I/O 進程數 | 持續 > 0 表示 I/O 瓶頸 | |
| Memory | swpd | 已用 Swap (KB) | 持續增長 |
| free | 空閒記憶體 (KB) | 過低(< 5% total) | |
| buff | Buffer Cache (KB) | — | |
| cache | Page Cache (KB) | — | |
| Swap | si | 從磁碟換入 (KB/s) | 持續 > 0 代表記憶體不足 |
| so | 換出到磁碟 (KB/s) | 持續 > 0 同左 | |
| I/O | bi | 寫入區塊裝置 (塊/秒) | 配合 wa 觀察 |
| bo | 讀取區塊裝置 (塊/秒) | — | |
| System | in | 中斷數/秒(含時鐘) | 異常高需查驅動 |
| cs | Context Switch/秒 | 高 cs + 高 sy 可能鎖競爭 | |
| CPU | us | User 時間 % | — |
| sy | System 時間 % | 持續 > 30% 需關注 | |
| id | Idle % | 長期 < 40% 代表 CPU 壓力大 | |
| wa | I/O Wait % | 持續 > 20% 代表磁碟瓶頸 |
程式透過 malloc/new 申請堆疊記憶體後,未對應呼叫 free/delete 釋放,導致該記憶體區塊永不可再利用。長期運行的服務程式(Daemon)最易造成累積耗盡記憶體。
top、ps v 監控特定 PID 的 RSS(Resident Set Size)持續上升。valgrind --leak-check=full、mtrace (glibc hook)、AddressSanitizer (GCC/Clang -fsanitize=address)。pmap -x 分析記憶體映射;/proc//smaps 詳細統計。# 釋放 PageCache、dentries、inodes
# echo 3 > /proc/sys/vm/drop_caches
# 針對特定進程釋放記憶體(需 root,謹慎使用)
# kill -USR1 # 視程式是否實現 handler 釋放快取
# kill -9 # 強制終止,核心自動回收所有資源
警告:drop_caches 會暫時降低 I/O 效能;殺進程會中斷服務,務必先確認業務影響。
node_memory_* 指標,設定告警(available < 10%、swap_used > 0)。/proc/sys/vm/swappiness(預設 60,資料庫建議 1–10)、vfs_cache_pressure、min_free_kbytes。記憶體監控不只看「免費多少」,更要理解 buff/cache、Swap 活動、頁面回收機制。善用 free、vmstat、top/htop、/proc/meminfo 等工具,配合歷史趨圖與告警,才能在記憶體耗盡前精準介入,保障 Linux 伺服器長期穩定運行。