一部のホストマシン上でVirtualBox等でLinux仮想マシンを動かすと、仮想マシン上のあらゆる処理が説明がつかないくらいに重い場合があります。その場合に仮想マシンに対して本記事にある設定をして高速化を図ることをお勧めします。特にHDDを搭載しているホストマシン上の仮想マシンが異様に遅いと悩んでいる方は、この記事に記載しているIOスケジューラの変更をすることにより劇的に改善する可能性があります。
主にVirtualBoxを前提に記載していますが、VMWare等の他のハイパーバイザにも適用できます。
NOTE: ちなみにホストマシン自体が絶望的に遅い環境の場合は、改善する望みはほとんどないため期待しないほうが良いでしょう。
CPUコア数、メモリを増やす
VirtualBoxでは仮想マシン毎にCPUコア数とメモリサイズを設定可能です。ホスト側のリソースに余裕がある場合は多めに割り当てましょう。
仮想マシンでIntelliJやEclipseを使ったり、ブラウザでタブをたくさん開いたり、Dockerコンテナを並列に動かしたりしているのにCPUコア1個、メモリ512MBとかでは遅いのは当たり前です。
VirtualBox Guest Additionsを導入する
VirtualBox Guest Additionsを仮想マシンにインストールすることで、3Dアクセラレーション等が有効になります。特にGUI環境の描画がもたついている場合は必ずインストールして、仮想マシンのビデオメモリを最大(128MB)に設定しましょう。
(重要) IOスケジューラをcfq以外にする
おそらく一般的なLinuxディストリビューションのデフォルトIOスケジューラはcfqになっています。Linux仮想マシンも同様のため、LinuxのIOスケジューラをcfqからnoop/deadlineに変更しましょう。設定方法は下記URLが参考になります。
SSDにしたのでI/Oスケジューラを noop に変更してみた
下記URLに理由が記載されているので割愛しますが、要するにホスト側やハイパーバイザでもIOスケジューリングが行われるため、仮想マシン上でcfqのような複雑なIOスケジューリングは無駄です。
特に以下の条件や症状に該当する人は、何よりもIOスケジューラを変更することをお勧めします。
- ホストマシンがSSDではなくHDDを搭載している
- 仮想マシンのOS起動が異様に遅い (3分~5分以上)
- 他に何もしてないのに仮想マシンOS上のパッケージインストール(ex. apt install)、コンパイル、Dockerコンテナ操作等が異様に遅い
- topコマンドのCPU使用率でwaitが異様に高い (30%~50%以上)
ちなみに仮想マシンでなくても、SSD/ハードウェアRAID環境ではcfq以外のIOスケジューラにすることがお勧めです。下記URLにある通り、環境次第ではIO周りの性能が劇的に改善します。一部海外サイトのベンチマークでは差がないというデータも出ていますが、個人的な経験でも実運用上は明らかにIO性能に大きな改善がみられることが多いです。
Noop I/O scheduling with SSD storage
ファイルシステムをチューニングする
ext4の場合、以下のファイルシステムオプションを付与することでIO周りのパフォーマンスが劇的に改善する場合があります。
- data=writeback (ただし事前にtune2fsコマンドで有効化が必須)
- barrier=0
- nobh
- noatime
ただし開発用途の仮想マシンでDBサーバー並みの高負荷IO処理が必要なことはあまりないでしょうし、ファイルシステム周りのチューニングによって意図しないマシン電源断などの時にデータが壊れやすくなるというトレードオフもあります。このためIO性能を絞りだしたい場合以外は積極的にはお勧めしません。
興味がある人はGoogle等でext4
と上記キーワードを一緒に検索すれば、設定例を掲載しているページを見つけることができます。