ManjaroとWin10+WSL2どっちが速いか、あるいは遅いか。

June 14, 2020

環境

以前 Manjaro Linux に移行しました で書いた、ThinkCentre M715q Tiny にManjaro Linuxと Windows 10 のデュアルブート環境。この環境は次の自作 PC するための繋ぎ兼検証環境(macOS から完全に離れられるか?今の所戻る気にはならない)。

WSL2 導入

このマシンにインストールされている Windows10 は Home エディションなので、WSL からの移行ではなく新規で WSL2 をインストール。

主に WSL2 導入| Win アップデートから WSL2 を既定にするまでのスクショ - Qiitaの記事を参考にさせて頂いた。自分の環境では特につまづきポイントもなかった。途中でなにかのツールをインストールしたんだけど、それが Github で公開されている公式のもので時代を感じた。ディストリビューションは Ubuntu を選択。

プロジェクトビルド

途中でインストールした、 Windows Terminal のフォントレンダリングが綺麗でなんか本格的に移行しても良い気がしてきたのがこの辺り。github からプロジェクトを clone してきて、composer installnpm ciが重い。いや、きっとネットワークのせいだ WSL2 は悪くないと言い聞かせながらnpm run buildを実行。・・・全然終わらない。その時の記録がこれ。

# WSL2(9p)
$ time npm run build
real    10m31.614s
user    7m10.199s
sys     1m1.781s

これは仕事にならない、話が違うではないか。10 分以上かかってる一方ネイティブな Linux 環境では40 秒ちょっと。

# manjaro
$ time npm run build
Executed in   42.07 secs   fish           external
   usr time   72.09 secs  353.00 micros   72.09 secs
   sys time    2.36 secs  173.00 micros    2.36 secs

原因調査

あまりに酷いので何か自分の設定が悪いのかなど調べるもわからず、次の記事にたどり着く。 Windows10 Insider 18917 で WSL2 が来たので雑にボリュームマウントのベンチマークとってみた(追記あり) - Qiita

なるほど、WSL2 でWindows と Linux が共有するディスクスペースは 9p というファイルフォーマットで Linux 側からマウントしていて、そこへのI/O は遅いらしい。(どこかで聞いたことある話)

  • / 以下は ext4 でマウントされている
  • WSL のときと違ってちゃんとした? cgroup が動いている(Linux カーネルが動いてるんだからまぁそうだわな)
  • Windows の領域は /mnt/c にマウントされていて(これは WSL 同様)、9p という方式でマウントされている

mount の状態 - @kunit

ベンチマーク

Windows 側と共有しているユーザ直下の 9p フォーマットの領域

snize@DESKTOP-CS7E8BJ:/mnt/c/Users/snize$ time dd if=/dev/zero of=test bs=1k count=100000
100000+0 records in
100000+0 records out
102400000 bytes (102 MB, 98 MiB) copied, 16.501 s, 6.2 MB/sreal    0m16.514s
user    0m0.309s
sys     0m3.344s

Ubuntu のホームディレクトリで ext4 フォーマットの領域

snize@DESKTOP-CS7E8BJ:~$ time dd if=/dev/zero of=test bs=1k count=100000
100000+0 records in
100000+0 records out
102400000 bytes (102 MB, 98 MiB) copied, 0.176402 s, 580 MB/sreal    0m0.178s
user    0m0.030s
sys     0m0.147s

0m16.514 vs 0m0.178s …約 90 倍差がある。ということは、ext4 の領域にプロジェクトファイル置けば良いのでは!?

ext4 領域で再度プロジェクトビルド

# WSL2(ext4)
$ time npm run build
real    1m40.553s
user    0m0.648s
sys     0m0.073s

遅い、Native な環境に比べて1 分遅い。いや、開発中の差分ビルドだったら初回ちょっと我慢すれば、あるいはマシンスペックが上がれば我慢できるかも。というような微妙な着地を見ました。

課題

多くの Windows の GUI アプリは Linux 側の ext4 領域を触りに行けない(?)ので、Linux 側からコードを触らないといけない。VSCode の場合は Remote Development で接続できるらしいので問題無さそう。自分は Jetbrains ラバーなので、Linux の GUI アプリが普通に使えるようになったらこの課題は解決するかも。

まとめ

なんか最近面白さもなければ、品質も高くない(ビジュアル除く)macOS に比べれば今後、このパフォーマンスの解決や Linux の GUI アプリの動作など、Windows10 は期待でいっぱいなので引き続き Manjaro を使いつつ状況を見ていきたい。(Ubuntu ではなく Manjaro 入れたい)

以上、Manjaro のTyporaより。


Profile picture

Webのフロントエンドからバックエンド、プロトタイピングからプロダクションまで。定額の開発サービスも。詳しくはAboutページで。