free 與 /proc/meminfo:記憶體深度分析
在 Linux 系統管理與效能調校中,記憶體(RAM)的使用狀況往往是第一線排查的重點。許多初學者看到 free 指令輸出的「free」欄位數值變小,便驚慌失措地認為記憶體洩漏或系統資源匱乏。事實上,Linux 的核心設計哲學與 Windows 截然不同,它奉行「閒置記憶體即是浪費」的原則。為了讓系統運作更流暢,Linux 會積極利用空閒記憶體來快取檔案與目錄結構。因此,要真正理解 Linux 記憶體狀態,不能僅憑直覺,必須深入剖析 free 指令與底層的 /proc/meminfo 檔案。
解讀 free 指令的迷思
free 是最直觀的記憶體檢視工具。在現代 Linux 發行版(如 Ubuntu 22.04 或 Debian 12)中,預設輸出單位已改為 MB 或 GB,而非古老的 KB。
執行以下指令可查看基本狀態:
free -h
輸出結果通常如下:
total used free shared buff/cache available
Mem: 15Gi 4.2Gi 1.8Gi 350Mi 9.1Gi 10Gi
Swap: 2.0Gi 0B 2.0Gi
這裡最關鍵的欄位並非 free,而是 available。
- total:系統物理記憶體總量。
- used:實際被應用程式佔用的記憶體。
- free:完全未被使用的空閒記憶體。這個數值通常很小,因為核心會將其挪用至快取。
- buff/cache:用於區塊快取(buffer)和頁面快取(cache)的記憶體。當應用程式需要記憶體時,這部分記憶體可以被迅速回收。
- available:估算值,代表在不交換(swap)的情況下,應用程式仍可啟動的新程式大約能使用多少記憶體。這是判斷系統是否記憶體不足的黃金指標。
深入 /proc/meminfo:細節決定成敗
free 提供了宏觀視角,而 /proc/meminfo 則提供了微觀細節。這個虛擬檔案系統介面動態反映核心記憶體狀態。
cat /proc/meminfo | head -20
輸出範例:
MemTotal: 16384000 kB
MemFree: 1856000 kB
MemAvailable: 10240000 kB
Buffers: 120000 kB
Cached: 8500000 kB
SwapCached: 0 kB
Active: 5600000 kB
Inactive: 2100000 kB
Active(anon): 3200000 kB
Inactive(anon): 400000 kB
Active(file): 2400000 kB
Inactive(file): 1700000 kB
Unevictable: 10000 kB
Mlocked: 10000 kB
SwapTotal: 2097152 kB
SwapFree: 2097152 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 3500000 kB
Mapped: 450000 kB
Shmem: 35000 kB
關鍵欄位解析
-
MemAvailable vs MemFree: 如前所述,
MemFree僅代表完全空閒的記憶體。MemAvailable則包含了可回收的Buffers、Cached以及部分Inactive記憶體。如果MemAvailable低於總記憶體的 10%,系統可能會開始感到吃力。 -
Active vs Inactive:
- Active:近期被存取過的頁面,較不可能被移出記憶體。
- Inactive:較久未存取的頁面,是核心回收記憶體的首選目標。
- 注意區分
(anon)(匿名頁面,通常屬於應用程式數據)與(file)(檔案頁面,屬於檔案快取)。
-
AnonPages: 這代表應用程式實際使用的匿名記憶體頁數。如果
AnonPages持續增長且MemAvailable下降,這才是真正的記憶體洩漏或負載過高的跡象。 -
Slab / SReclaimable: Slab 快取用於管理核心內部結構。
SReclaimable是可回收的 Slab 記憶體,若此數值過高,可能表示系統中有大量小物件分配未釋放。
常見問題與排查技巧
Q1: free 顯示記憶體快取很高,但 available 卻很低,怎麼辦?
這通常發生在系統剛啟動大量檔案讀取操作後,或者某些應用程式(如資料庫)佔用了大量檔案快取。首先檢查 MemAvailable 是否真的低於安全閾值。如果 MemAvailable 仍然充足,則無需擔心。若確實不足,可以手動觸發記憶體回收(僅供測試,生產環境謹慎使用):
# 同步快取寫入磁碟
sync
# 釋放快取(需要 root 權限)
echo 3 > /proc/sys/vm/drop_caches
Q2: 如何找出佔用記憶體最多的程序?
結合 free 的概觀與 ps 的細節,可以使用以下指令排序找出記憶體使用率最高的前 10 個程序:
ps aux --sort=-%mem | head -11
若需更精確的 RSS(實際實體記憶體)分析,可搭配 top 或 htop。在 htop 中,切換至 MEM% 欄位排序,並注意 RES 欄位與 VIRT 欄位的區別:VIRT 包含虛擬記憶體(可能未實際佔用 RAM),而 RES 才是實際佔用的物理記憶體。
小結
理解 Linux 記憶體管理的關鍵在於轉變觀念:不要只看 free,要看 available;不要只看 used,要看 AnonPages 與 Cached 的比例。透過 free -h 快速掌握整體狀況,再深入 /proc/meminfo 分析細節,才能準確診斷系統效能瓶頸。記住,Linux 的核心目標是最大化記憶體利用率,因此適度的 buff/cache 高佔用反而是系統健康、效能良好的表現。