許多 Linux 使用者都曾對系統記憶體管理產生疑惑:明明關閉了程式,free 指令顯示的可用記憶體卻依然很少,大量記憶體被標記為 cached 或 buffers 佔用。這真的是記憶體洩漏嗎?其實這正是 Linux 核心為了提升 I/O 效能而設計的頁面快取機制。本文將深入剖析 Linux 記憶體運作原理,示範如何透過 /proc/sys/vm/drop_caches 手動釋放緩存,並探討是否真的有必要這麼做。
free 指令:真正的可用記憶體在哪裡?執行 free -m 時,輸出結果包含三行關鍵數據:
total used free shared buffers cached Mem: 249 163 86 0 10 94 -/+ buffers/cache: 58 191 Swap: 511 0 511
buffers(塊裝置緩存)與 cached(頁面快取,主要針對檔案 inode)的佔用。-/+ buffers/cache 才是系統真正可動用的記憶體視角。used = 163 - 10 - 94 = 58 MB(扣除緩存後的實際程式佔用)free = 86 + 10 + 94 = 191 MB(含緩存的實際可用空間)結論:Linux 會積極將閒置記憶體用於快取,加速檔案讀寫。當應用程式需要記憶體時,核心會自動回收這些快取頁面,無需人工干預。
執行 cp -r /etc ~/test/ 後再次檢視 free -m:
Mem: 249 244 4 0 8 174 -/+ buffers/cache: 62 187
此時 cached 飆升至 174 MB,free 僅剩 4 MB。等待一段時間後,數值幾乎無變化,證實核心並未主動釋放乾淨的快取頁面。
drop_caches 實戰自 Linux 2.6.16 起,核心提供 /proc/sys/vm/drop_caches 介面,允許管理員手動丟棄乾淨的快取、目錄項與 inode。操作步驟如下:
sync:將所有髒頁寫回磁碟,確保資料一致性。echo 1 > /proc/sys/vm/drop_caches:釋放頁面快取echo 2 > /proc/sys/vm/drop_caches:釋放目錄項與 inodeecho 3 > /proc/sys/vm/drop_caches:全部釋放(常用)實測執行 echo 3 > /proc/sys/vm/drop_caches 後:
Mem: 249 66 182 0 0 11 -/+ buffers/cache: 55 194
buffers 歸零,cached 降至 11 MB,free 回升至 182 MB,緩存確實被釋放。
雖然技術上可行,但在生產環境中強烈不建議常態化使用,理由有三:
Swap 使用率及 si/so(swap in/out)數值,而非 free 的第一行。若使用者看到 free 很小就以為記憶體不足,進而要求「釋放記憶體」,反而可能掩蓋真正的問題(如記憶體洩漏、Swap 暴增)。正確做法是建立正確的監控觀念:關注 Swap 活躍度,而非快取佔用量。
Linux 的記憶體管理機制極為成熟,快取佔用高是特性,而非缺陷。手動釋放緩存僅適合特定除錯場景(如基準測試前歸零環境),日常運維中應信任核心的自動回收機制,將精力放在監控 Swap 與應用層記憶體洩漏上。