Proxmox VE 除了 KVM 虛擬機器之外,還提供了 LXC 容器,可以讓我們用最省的資源建置最大的應用。
不過,若您 LXC 使用的多,可能會發現一件奇怪的事:Swap 數字怎麼是錯的?
容器設定
先來看看一個實例,這裡有一台 LXC 容器,Memory 配予 1G,Swap 配予 512M。
LXC 機器記憶體配置
在 PVE 的介面上看起來都相當良好,接下來我們進入 LXC 容器裡面看看會發生何事。
容器內部
一般查看記憶體使用情況的指令,會使用 free 來操作。
使用 free 指令查看 Swap 情況
呃!Swap 怎麼變成 1.5G 了?竟然比 Memory 還多,太可怕了!
這一驚非同小可,趕快用其它方式查查看。
使用 top 工具查看 Swap 情況
使用 htop 工具查看 Swap 情況
天啊,也都是一樣的結果,再換一支神器等級的工具來看看...
使用 glances 查看 Swap 情況
欸?不一樣了喔,glances 所看到的 Swap 容量是 3.6G...這容量也對不上,這台 LXC 是 512M。
回頭思考一下,其實 3.6G 這個數字是來自於這裡:
PVE Host Swap 使用情況
原來 3.6G 是 Host 主機的 Swap 容量,並不是 LXC 的,讓人有滿腦子的疑惑。
查看 /proc 下的 Swap 使用情況
情況不同了,在 /proc/meminfo 裡面的 Swap 大小仍然是錯的,但是 /proc/swaps 裡面就是正確的數字 (單位為 KB),這表示 LXC 裡面其實能有正確的資訊,但不是全部。
可是 /proc/swaps 裡面的 swap type 為何是 virtual?一般我們使用的是 partition 或 file,幾乎沒有看過是 virtual 的。
結論
依據這些數據來看,我們可以發現 Swap 在 LXC 裡面的大小,幾乎都是 LXC 設定裡的 Memory + Swap 的大小,也就是 1G + 512M = 1.5G。
為什麼會有這麼有趣的現象呢?PVE 開發團隊有做出過解釋。
他們的說法,是因為他們還沒有得到完全的 cgroups v2 支援,在沒有能支援之前,他們是不可能解決這個問題。
當我們建立 LXC 以後需要給予配置的 Memory 與 Swap,但是在目前的 Kernel 以 lxcfs (這也就是為什麼 Swap type 顯示為 virtual 的原因) 所能作出的限制,只能有兩種:
- Memory
- Memory + Swap
通常我們建立系統時,都會一併指定 Swap,在這個情況下,就造成了 LXC 裡面看到的 Swap 是兩者相加。
雖然 Swap 顯示的數字錯誤,但實際運作時這兩者會獨立分開,依據原有的設定做限制,只是看起來令人困擾。
參考資料
- LXC container using more than 100% SWAP | Proxmox Support Forum
https://forum.proxmox.com/threads/lxc-container-using-more-than-100-swap.31203/#post-211763
- docker 容器基础技术:linux cgroup 简介 | Cizixs Write Here
https://cizixs.com/2017/08/25/linux-cgroup/
- [經驗分享]資訊全面的系統監控神器 - Glances
http://blog.jason.tools/2017/04/glances-monitor-useful.html