解決WSL在Windows檔案系統下速度緩慢的問題

背景

微軟在比較 WSL 1 和 WSL 2 | Microsoft Docs這篇文章有提到,WSL 2在存取windows檔案系統時速度會變慢。雖然cd/ls這類指令無法察覺,但一旦使用到git,大量的檔案存取立刻讓效能有感變慢。有些用戶甚至還沒開始使用git指令,只是進入git repository,就足以讓接下來的每個指令延遲一秒以上。

分析原因

使用git會變慢的理由應該不用多談了,那為何單單只是進入git repository,速度就會有感下滑呢?這是因為很多的shell theme(bash/zsh),為了美觀和實用,都有附加「進入git repository時,提示目前branch」的功能。

而這也導致了在git repository底下時,無論輸入任何指令,shell皆會在每個指令間使用git指令,間接拖垮執行速度。

解決方法

思路

其中一個方案是回去用WSL 1,這也是微軟的推薦方法。
第二種方案則是改為使用windows的git,本篇主要會介紹這個方法。

首先要知道,任何windows的工具皆可在WSL中直接呼叫(前提是工具有在環境變數當中)。以git為例,若在Windows安裝過git,只要在WSL中輸入git.exe,即可使用Windows的git。

$ which git.exe
/mnt/c/Program Files/Git/cmd/git.exe

因此只要利用這個特性,在WSL進入Windows檔案系統時,將原先的linux git替換為windows git,就不會再感到延遲了。

oh-my-zsh的解決方案

這裡提供oh-my-zsh的解決方案。

對原始碼有興趣的可以看看oh-my-zsh針對git所做的擴展,連結
oh-my-zsh主要使用__git_prompt_git此function來執行git操作。因此我們只要遮蔽此function,將git更改為windows版本,即可解決進入git repository時速度緩慢的問題。
當然,指令上的git也必須進行簡單替換,最後結果如下。

function __git_prompt_git() {
	GIT_OPTIONAL_LOCKS=0 command git.exe "$@"
}

alias git="git.exe"

這樣一來不管是瀏覽git repository或是下git status等命令,都不會再感到緩慢。

這段程式應該放置在哪裡?有兩個選擇。
其一:若使用者完全不會用到linux檔案系統,可以考慮直接放在.zshrc之下。
其二:若使用者會交替使用Windows/Linux的檔案系統,可以考慮獨立一個檔案,假設將其命名為win.zsh並將其放在家目錄下。然後在.zshrc之下多新增一個function。

function win() {
        source $HOME/win.zsh
}

如此一來,只要在zsh中輸入 win,即可切換為windows環境。

分享大概就到這邊。

留言

這個網誌中的熱門文章

Functional Programming中處理Exception的方法

LiteDb簡單key-value pair存法