CH-J Server Manager透過 SSH 管理伺服器
選單
所有指南與文章 →

如何讀懂 Linux 伺服器的 RAM、快取與 swap

了解 free 各欄的意義、為何記憶體使用量高通常沒有問題,以及哪些跡象才真正表示記憶體不足。

看 available,而非 free

Linux 會將原本閒置的記憶體用作磁碟快取,因此運作正常的伺服器可用的閒置記憶體很少是正常現象。available 欄是核心對新工作在不使用 swap 的情況下能取得多少記憶體的估計。應關注的就是這個數值。used 的確切計算方式取決於工具版本,因此不要在不同系統之間比較它。

free -h
grep -E 'MemAvailable|Shmem:|SReclaimable' /proc/meminfo

快取中哪些內容能釋放,哪些不能

應用程式需要記憶體時,頁面快取通常可以釋放。共享記憶體和 tmpfs(Shmem)也會計入 cache,但不能直接捨棄,因為其中的資料在磁碟上沒有副本。因此,快取很大而可用記憶體很少,通常表示 tmpfs 或共享記憶體區段很大。

df -h -t tmpfs
sudo slabtop -o | head -15

使用了 swap 不一定有問題

伺服器將很少使用的頁面放在 swap 中數週也可能沒有影響。真正有害的是持續換入換出。觀察 vmstat 的 si 和 so 欄:數值持續大於零,表示系統正在進行 swap 換頁,這是確實缺乏記憶體的跡象。

swapon --show
vmstat 1 5

找出誰在使用記憶體

依常駐記憶體將程序排序。RSS 會將程序之間共用的頁面計入每個程序,因此不能直接加總多個程序的數值。若已安裝支援 PSS 的工具,例如 smem,就能取得較合理的總量。

ps -eo pid,user,rss,comm --sort=-rss | head -15

辨識真正的記憶體不足

跡象包括可用記憶體很少、持續進行 swap 換頁,以及程序遭記憶體不足終止機制(out-of-memory killer)終止。請檢查核心紀錄。不要為了讓數值好看而執行 drop_caches:這只會讓伺服器重新從磁碟讀取資料,無法解決任何問題。

sudo journalctl -k --no-pager | grep -iE 'out of memory|oom-kill'

CH-J Server Manager 中的記憶體

System Monitor 透過 SSH 讀取這些數值。在 Linux 上,它將 used 定義為 MemTotal − MemFree − Buffers − Cached − SReclaimable,available 則採用核心估計值。共享記憶體是 Cached 的一部分,無法釋放;長條圖中的類別不會重疊。由於公式與部分版本的 free 不同,數值可能不完全一致。它也會顯示 swap 及其使用歷程。ZFS ARC 不另行處理,因此在 ZFS 主機上會計入已用記憶體。

詳細文件

man: free →

man: proc_meminfo →

生物辨識解除鎖定與安全性 →