VMwareで仮想環境を動かしている際、急にPCが重くなりしばらくすると何事もなかったように軽くなるという減少が頻発していました。
特に、Ubuntu (Linux) でWindowsの仮想環境を動かしている際に起こる事象です。
プロセスを確認したところ、kcompacd0というプロセスが悪さをしていそうだということが特定できました。
この記事では、kcompacd0というプロセスが原因で起きているVMwareが重くなる問題に対する解決策についてまとめます。
- Ubuntu(Linux)でVMwareを使っている。
- 仮想環境上でWindowsを動作させている。
- kcompacd0というプロセスが動作している。
解決策のみ知りたい方はこちら
kcompacdとは?
kcompacdはLinuxカーネルのスレッドの1つで、メモリ管理に関連する役割を果たしています。
Linuxシステムの実行中、タスクがメモリを割り当てたり開放したりすることによってメモリは断片化します。
通常、仮想メモリによって、断片化する物理領域を連続した範囲として扱うことができますが、物理的に連続した大きなメモリを確保する必要のあるケースがあるようです。
これらを解決するための方法として、メモリの圧縮を行う必要がありますが、kcompacdというスレッドはこれを行うもののようです。
kcompacdによるVMwareのフリーズへの解決策
kcompacdの解決策として、compaction_proactivenessというパラメータを設定する方法がVMware Communityにて共有されています。以降では、その解決策についてまとめます。
1回限りの対応策
rootユーザーとして以下のコマンドを実行します。
echo 0 > /proc/sys/vm/compaction_proactiveness
sudo suを実行することで、rootユーザーとして実行する環境に入ることができます。
永続的な対応策
毎回起動時にも設定を反映するためには、/etc/sysctl.confに、以下の設定を追加します。
vm.compaction_proactiveness=0
compaction_proactivenessとは?
以下では、解決策で設定したcompaction_proactivenessについてLinux kernelのドキュメントを元にまとめます。
compaction_proactivenessは、Linuxカーネルの仮想メモリ管理に関連するパラメータの1つで、メモリ圧縮の積極性を制御するものだそうです。
メモリ圧縮は、物理メモリ内の断片化を減らすために行われるプロセスで、メモリの断片化が進行している場合に実行され、断片を再配置して大きな領域を確保できるようにします。
compaction_proactivenessパラメータは、0から100までの範囲で指定され、値が高いほどコンパクションがより積極的に行われるものです。
例えば、compaction_proactivenessが低い値(例えば0)に設定されている場合、メモリ圧縮はより控えめに行われます。一方で、高い値(例えば100)に設定されている場合、メモリ圧縮がより積極的に実行されます。
Ubuntu 22.04 LTSでのデフォルトの値を確認したところ、20が設定されていました。


コメント