水底

ScalaとかC#とかk8sとか

WSL2のshellがどうにも重かったのが解決できた話

何が重かったか

tmux+zshな環境を利用しているのですが、zshでコマンドなしでEnterを連続で押したときやtmux環境を保存・復元するtmux-resurrectが激重でした。特に後者は保存・復元にそれぞれ1分程度かかっていました (同程度のマシンで普通のlinuxであれば5秒とかからない処理です)。

ちなみに、shellから呼び出したプログラムの速度は特段遅く感じることはありませんでした。

原因と解決策

デフォルトでWSL2のshellにWindowsのPATHが含まれているのですが、これが原因だったようです。 ので、これをしない設定にしました。

以下の内容を /etc/wsl.conf に追記して再起動するだけです。

[interop]
appendWindowsPath = false

ちなみにこの設定は Build 17713 以降でのみ使えるようです。

(追記) 副作用

WSL2のPATHからWindows由来のものを消すと、当然ながらWSL2からWindows側のコマンドを直接叩くことができなくなります。たまに手動で利用する場合であればフルパス指定すればよいですが、頻繁に利用するプログラムが存在する場合や外部のプログラムからPATHを前提としたコマンド呼び出しがある場合は困ったことになります。 応急処置として、PATHが通った場所にシンボリックリンクを張ることで解決できます。

例1: VSCode

WSL2からWindowsにインストールされたVSCodeを直接開くには専用のシェルスクリプトを経由する必要がある

sudo ln -s '/mnt/c/Users/<user name>/AppData/Local/Programs/Microsoft VS Code/bin/code' /usr/local/bin/code

例2: Docker for Windows (w/ VSCode remote container)

VSCode remote containerはその起動時に docker-credential-desktop.exe がPATHにあることを前提としたスクリプトが実行される (最近のバージョンでは不要になったかも?)

sudo ln -s '/mnt/c/Program Files/Docker/Docker/resources/bin/docker-credential-desktop.exe' /usr/local/bin/docker-credential-desktop.exe

参考