free 是 Linux 系統管理員最常用的記憶體檢視工具,但其輸出中的「buffers/cache」兩行常讓人困惑。本文以實際輸出為例,拆解每一欄含義,釐清 OS 視角與應用程式視角的差異。
為了方便說明,將輸出視為二維陣列 FO[行][列](行從 1 起算,列從 1 起算)。實際輸出共四行:
total used free shared buffers cached Mem: 15402628 15318812 83816 0 123456 12033012 -/+ buffers/cache: 15318812 15402628 Swap: 0 0 0

直觀易懂:total 總量、used 已用、free 剩餘。
FO[2][1] (total) = 15402628 KB:物理記憶體總量。FO[2][2] (used) = 15318812 KB:OS 認為已被佔用(含 buffers/cache)。FO[2][3] (free) = 83816 KB:OS 認為完全閒置的記憶體。等式 1: FO[2][1] = FO[2][2] + FO[2][3]
shared (第 4 列) 已棄用,通常為 0。buffers (第 5 列) 為待寫入磁塊裝置的資料;cached (第 6 列) 為從磁碟讀取並暫存的資料。兩者皆由核心管理,旨在提升 I/O 效能。
這行才是開發者、運維真正關心的「還能申請多少記憶體」。
FO[3][2] (-buffers/cache) = FO[2][2] - FO[2][5] - FO[2][6]:扣除 buffers/cache 後,應用程式實際佔用量。FO[3][3] (+buffers/cache) = FO[2][3] + FO[2][5] + FO[2][6]:應用程式可申請的實際可用量(含可快速回收的緩衝/快取)。因此 FO[3][3] » FO[2][3],這就是為什麼「free 顯示剩餘很少」但系統仍能跑新程式的原因。
# 釋放頁面快取 echo 3 > /proc/sys/vm/drop_caches # 讀取大文件兩次,第二次會快數倍(如 BerkeleyDB 讀 5G 快 9 倍)
free 由 procps 套件提供,所有數值源自 /proc/meminfo。可下載 procps 原始碼(最新 3.2.8)查看具體解析實現。