free 是 Linux 系統管理員最常用的內存查看工具,但其輸出的「used/free」含義常被誤解。本文深度解析 free 輸出各欄位含義、兩行「used/free」的本質區別、Buffer/Cache 回收機制,並給出準確判斷內存壓力的方法。
[root@dbrg-1 ~]# free
total used free shared buff/cache available
Mem: 319844 83632 236212 0 19128 46116
Swap: 2096472 0 2096472
關鍵欄位(以 KB 為單位,-m 顯示 MB,-h 人類可讀):
total - free - buff/cache(內核已分配給進程、內核結構、Buffer/Cache 的總和)。Buffers(塊設備元數據緩存)+ Cached(頁緩存、文件映射內存)。free 顯示):**應用程序可分配內存估值**,包含 free + 可回收的 buff/cache 部分,扣除內核保留內存。舊版 free 顯示兩行(`-/+ buffers/cache`),新版合併為 available 列,邏輯一致:
| 視角 | 第一行(Mem 行) | 第二行(-/+ buffers/cache) / available 列 |
|---|---|---|
| 含義 | 內核視角:所有已分配頁框 = used | 應用視角:可立即分配給新進程的內存 |
| used 計算 | total - free |
used - buffers - cached(即進程實際佔用) |
| free 計算 | 未分配頁框 | free + buffers + cached(可回收部分) |
| 樣例數值 | used=83632, free=236212 | used=18388, free=301456 |
結論:關注第二行 / available 列。第一行 used 包含大量可回收 Cache,不代表內存緊張;第二行 used 才是進程真實佔用,第二行 free / available 才是真正可用內存。
兩者均屬**可回收內存**:當應用申請內存不足時,內核 kswapd / 直接回收會優先釋放乾淨頁,髒頁先寫回磁盤再釋放。
free 輸出 Swap used > 0 且持續增長,**明確證明內存壓力大**,內核被迫換出匿名頁。vmstat si/so:si(swap in)、so(swap out)持續非零,系統在頻繁換頁,性能嚴重下降。/proc/meminfo 細節:Active/Inactive、Dirty/Writeback、Slab(內核對象緩存)、PageTables、KernelStack 等。dmesg | grep -i kill 出現 Out of memory: Kill process 即為實錘。sync # 刷新髒頁到磁盤,保證數據安全
echo 1 > /proc/sys/vm/drop_caches # 僅釋放 Page Cache
echo 2 > /proc/sys/vm/drop_caches # 僅釋放 dentry/inode (Slab)
echo 3 > /proc/sys/vm/drop_caches # 全部釋放(生產環境極不推薦)
警告:手動 drop_caches 會導致後續文件讀取必須重新從磁盤加載,**嚴重降低性能**,僅適用於基準測試前重置環境、內存泄漏應急排查等特殊場景。生產系統**切勿**定時任務執行。
| 指標 | 健康閾值 | 異常信號 |
|---|---|---|
| available / 總內存 | > 20% | < 10% 且持續下降 |
| Swap used | 0 或極小且穩定 | 持續增長、si/so 高 |
| Buff/Cache 佔比 | 40%-70% 正常 | 極低(I/O 密集型應用異常)或極高且不回收 |
| OOM Killer | 無 | 有觸發記錄 |
理解 free 兩種視角的區別,結合 vmstat、/proc/meminfo、Swap 行為綜合判斷,才能精準把握 Linux 內存真實狀態,避免誤判導致不必要的擴容或忽視真實風險。