WSLのファイルシステムアクセス速度をマシにしようとしたが失敗した話

背景

WSLはファイルシステムアクセス速度がめちゃくちゃ遅い((わたしのマシンでは数 [MB/s]くらい)のをなんとかしたかった。

やったこと

WSLにおいて通常のファイルシステム上、tmpfs上、およびWindows上で作ったメモリ上に構築したファイルシステム上でlinux-4.18.5.tar.xzの展開したときの所要時間をとった。

結論

残念ながらどれも通常のファイルシステムを使う場合と大して変わらず。

測定環境

  • OS: WIndows 10 Home, version 1803, build 17134.228
  • WSL: Ubuntu 16.04

測定コマンド

$ time tar xf linux-4.18.5.tar.xz

測定結果と考察

まずは通常のファイルシステムとtmpfsについて。

real    10m59.151s
user    0m19.984s
sys 1m28.875s
  • tmpfs
real    10m37.472s
user    0m21.031s
sys     1m22.344s

処理中にWindowsのリソースモニタを見ると、どちらももwriteは5 [MB/s]くらいだったので、WSLのtmpfsは、実は裏側にはメモリではなく何らかのファイルがいる、および、そいつへの書き込み速度はWSL上の通常のファイルと同等なためtmpfsを使っても何も嬉しくない、という推測ができる。WSLはLinuxのエミュレーションに過ぎないので文句は言えないんだけど、かなしい。

続いてWindowsの機能でメモリ上にファイルシステムを作って、その上で上記のソースを展開することにした。WIndowsにはメモリ上に仮想ディスクを作れるImDiskというツールがあるので、これを利用した。管理者権限でこのツールを使えば、たとえば次のように2GBのサイズを持つ仮想ディスクをRドライブとして作成できる。

C:\WINDOWS\system32>imdisk -a -m r: -s 2G
Creating device...
Created device 2: R: -> Image in memory
Notifying applications...
Done.

C:\WINDOWS\system32>

後はこいつをNTFSでフォーマットしてWSLから/mnt/rからアクセスすればよい。

Rドライブ上でソースを展開した場合の所要時間は次の通り。

real    8m12.778s
user    0m18.859s
sys     0m52.031s

ちょっとは速くなったけど大して変わらない。処理中のwrite I/Oは200 [KB/s]くらいだったことより、Rへのアクセス時にはストレージへのアクセスはほとんどしていないようだ。つまりファイルシステムの裏にあるものがストレージデバイスだろうとメモリだろうと、そいつらにアクセスする以前のファイルシステムエミュレーションレイヤがめちゃくちゃ遅いということだろうか。かなしい(2回目)。

最後にImDIskで作った仮想ディスクを削除して終わり。

C:\WINDOWS\system32>imdisk -d -m r:
Notifying applications...
Flushing file buffers...
Locking volume...
Dismounting filesystem...
Removing device...
Removing mountpoint...
Done.

C:\WINDOWS\system32>