背景
WSLはファイルシステムアクセス速度がめちゃくちゃ遅い((わたしのマシンでは数 [MB/s]くらい)のをなんとかしたかった。
やったこと
WSLにおいて通常のファイルシステム上、tmpfs上、およびWindows上で作ったメモリ上に構築したファイルシステム上でlinux-4.18.5.tar.xzの展開したときの所要時間をとった。
結論
残念ながらどれも通常のファイルシステムを使う場合と大して変わらず。
測定環境
測定コマンド
$ 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>