free 與 /proc/meminfo:記憶體深度分析 文章首圖

free 與 /proc/meminfo:記憶體深度分析

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

關鍵欄位解析

  1. MemAvailable vs MemFree: 如前所述,MemFree 僅代表完全空閒的記憶體。MemAvailable 則包含了可回收的 BuffersCached 以及部分 Inactive 記憶體。如果 MemAvailable 低於總記憶體的 10%,系統可能會開始感到吃力。

  2. Active vs Inactive

    • Active:近期被存取過的頁面,較不可能被移出記憶體。
    • Inactive:較久未存取的頁面,是核心回收記憶體的首選目標。
    • 注意區分 (anon)(匿名頁面,通常屬於應用程式數據)與 (file)(檔案頁面,屬於檔案快取)。
  3. AnonPages: 這代表應用程式實際使用的匿名記憶體頁數。如果 AnonPages 持續增長且 MemAvailable 下降,這才是真正的記憶體洩漏或負載過高的跡象。

  4. 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(實際實體記憶體)分析,可搭配 tophtop。在 htop 中,切換至 MEM% 欄位排序,並注意 RES 欄位與 VIRT 欄位的區別:VIRT 包含虛擬記憶體(可能未實際佔用 RAM),而 RES 才是實際佔用的物理記憶體。

小結

理解 Linux 記憶體管理的關鍵在於轉變觀念:不要只看 free,要看 available;不要只看 used,要看 AnonPagesCached 的比例。透過 free -h 快速掌握整體狀況,再深入 /proc/meminfo 分析細節,才能準確診斷系統效能瓶頸。記住,Linux 的核心目標是最大化記憶體利用率,因此適度的 buff/cache 高佔用反而是系統健康、效能良好的表現。