Kernel Samepage Merging (KSM) は、Linux カーネルによって提供されるオプションのメモリ重複排除機能であり、Proxmox VE ではデフォルトで有効になっています。
同じOSが複数動いている仮想環境でメモリ使用量の最適化出来ます。
今回、ふとしたことからこの設定を変更して挙動を見ることが出来たのでメモしておきます。
環境
- Proxmox VE 8.1.3 x 3台のクラスタ (ISOファイルのダウンロード)
- メモリ128GB
- 1ノードあたり、12GBのメモリを割り当てたWindows11の仮想マシンが7台
経緯
3台のProxmoxVEクラスタで同じ量のVMを動かしているのに、1台だけメモリ容量が少なくて『なんでだろ?』と思っていました。
ある時ノードのサマリ画面でKSM sharing
がメモリ使用量の少ないノードだけ40GB程になっており、他の2台は0GBでした。
『同じ設定のはずなのにKSMの状況が違う?』と思い調べてみることにしました。
やってみたこと
-
まずは実際にKSMが有効かどうかを調べることにしました。
cat /sys/kernel/mm/ksm/run
※出力が 1 ならば、KSMは有効になっています。0 の場合は無効です。
★結果、状況が示す通り、1台は1、他2台は0でした。
-
Proxmoxのフォーラムを検索するとジャストな話題が!
どうやら/etc/ksmtuned.conf
の設定値KSM_THRES_COEF=20
によってKSMが動作の開始タイミングが変わるようです。 -
フリーメモリがこの割合以下になった場合にKSMが動作を開始するための閾値です。デフォルトは20%です。
KSM_SLEEP_MSEC
とKSM_NPAGES_MAX
も合わせて以下のように設定しました。-
KSM_THRES_COEF=99
- 上記の通り、フリーメモリがこの割合以下になった場合にKSMが動作を開始するための閾値。Default 20 → 99
-
KSM_SLEEP_MSEC=50
- KSMスキャン間のスリープ時間。大きいサーバでは短くすることが推奨らしい。Default 100 → 50
-
KSM_NPAGES_MAX=1250
- KSMによってスキャンされるページ数の最大値。Default 1250 → 5000
vim /etc/ksmtuned.conf KSM_THRES_COEF=99 KSM_SLEEP_MSEC=50 KSM_NPAGES_MAX=1250
-
-
上記のように
/etc/ksmtuned.conf
を書き換えたらksmtuned
サービスを再起動します。systemctl restart ksmtuned
-
KSMが有効かどうかを確認します。
cat /sys/kernel/mm/ksm/run 1 ※有効になっていることが確認できた
-
少し待っていたらみるみる
KSM sharing
の値が増え、メモリ使用量が減っていきました。
メモリ使用率65%程だったものが20%程まで圧縮され、心躍りました!!
注意点
以下ProxmoxのWikiより
KSM はメモリ使用量を削減できますが、VM をサイドチャネル攻撃にさらす可能性があるため、セキュリティ リスクも伴います。調査によると、KSM の特定の特性を利用することで、同じホスト上の 2 番目の VM を介して、実行中の VM に関する情報を推測できることがわかっています。
したがって、Proxmox VE を使用してホスティング サービスを提供している場合は、ユーザーに追加のセキュリティを提供するために、KSM を無効にすることを検討する必要があります。さらに、KSM の無効化が法的要件となっている場合があるため、国の規制を確認する必要があります。
しかし、、リスクの少ない環境であれば、
沢山の同じOSのVMを稼働させる時に、この効率化はめちゃめちゃ魅力的だと思いました!