free 顯示的 free 記憶體總是很少?初次使用 free 的運維常會驚訝:「我的記憶體快用光了!」實則不然。Linux 採用「記憶體不用白不用」的積極緩存策略:將閒置記憶體主動用作 Buffer(塊設備緩存) 與 Cache(頁面緩存/目錄項緩存),以加速檔案讀寫。這部分記憶體在應用程式需要時可毫秒級回收,實質上屬於「可用記憶體」。
total used free shared buff/cache available
Mem: 3266180 3250004 16176 0 2778884 2795064
Swap: 2048276 80160 1968116
| 行 | 視角 | used 含義 | free/available 含義 |
|---|---|---|---|
| 第 1 行 (Mem) | 作業系統核心視角 | 核心已分配給進程 + 核心內部結構 + Buffer + Cache | 完全未被觸碰的物理頁框數 |
| 第 2 行 (-/+ buffers/cache) | 應用程式視角(最關鍵) | 進程實際佔用的物理記憶體(不含可回收緩存) | 真正可供新進程分配的記憶體 = free + buffers + cached |
| 第 3 行 (Swap) | 交換分區視角 | 已換出到磁碟的匿名頁面 | 剩餘交換空間 |
公式驗證:
available (2795064) = free (16176) + buffers (110652) + cached (2668236)
used (471116) = total (3266180) - available (2795064)
/proc/meminfo 關鍵欄位詳解| 欄位 | 含義 | 運維關注點 |
|---|---|---|
MemTotal | 物理記憶體總量 | 容量規劃基準 |
MemFree | 未分配頁框(對應 free 第 1 行 free) | 過低觸發 kswapd 回收 |
Buffers | 塊設備元資料緩存(inode、目錄項等) | 通常較小,幾十 MB |
Cached | 頁面緩存(檔案內容、mmap 映射) | 主要記憶體消費者,可積極回收 |
SwapCached | 已換出但仍在記憶體中的頁面 | 非零表示曾發生換入 |
Active / Inactive | 活躍/非活躍頁面(LRU 列表分類) | Inactive 為首選回收目標 |
Dirty | 待寫回磁碟的髒頁面 | 大量堆積時觸發 pdflush/kworker 寫回 |
Writeback | 正在寫回磁碟的頁面 | 持續高值暗示 I/O 瓶頸 |
Mapped | mmap 映射的記憶體(含共享庫) | 大型進程記憶體佔用參考 |
Slab | 核心 Slab 分配器佔用(inode、dentry 等) | 持續增長可能洩漏 |
Committed_AS | 核心承諾分配的虛擬記憶體總量 | 超過 CommitLimit 觸發 OOM Killer |
VmallocTotal/Used/Chunk | 核心虛擬地址空間(vmalloc 區)使用情況 | 模組載入、大記憶體分配相關 |
HugePages_* | 大頁面(HugeTLB)統計 | 資料庫、Java Heap 優化關鍵 |
當 可用記憶體(available)低於水位線 時,核心喚醒 kswapd 執行頁面回收:
writeback),延遲較大。水位線可透過 /proc/sys/vm/min_free_kbytes(預設約總記憶體 1~3%)間接調整,或直接修改 vm.swappiness(0~100,預設 60)控制 Swap 激進程度。
/proc/PID/ 實戰/proc/PID/status:人類可讀摘要,含 VmRSS(常駐集大小)、VmSize(虛擬地址空間)、VmSwap(換出大小)。/proc/PID/smaps:每個 VMA 區域的詳細 RSS/PSS/Dirty/Referenced/AnonHugePages 統計,定位記憶體洩漏、透明大頁效果的利器。/proc/PID/smaps_rollup(Kernel 4.1+):smaps 聚合版,快速獲取進程級 PSS/RSS/Swap。| 指令 | 用途 | 推薦參數 |
|---|---|---|
free | 快速概覽 | -h(人類可讀)、-w(分欄 buffers/cache)、-s 1(每秒刷新) |
vmstat | 系統級記憶體/CPU/IO 綜合 | 1 10(每秒採樣 10 次)、-a(顯示 active/inactive) |
pidstat | 進程級記憶體/CPU/I/O | -r 1(記憶體)、-u 1(CPU)、-d 1(I/O) |
smem | 基於 PSS 的真實記憶體佔用報表 | -tk(樹狀+KB)、-p nginx(按進程名過濾) |
numastat | NUMA 節點記憶體分佈 | -m(顯示每節點 meminfo)、-p PID |
Linux 記憶體管理的核心哲學是「積極緩存、按需回收」。運維不應盯著 free 第一行的 free 值發愁,而應關注 available(可用記憶體)、Swap 活動頻率、Dirty 頁面堆積 以及 進程級 RSS/PSS 趨勢。掌握 /proc/meminfo 與 /proc/PID/smaps 的讀法,才能在記憶體壓力、OOM Killer、效能抖動等疑難雜症中游刃有餘。
Linux 系統管理四大經典技巧:特殊檔名處理、Loadlin 直接安裝、X 死鎖救援、日誌式檔案系統快速關機
UNIX 系統五大經典啟動故障與急救修復實戰:Boot/Unix/Shell/Init/Uadmin 遺失損壞完整解決方案
Linux 聲卡驅動安裝與配置全攻略:ALSA 編譯安裝、模組對照表與疑難排解
Shell Script 變數完整指南:從系統變數到使用者自定義變數
Linux LVM 安全移除物理卷 (PV) 完整實戰:縮減邏輯卷、pvchange 離線、pvmove 資料遷移、vgreduce 移除、掛載驗證零資料遺失
Linux 叢集架構支撐石家莊供水 60 萬戶計費系統:高可用、低成本實戰案例
Linux 虛擬終端顯示中文原理與 CJKTTY 补丁實現:從 VGA 文字模式到 Wayland System Compositor