Linux 記憶體管理採用「主動緩存、被動回收」策略,導致 free 輸出的 used 极高 (常超 90%),誤以為記憶體不足。本文深度解析 free -m 三行數據含義、Buffers/Cache 區別、真實可用記憶體計算公式、/proc/meminfo 關鍵指標、監控告警閾值設定與常見誤區,助你建立正確的記憶體觀。
$ free -m
total used free shared buffers cached
Mem: 1002 769 232 0 62 421
-/+ buffers/cache: 286 715
Swap: 1153 0 1153
| 欄位 | 含義 | 本例數值 |
|---|---|---|
| total | 物理記憶體總量 | 1002 MB |
| used | 已分配給進程 + 內核緩存 (buffers + cached) | 769 MB |
| free | 完全空閒、未被任何頁框佔用 | 232 MB |
| shared | tmpfs 佔用 (舊內核顯示 0,新內核顯示實際值) | 0 MB |
| buffers | Block Device 緩存 (元數據、目錄項、inode 表) | 62 MB |
| cached | Page Cache (文件頁面內容、mmap 文件、頁面緩存) | 421 MB |
關係:total = used + free (1002 = 769 + 232)
| 欄位 | 計算公式 | 含義 | 本例數值 |
|---|---|---|---|
| used (-buffers/cache) | Mem.used - buffers - cached | 進程實際佔用的「匿名頁 + 堆/棧 + 共享內存」等不可回收內存 | 286 MB |
| free (+buffers/cache) | Mem.free + buffers + cached | 應用程序可申請到的記憶體上限 (含可回收緩存) | 715 MB |
核心結論:真實記憶體壓力看第二行 used (286 MB),而非第一行 used (769 MB)。 只要 free (+buffers/cache) 充足且 Swap 不活躍,系統即健康。
used = 0 表示無內存壓力觸發換頁。Swap used > 10% total 或 si/so (vmstat) 頻繁非零,才意味著物理記憶體不足需擴容。| 維度 | Buffers (Buffer Cache) | Cache (Page Cache) |
|---|---|---|
| 緩存對象 | 磁碟塊 (Block) - 元數據、目錄結構、inode、位圖 | 文件頁面 (Page) - 文件內容、mmap 區域、可執行文件代碼段 |
| 典型場景 | 文件系統掛載/卸載、目錄遍歷、inode 查找、Journal 寫入 | 讀寫文件內容、執行程式碼、共享庫加載、mmap 數據庫 |
| 回收優先級 | 較低 (元數據修改需同步回寫) | 較高 (唯讀頁面可直接丟棄,髒頁需回寫) |
| 查看命令 | cat /proc/meminfo | grep -i buffer | cat /proc/meminfo | grep -i ^cached |
MemTotal: 1026048 kB
MemFree: 237568 kB
MemAvailable: 732140 kB # 核心指標:內核估算的可分配給新進程內存 (含可回收緩存、預留)
Buffers: 63484 kB
Cached: 431156 kB
SwapCached: 0 kB
Active: 312456 kB # 近期活躍頁面
Inactive: 298764 kB # 非活躍頁面 (優先回收)
Active(anon): 156780 kB
Inactive(anon): 145236 kB
Active(file): 155676 kB
Inactive(file): 153528 kB
Unevictable: 0 kB # mlock/VM 鎖定不可回收
Mlocked: 0 kB
SwapTotal: 1180668 kB
SwapFree: 1180668 kB
Dirty: 124 kB # 待回寫髒頁
Writeback: 0 kB
AnonPages: 289456 kB # 匿名頁 (堆/棧/共享內存) - 真實進程佔用核心
Mapped: 45672 kB # mmap 映射
Shmem: 12344 kB # tmpfs/shared memory
Slab: 56784 kB # 內核 Slab 分配器 (inode/dentry cache 等)
SReclaimable: 42312 kB # Slab 中可回收部分
SUnreclaim: 14472 kB # Slab 中不可回收
KernelStack: 2344 kB
PageTables: 5672 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 1693692 kB # 記憶體過度提交限制
Committed_AS: 567892 kB # 當前提交總量
VmallocTotal: 34359738367 kB
VmallocUsed: 0 kB
VmallocChunk: 0 kB
HardwareCorrupted: 0 kB
AnonHugePages: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
HugePageSize: 2048 kB
DirectMap4k: 4096 kB
DirectMap2M: 1044480 kB
黃金指標:MemAvailable (內核 3.14+ 提供) 最接近真實可用內存,監控告警應以此為準。
| 指標 | 健康閾值 | 告警閾值 | 嚴重閾值 | 採集方式 |
|---|---|---|---|---|
| MemAvailable / MemTotal | > 30% | < 20% | < 10% | node_exporter / free -m |
| Swap Used / Swap Total | = 0% | > 5% | > 20% | node_exporter / free -m |
| pgpgin/pgpgout (vmstat) | 低且平穩 | 持續上升 | 劇烈波動 | vmstat 1 / node_exporter |
| si/so (vmstat) | 0 | > 0 持續 | > 100/s | vmstat 1 |
| Dirty / MemTotal | < 5% | > 10% | > 20% | /proc/meminfo |
| OOM Killer 事件 | 0 | > 0 | > 0 | dmesg / journalctl -k |
-/+ buffers/cache 行的 free 或 MemAvailable。echo 3 > /proc/sys/vm/drop_caches 會導致後續讀取變慢,僅用於基準測試前重置。Linux 記憶體管理的精髓在於 將空閒內存最大化利用為緩存 (Buffers/Cache),並在應用需要時毫秒級回收。正確讀懂 free、/proc/meminfo、vmstat,關注 MemAvailable、Swap 活躍度、OOM 事件,才能建立科學的容量規劃與告警體系,避免因誤讀指標導致不必要的擴容或業務中斷。
五大 Linux 效能診斷指令:top、vmstat、iostat、sar、pidstat 實戰解析
Linux Sendmail + Cyrus-IMAPD 郵件系統搭建完整指南
Cacti 整合 SNMP 自定義腳本監控實戰:以 TCP 連線數為例
Linux 重導向輸出提示 cannot overwrite existing file 解決方法
Shell 正則表達式實用範例速查:grep/sed/awk 常用模式與元字元完整對照表
vsftpd「Entering Passive Mode」卡住的三種解決方案