Gazelle
2021年07月23日更新 2211 Views

WSL2の導入でBuildは速くなるのか?

最近のWebアプリケーションはJavaScript、CSS、HTMLのMinifyや結合、画像ファイルを適切なサイズへの圧縮などBuildプロセスであれこれ行うことが多いためBuild時間が馬鹿にならなくなってきている。

たとえば私は今GatsbyJSというReactBaseのフレームワークを用いてWebサイトの構築を行っているが、Cacheが効いていない時点で一からBuildを行うと3分程度時間を要してしまう。

このBuild時間をWindowsで普通に行った時、WSLで行った時、WSL2で行った時の3パターンで試してみたいと思う。

Windowsのケース

success Generating image thumbnails - 178.993s - 1533/1533 8.56/s
success onPostBuild - 0.319s
info Done building in 198.817513787 sec

3分18秒 Buildにかかっている。カップ麺を作るか、トイレに行って戻ってきてようやく結果をWebサイトからアクセスできる。Cacheが効いている時は40秒ほどで終わるため何とか我慢できるが、一からのフルビルドは相当ストレスフルである。

WSL1のケース

WSL1はLinuxの関数をWindowsの関数にWrapして、最終的にWindowsのKernelが使われているらしいので、結局はほぼWindowsと同じ速度になるか、あるいはWrapしている分幾ばくかBuild時間が遅いことが想定される。

実際に試してみたところ結果はこちら。

success Generating image thumbnails - 801.837s - 1533/1533 1.91/s
success onPostBuild - 0.625s
info Done building in 856.4821967 sec

絶望的に遅いことが判明してしまった。WSLは遅いと言われていたものの、正直ここまで遅いとは思わなかった。

軽いプログラミングで使うのならば良いが、肥大化されたWebプロジェクトのBuildにWSLは論外であると言える。まあWSL使わずともWebの開発はできるが、細かい所でShellのコマンドが使いたかったりするので困りものである。

また、いっちょ前にCPUリソースだけは十分に使っていることが判明。
image.png

WSL2のケース

満を持してWSL2の登場である。Linux Kernelを直接叩くことで通常のLinuxと同等の高速化が期待される。多機能で重いWindowsOSよりもLinuxの方が高速なイメージはあるので期待はできる。その前段階としてWindows 10 用 Windows Subsystem for Linux のインストール ガイドで手動Updateを行う。

WSLは既にインストール済みであるから、手順2のWSL 2 の実行に関する要件を確認するから進める。

Update要件を確認出来たら、仮想マシンの機能を有効にする。PowerShellを管理者権限で開いて下記のコマンドを叩く。

PS C:\WINDOWS\system32> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

展開イメージのサービスと管理ツール
バージョン: 10.0.19041.844

イメージのバージョン: 10.0.19043.1110

機能を有効にしています
[==========================100.0%==========================]
操作は正常に完了しました。

この後再起動する。

再起動を終え、Linux Kernelをインストールし、現在のWSLのVersionをPowerShellを立ち上げてwslの下記のコマンドでチェック

PS C:\Users\tsuto> wsl --list --verbose
  NAME            STATE           VERSION
* Ubuntu-18.04    Running         1

次にバージョンに切り替える。

PS C:\Users\tsuto> wsl --set-version Ubuntu-18.04 2
変換中です。この処理には数分かかることがあります...
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください

数分ではなく15分ぐらいかかったが一先ず移行完了

初めてWSLをインストールする場合は手順通り

wsl --set-default-version 2

をしてDefaultのVersionを2としておくと、UbuntuなどのLinuxディストゥリビューションをインストールした時にWSL2対応となる。

success Generating image thumbnails - 260.223s - 1533/1533 5.89/s
success onPostBuild - 0.811s
info Done building in 388.0486864 sec

何と、Build時間が半分以下になった

しかしまだ物足りない。現在はWindowsとのファイルのやり取りを簡単に行うために/mnt/以下の領域で作業しているが、これではLinuxからWindowsの領域のファイルにアクセスしていることになり動作が遅くなっていることが想像される。

ということで純粋なLinuxの領域で作業を行ってみる。

success Generating image thumbnails - 82.827s - 1533/1533 18.51/s
success onPostBuild - 0.116s
info Done building in 134.4494615 sec

134sとなりWindowsの198sを超えることができた

まとめ

WSL2を導入することにより、Windowsより30%高速な実行環境を整えることができた

Windowsの共通ファイル領域を使えない不便さはあるが、VSCodeのドラッグアンドドロップは聞いたので思ったよりは使い勝手は良さそうである。
image.png

最新のRyzen CPUとか導入してWSL2でBuildしたら相当快適そうなのは間違いない。

関連記事

ps axuをして全プロセスを表示し、該当するpidを指定してkillすれば良いという話
2020年03月18日
Railsアプリの独自ドメイン取得からSSL設定まで一貫して行います。環境はCentOS7、サーバはNginx、SSL化には無料のLet's Encryptを使用。
2020年03月18日
さくらVPSでコマンドが何故か重くなった時に、コンソールのCPU使用時間やtopコマンドでのCPU使用率を調査して原因を特定し、不要プロセスを終了させようという話。
2020年04月03日
node用version管理ツールnvmをインストールして、任意のnode versionを使う方法を解説
2020年07月30日
cronがうまく動かせない時はbashファイルの読み込み、実行ユーザ、相対パスの起点について疑ってみると大体動くようになるという話
2020年10月17日
Linuxのsedコマンドを使えば、簡単にファイル内の置換を行うことができる。正規表現のスラッシュ区切りを使わずにバーティカルバーを使って簡潔に書くことも可読性を高めるうえでは重要なテクニックとなる。
2021年07月07日
ホームへ戻る