Proxmox VE 主機的 swap 用量越來越高,想知道到底是哪一台 VM 吃掉最多 swap,用 free 或 top 都看不出來:free 只有總量,top 預設也不顯示每個程序的 swap 用量。
這時候 smem 很好用,它可以列出每個程序的 swap 與實際記憶體用量,並依指定欄位排序,一眼就能看出是哪一台。

安裝
apt install smem
找出用最多 swap 的 VM
依 swap 用量由大到小排序,只看前幾筆:
smem -s swap -r | head -n 5
PID User Command Swap USS PSS RSS
11938 root /usr/bin/kvm -id 170 -name 42599700 22674700 23489570 27412972
13235 root /usr/bin/kvm -id 667 -name 25685552 1296276 1611772 7527292
18462 root /usr/bin/kvm -id 666 -name 25408420 2421920 2731459 7814792
21446 root /usr/bin/kvm -id 126 -name 5640456 262200 306394 530272
-s swap:依 swap 欄位排序-r:由大到小排列- 單位是 KB,加上
-k參數會自動換算成 K、M、G 顯示
PVE 的每一台 VM 都是一個 kvm 程序,-id 後面的數字就是 VM ID。以上面的結果來說,VM 170 用了約 40GB 的 swap,就是最主要的來源。
加上 -c 指定要顯示的欄位,輸出會比較精簡:
smem -s swap -r -k -c "pid command swap uss" | head -n 5
依實際記憶體用量排序
依 USS 由大到小排序:
smem -s uss -r | head -n 5
smem 的幾個記憶體欄位意義如下:
| 欄位 | 說明 |
|---|---|
| USS | 該程序獨佔的記憶體,程序結束後會釋放的量 |
| PSS | USS 加上共用記憶體依使用的程序數平均分攤 |
| RSS | 程序實際佔用的實體記憶體,共用的部分會被重複計算 |
| Swap | 被換出到 swap 的量 |
要看「這台 VM 實際佔了多少記憶體」,看 USS 或 PSS 會比 RSS 準確,因為 RSS 會把共用函式庫重複計算。
其他用法
依使用者統計記憶體用量,以百分比顯示:
smem -u -p
查看系統整體的記憶體分布(核心、快取、程序等):
smem -w -p
找到之後怎麼處理
找到吃最多 swap 的 VM 之後,可以依情況處理:
- 檢查 VM 記憶體配置:VM 內部記憶體用量長期偏高,考慮調高配置的記憶體
- 檢查主機記憶體是否超賣:所有 VM 配置的記憶體加總超過主機實體記憶體太多,主機就容易用到 swap
- ZFS 的 ARC:主機使用 ZFS 時,ARC 也會佔用不少記憶體,必要時可以限制 ARC 上限
- 調整 swappiness:降低
vm.swappiness,讓系統比較不積極使用 swap
注意:VM 的記憶體被換出到 swap 之後,即使主機記憶體已經空出來,也不會自動換回來。可以等 VM 自然存取,或在維護時段重新啟動該 VM。
結論
smem 是一個很小、但很實用的工具,找出「是哪一台吃掉 swap」只要一行指令。搭配 PVE 的 VM ID,就能快速定位問題,再決定是要調整 VM 的記憶體配置,還是主機本身的記憶體規劃。
參考資料
- smem 官方網站
https://www.selenic.com/smem/ - Debian 套件:smem
https://packages.debian.org/stable/smem - Proxmox VE 官方文件:ZFS on Linux(Limit ZFS Memory Usage)
https://pve.proxmox.com/wiki/ZFS_on_Linux



