はのちゃ爆発

はのちゃが技術ネタとか日常のこととかを書いてます。

WSL2 が来たので試しに入れて雑な性能測定をした

お久しぶりです、はのちゃです。昨年末のはの飯アドベントカレンダーをやって力尽きていたようです。

先日待望の Windows Subsystem for Linux 2 (WSL2) プレビュー版が出た ので、早速試してみました。 果たして Windows 上で快適な Ruby 開発を行うという夢は叶うのでしょうか。

前準備

なにはともあれ「Windows の設定」を開きます。開いたら「更新とセキュリティ」に行きます。

f:id:hano_tea:20190616181104j:plain

「更新とセキュリティ」が開いたら一番下、 Windows Insider Program をクリック。

f:id:hano_tea:20190616200857j:plain

この辺はどんな画面になるかが人によって変わると思うので参考程度にどうぞ。

上記のような「Insider Preview ビルドを受け取る」という表示になっていたら「開始する」ボタンを押して、 Insider Preview を受け取る設定をします。 途中で「どのようなコンテンツの~」というような選択肢が出てきたら「Windows のアクティブな開発」を選びます。後で変えられるので違うの選んでも平気ですが。

設定が正しく終わったら以下の画像のようになるはず。

f:id:hano_tea:20190616201421j:plain

ポイントは「新しいビルドを取得する頻度はどの程度を希望されますか?」のところが「ファースト」になっていること。 選択肢としては「スロー」か「ファースト」の二択ですが、「ファースト」にしないと最新のプレビューが降ってこないので注意しましょう。

(「ファストリング」と「スローリング」の2つだった気がするので「ファースト」じゃない気がするんですが…)

あとは放置してたらそのうち最新の Insider Preview のダウンロードとインストールが始まるはずです。 なかなか始まらないときは同じ「更新とセキュリティ」画面内の Windows Update を開いて、更新をチェックするとダウンロードが始まるかも。

WSL2 のインストール

公式ドキュメントがわかりやすいので、基本的には以下のページを見ながらやれば特に迷わないはず。

docs.microsoft.com

WSL のインストールと任意のディストリビューションの入手

WSL1 をすでに導入済みの人はスキップして大丈夫です。 WSL2 で初めて導入する人は以下のガイドに従って WSL そのものと、お好きな Linux ディストリビューションを入手してください。

docs.microsoft.com

WSL2 のセットアップ

Powershell を管理者として開き、以下のコマンドを入力します。

# Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform

再起動を求められたら指示に従います。

WSL のバージョンを 2 に切り替える

WSL2 のセットアップが済んだら、インストールした Linux の実行環境を WSL1 から WSL2 に切り替えます。 まず現在インストールされているディストリビューションの一覧を確認。

# wsl -l -v

自分の使いたいディストリビューションが表示されていること、及びその名前を確認します。名前はこのあとのバージョン切替時に必要になります。 名前がわかったら実際に切り替えます。変換は結構時間がかかるので気長に待ちましょう。

# wsl --set-version <変換したいディストリビューション名> 2

ついでにデフォルトの WSL バージョンを 2 に切り替えておいてもいいかもしれない。

# wsl --set-default-version 2

変換が終わったら再度 wsl -l -v して、変換したディストリビューションのバージョンが 2 になっていることを確認しましょう。

確認も済んだらあとは起動するだけ。簡単ですね。

で、実際どうなの?早いの?

問題は実際早くなってるのかどうか、です。特にディスク I/0 周り。体感では早くなってるんだけど…ということで雑に計測しました。

やり方は簡単、ある Rails アプリで vendor/bundle がない状態で $ time bundle install --path=vendor/bundle するだけ。 (本当は $ rails new とかで検証したかったんですが諸事情でうまく行かなかったのでこちらで)

ディスク I/O 以外にもいろいろな要素が絡んできてはしまいますが、体感できる部分が早くなってるかどうかの検証ぐらいにはなるでしょう。

というわけで結果。まずは WSL1 環境。

356.90user 349.00system 13:57.57elapsed 84%CPU (0avgtext+0avgdata 376356maxresident)k
0inputs+0outputs (0major+11128995minor)pagefaults 0swaps

なるほど 約 13 分bundle install すると一つ一つの gem のインストールでやや引っかかり、 nokogiri などは(普段から重いですが)しばらくピタッと動かなくなる程度には重いです。でも以前試したときよりはマシになってるような…

というわけで次、 WSL2 環境。

314.29user 37.95system 6:28.09elapsed 90%CPU (0avgtext+0avgdata 332868maxresident)k
0inputs+0outputs (457major+8152054minor)pagefaults 0swaps

まさかの 約 6分半 。実に半分以下。 実際コンソールの流れ方も WSL1 よりかなりスムーズで大半の gem はスルスル入っていきます。 nokogiri は流石に止まりますが…

ちなみに、今回計測はしていませんが、 RSpec とか回してもかなり速度差がある印象です。

注意事項とか

WSL2 は WSL1 よりもほぼ確実にサクサク動いてくれますが、 Windows - Linux を跨いだファイルアクセスは WSL1 よりも現状遅くなるということなので注意が必要です。

また、 WSL1 <-> WSL2 は相互に変換が可能…ですが、変換の際に若干挙動がおかしくなることがあったので、あまり気軽に変換処理をしないほうがいいかもしれません。 (変換も安定して動くわけでもなく、謎のエラーで落ちたと思ったら再度変換かけると成功するとかあったので)