
Proxmox VE 除了 KVM 虛擬機器之外,還提供了 LXC 容器,可以讓我們用最省的資源建置最大的應用。
不過,若您 LXC 使用的多,可能會發現一件奇怪的事:Swap 數字怎麼是錯的?
容器設定
先來看看一個實例,這裡有一台 LXC 容器,Memory 配予 1G,Swap 配予 512M。

在 PVE 的介面上看起來都相當良好,接下來我們進入 LXC 容器裡面看看會發生何事。
容器內部
一般查看記憶體使用情況的指令,會使用 free 來操作。

呃!Swap 怎麼變成 1.5G 了?竟然比 Memory 還多,太可怕了!
這一驚非同小可,趕快用其它方式查查看。


天啊,也都是一樣的結果,再換一支神器等級的工具來看看...

欸?不一樣了喔,glances 所看到的 Swap 容量是 3.6G...這容量也對不上,這台 LXC 是 512M。
回頭思考一下,其實 3.6G 這個數字是來自於這裡:

原來 3.6G 是 Host 主機的 Swap 容量,並不是 LXC 的,讓人有滿腦子的疑惑。
繼續追查
深入一點,我們從不同的地方來看 Swap 容量的資訊。

想要使用 fdisk -l 來查看 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

