【WSL2】WSL2でgitが遅いのをなんとかする
WSLとgit
WSL2を普段使っているが、大きなプロジェクトになるとgit statusが非常に遅いのがストレスになってきた。
❯❯❯ time git status git status 0.05s user 2.60s system 44% cpu 6.010 total ❯❯❯ date '+%Y-%m-%dT%H:%M:%S.%3N' && git status && date '+%Y-%m-%dT%H:%M:%S.%3N' 2021-02-12T13:45:34.304 <snip> 2021-02-12T13:45:40.693
え・・・6秒・・・( ^ω^)
理由は単純
2021/1現在、WSL2上のファイルシステムへのLinuxのシステムコールの発行/処理は遅い事で知られている。
中の仕組みを考えてみれば単純で、WSLはWindowsのシステムコールとLinuxのシステムコールをバイパスしているので、まぁパフォーマンスを悪そうだとは思う。 linuxのgitコマンドではLinuxのシステムコールから呼んで、Windowsのシステムコールに変換して、ディスクにアクセスしてメモリに乗せて・・・みたいな事をするはずという話なんだ。
どうする?
ここで紹介されているようなhackをすればいい。
zshrcやbash_profileに以下を追記すれば終わり。
# checks to see if we are in a windows or linux dir function isWinDir { case $PWD/ in /mnt/*) return $(true);; *) return $(false);; esac } # wrap the git command to either run windows git or linux function git { if isWinDir then git.exe "$@" else /usr/bin/git "$@" fi }
gitコマンドの時だけwindowsのgit.exeでアクセスしちゃうというハックで、筆者も「バカげた方法だが」と書いているがなんというか妥当な対処法だと思われる。 要はWindows側でインストールされたgit.exe経由でファイルの情報を引っ張って来れば無駄なシステムコールのバイパスが減るというわけだ。
デモ
git.exeという外部コマンドになるのでtimeコマンド使えない。という事でdateコマンドでも挟む
❯❯❯ date '+%Y-%m-%dT%H:%M:%S.%3N' && git status && date '+%Y-%m-%dT%H:%M:%S.%3N' 2021-02-12T13:47:18.445 <snip> 2021-02-12T13:47:18.526
処理が80ミリ秒くらいになった。これで快適。