跳到主要內容
節省工具箱Jason Tools
經驗分享

使用 smem 找出 Proxmox VE 上 swap 用量最高的 VM

Jason Cheng 發布 瀏覽 2 次
使用 smem 找出 Proxmox VE 上 swap 用量最高的 VM
本文目錄
  1. 安裝
  2. 找出用最多 swap 的 VM
  3. 依實際記憶體用量排序
  4. 其他用法
  5. 找到之後怎麼處理
  6. 結論
  7. 參考資料

Proxmox VE 主機的 swap 用量越來越高,想知道到底是哪一台 VM 吃掉最多 swap,用 free 或 top 都看不出來:free 只有總量,top 預設也不顯示每個程序的 swap 用量。

這時候 smem 很好用,它可以列出每個程序的 swap 與實際記憶體用量,並依指定欄位排序,一眼就能看出是哪一台。

smem 常用指令
smem 常用指令

安裝

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該程序獨佔的記憶體,程序結束後會釋放的量
PSSUSS 加上共用記憶體依使用的程序數平均分攤
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 的記憶體配置,還是主機本身的記憶體規劃。

參考資料

Jason Cheng

Jason Cheng

企業開源技術顧問,專注架構規劃與實務導入

關於作者 →

延伸閱讀