私は組み込み開発をVMware上のUbuntuで行っています。
ここ数か月、それらのVMの速度が耐えられないほど遅くなりましたが、解決方法を探し当てたのでここに記しておきます。環境は以下の通りです。
- VMware Workstation v17
- Host OS : Windows 11
- Guest OS : Ubuntu 22.04 LTS
問題
ST MicroelectronicsのCubeIDEを使用している際、レスポンスが非常に遅くなる現象がありました。そして頻繁に下図のような警告が表示されます。こうなると、IDEを待っている時間の方が使っている時間より長くなってしまいます。
CubeIDEは遅いソフトウェアですが、ここまでではありません。
解決方法
以下の作業で解決できました。
- VMware Workstationの環境設定の中のメモリ設定を変更する。
- VMware Workstationの仮想マシン設定の中の詳細設定を変更する。
1が支配的です。1だけで9割がた問題が解決しました。残りのまれに起きる速度低下も2の変更を追加すれば解消しました。
詳細
最初に環境設定の中のメモリ設定を変更します。
メニューバーから[編集]->[環境設定]を選びます。環境設定ダイアログが現れますので、[メモリ]を選びます。この[補足メモリ]を「全仮想マシンのメモリを予約されたホストRAM内に適合させる」に設定します。以上で、問題はほぼ解決します。
日本語訳ががひどすぎるので何を言っているのか全く分かりませんが、原文は以下の通りです。
日本語 | 英語 |
---|---|
補足メモリ | Additional Memory |
全仮想マシンのメモリを予約されたホストRAM内に適合させる | Fit all virtual machine memory into reserved host RAM |
自動翻訳なのでしょうけど、元の英文が舌足らずであることもあいまってひどい日本語です。”all virtual machine memory”の訳を「全仮想マシンのメモリ」としているためにユーザーが勘違いしてしまいます。これは正しくは「仮想マシンの全メモリ」で、全く違う意味です。”Additional Memory”は”Additional Memory Settings”の意でしょう。
とにかく、この変更でVMのメインメモリがホストOSのメインメモリに割り当てられ、速度低下が小さくなります。
次に仮想マシン設定の詳細設定を変更します。
メニューバーから[仮想マシン]->[設定…]を選びます。仮想マシン設定ダイアログが開くので、[オプション]->[詳細を選んでください]。ここで[設定]の中で「メモリページのトリミングは許可されません」と「サイドチャンネルの緩和策がHyper-Vが有効なホストで有効になっていません」をチェックします。
この日本語訳も人間の暴力性向をあおるようなひどさです。原文は以下の通り。
メモリページのトリミングは許可されません | Disable memory page trimming |
サイドチャンネルの緩和策がHyper-Vが有効なホストで有効になっていません | Disable Side Channel Mitigations for Hyper-V enabled hosts |
これもめまいがするようなひどい日本語です。命令形として訳すべき文章を宣言として訳しているため、ユーザーが自分の操作に対して何が起きるのか理解できなくなっています。前後のチェックボックスが命令形なため、一層混乱します。
メモリページのトリミングを禁止すると、ゲストOSが使用していないメモリページをVMwareがホストOSに返却します。これはホストOS上のプログラムの性能を上げる効果がありますが、いざゲストがそのページを必要とするときに取得オーバーヘッドが発生します。ですので、チェックしてディセーブルすれば性能が上がります。
Side Channel攻撃への緩和策は最近問題になっていたx86アーキテクチャのかなり深いところにある脆弱性です。この対策は性能劣化を引き起こすので、ディセーブルすれば性能劣化が小さくなります。自分のVM間のセキュリティリスクをよく検討し、対策が不要であればチェックしてディセーブルするとよいでしょう。
まとめ
VMware社のビジネスはサーバーを向いいます。そのため、なるべく多くのゲストOSをひとつのホストOSで動かすための工夫があちこちに凝らされています。その結果、ワークステーション利用の場合は複数の性能低下要因があちこちに分散していることになります。
日本市場の地位が低下しているためかUIの日本語の品質はひどい有様であり、それが設定のわかりにくさに輪をかけています。
このエントリがどなたかの役に立てば幸いです。