お問い合わせ

ブログ

これまでに経験してきたプロジェクトで気になる技術の情報を紹介していきます。

Windows + WSL2 + docker + laravel を 10 倍速くする方法

NMC NMC 3 years
Windows + WSL2 + docker + laravel を 10 倍速くする方法

皆さんは、Windows + docker + WSL2 + laravel という環境で作業していて、
HTTP サーバーのあまりのレスポンスの遅さに辟易としたことはありませんか?
あるいは、composer installnpm install
「固まってるのか?」というくらい遅かった経験はありませんか?
実はたった一つ手を加えるだけで 10 倍ほど速くすることができます!


§ 要約

プロジェクトの置く位置を ¥¥wsl$Ubuntu¥mnt¥ 配下から ¥¥wsl$Ubuntu¥home¥ 配下に移動して
そこから docker-compose up で起動するだけ!

以上!終わり!
正直それで終わりにしてもいいのですが、
せっかくなので、
理由や効果などもうちょっと説明してみます。


§ 環境

WSL2 以外は特に重要ではありません。

  • Windows 10 Pro: ver.21H1 OS build 19043.1165
  • PSVersion: 5.1.19041.1151
  • WSL: 2
  • docker-desktop 3.6.0
    • engine: 20.10.8
    • compose: v2.0.0-rc.1
  • nginx 1.21.1
  • php v8.0.9
  • laravel v8.55.0

§ 何故遅いのか?

¶ OS ファイル システム間でのファイルの読み込みが遅い

Windows と Linux の OS ファイルシステム間でのファイルの読み込みが遅いからです。
むしろ WSL 1 より遅くなっています。

👇下図は MS 公式のドキュメントなのですが、 MS 自身も遅くなっていることを認めています。 why_docker_on_wsl2_is_slow.png

参照:WSL 1 と WSL 2 の比較
https://docs.microsoft.com/ja-jp/windows/wsl/compare-versions

¶ というと?

Windows と Linux では HDD のフォーマット形式が違います。
Windows は NTFS、Linux は EXT4 といった具合です。
主に耐障害性やセキュリティの設計思想から両者で違いが出ています。

もちろん EXT4 の HDD なんて用意した覚えはないので、
EXT4 でフォーマットされた仮想 HDD が使用されています。

その NTFS と EXT4 との橋渡しで時間がかかってしまう、ということです。

¶ 何が起こっているか?

Windows の c:* のファイルは、
WSL の
/mnt/Ubuntu/c/* 等にマウントされます。

ですので普通に特に何も考えずに

c:\Users\<user_name>\Documents\git-repos\hogehoge 

などに docker のプロジェクトを置いて、
WSLで docker を起動してしまうと、

/mnt/Ubuntu/c/Users/<user_name>/Documents/git-repos/hogehoge 

のファイルを WSL が読みに行ってしまいます。

さらに laravel のような framework は、
vendor 配下に大量のファイルがあり、
リクエストが一つ来るたびにそれらが大量に読みこまれます。
その他 app/ resource/ storage/ などへも大量のアクセスが発生します。

遅くしか行けない場所に、大量にアクセスが発生する。

それで凄く遅くなってしまうのです。


§ どうしたらいいのか?

¶ WSL の /mnt/ 以外に置く

/mnt/ 配下からの起動をやめて、
/home/ 配下に置いて起動する。
それだけです。

¶ どれくらい速くなるのか?

/mnt/ 配下で起動した場合: 3.58s
/home/ 配下で起動した場合: 99ms

なんと、36倍も速くなっています!

docker_on_mnt.png docker_on_home_short.png

もちろん両者一度しか測っていませんし、
様々な条件でばらつきが生じると思いますが、
まあなんせ速くなるのは分かっていただけると思います。

¶ Windows のアプリ から読めるのか?

laravel on docker on WSL2 の動作が早くなっても

  • vscode or PhpStorm
  • SourceTree or GithubDesktop or GitExtensions

が使えなくなったら仕事になりません。

簡単に言うと使えます

実は Windows から WSL のファイルは \\wsl$ という path で読めます。

例えば、
WSL 配下のpath

/home/<user_name>/git-repos/hogehoge

に Windows からは

\\wsl$\Ubuntu\home\<user_name>\git-repos\hogehoge 

でアクセスできます。
もちろんこの path は Explorer でも開けます。

explorer_wsl.png

ですので、/home/ 配下への引っ越しも explorer でできます!

※ですがかなり遅いです。
WSL の Ubuntu のコンソールを立ち上げて、 git clone && composer install とかした方がよっぽど速いです。

つまり、Windows アプリで何の問題もなく

  • vscode or PhpStorm
  • SourceTree or GithubDesktop or GitExtensions

等の全ての 今まで通りに快適に作業できます!


§ 結論

/home/<user_name>/

配下で作業するだけで爆速になります!
全ての Windows アプリが path を変える必要はありますがアクセスできます!
つまり皆が幸せになれます!!!

Windows + WSL2 + docker + laravel を 10 倍速くする方法 2021-08-26 20:52:09

コメントはありません。

4336

お気軽に
お問い合わせください。

お問い合わせ
gomibako@aska-ltd.jp