torutkのブログ

ソフトウェア・エンジニアのブログ

WSL(Windows Subsystem for Linux)とHyper-V上のLinuxとの重さの違い

はじめに

Windows OS上でRedmineを動かす環境を用意し、さらにプラグイン開発環境も用意するのはかなり難儀なので、Windows OS上に仮想マシンVMwareVirtualBoxHyper-Vなど)を入れてその上にLinux OSを入れてRedmineを動かしていました。

ここで、最近のWindows 10アップデートでは、Windows Subsystem for Linux(以降WSLと呼ぶ)が標準で搭載されるようになったので、このWSL上にopenSUSEを入れて(Windowsストアから無償インストール)Redmineを動かし、プラグイン開発環境にしてみました。

しかし、WSL上でのRailsサーバーの起動やマイグレートコマンド、テストコマンドの実行にかなり待たされます。あまりに遅いので少し調べてみると、/mnt/d/... のように/mnt配下になるファイルのアクセスは、/mnt以外のファイルのアクセスに比べて数段遅いとありました。

そこで、WSL上の/mnt配下、/home配下、そして仮想マシン上でそれぞれRedmineのコマンドを実行した場合の時間を比べてみました。

環境

動作確認PCの構成
CPU AMD PhenomⅡ 1050T (2.8GHz)
Memory DDR3 16GB
Disk(Cドライブ) SSD SanDisk UltraⅡ 480GB
Disk(Dドライブ) HDD Western Digial 1002FAEX 1TB
OS Windows 10 Pro 1803 (64bit)
Linux動作環境

RedmineRuby on Railsアプリケーション)のプラグイン開発環境として、Pumaサーバー起動、minitestのテスト実行をするのに、Windows 10マシン上で次の2つの環境を用意しました。

実行時間の計測

この環境で、次の項目の実行時間を測ってみました(ストップウォッチ目測)。

No. 項目 WSL(/mnt/下) WSL(/home/下) Hyper-V
1 PUMA起動 37秒 14秒 3秒
2 pluginのmigreate 40秒 15秒 4秒
3 minitest unit 48秒 18秒 7秒

コマンドラインは次の通りです。

1のPUMA起動

bundle exec rails server -b 0.0.0.0

2のplugin migrate(pluginsディレクトリ下には1つだけプラグインを配置、既にmigrate済みの状態で実行)

bundle exec rails redmine:plugins:migrate

3のunit test(3ファイル、27 runs, 57 assertions)

bundle exec rails redmine:plugins:test:units NAME=RAILS_ENV=test

結果

Windows上の作業領域にredmineを展開すると、WSLのLinux上では/mnt/以下のパスとなるので圧倒的に遅くなります。
/home以下に展開すると幾分改善されますが、それでもHyper-V上よりも数段遅いという結果でした。

その他

WSLでの問題

Windows 10をスリープしながら使っていると、WSLの上でrubyrails)を実行するとクラッシュ(コアダンプ)するようになります。こうなると、Windows 10を再起動しないと解消しません。すべてのWSLコンソールを落とすと解消しました。

$ bundle exec rails server -b 0.0.0.0
=> Booting Puma
=> Rails 5.2.0 application starting in development
=> Run `rails server -h` for more startup options
/home/foo/redmine/vendor/bundler/ruby/2.4.0/gems/activesupport-5.2.0/lib/active_support/callbacks.rb:676: [BUG] pthread_cond_timedwait: Invalid argument (EINVAL)
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux-gnu]

-- Control frame information -----------------------------------------------
c:0081 p:---- s:0426 e:000425 CFUNC  :require
 :