WSL2でNPM/Yarnが遅い問題と解決策
問題概要
WSL2 (Windows Subsystem for Linux 2) でのNPMやYarnの実行速度が、ネイティブのWindows環境と比較して極端に遅くなる問題が報告されています。具体的には、npx create-react-app
の実行時間が、GitBashでは約10秒で完了するのに対し、WSL2では約287秒かかるといった事例があります。
根本原因
主な原因は、WSL2のファイルシステムアクセスのパフォーマンス問題にあります。
ファイルシステムの違いによる影響
WSL2では2種類のファイルシステムが存在します:
- WSL2仮想ディスク (ext4フォーマット) - 高速
- Windowsドライブマウント (
/mnt/c/
など) - 非常に低速
WSL2がWindowsファイルシステムにアクセスする際に使用する9Pプロトコルがボトルネックとなり、ファイル操作が極端に遅くなります。
WARNING
デフォルトのWSL2ターミナルは/mnt/c/Users/<username>
で開始されるため、多くのユーザーが気付かずに低速なWindowsファイルシステム上で作業している可能性があります。
解決策
1. プロジェクトをWSL2のネイティブファイルシステムに移動
最も効果的な解決策は、プロジェクトファイルをWindowsドライブ(/mnt/c/
)ではなく、WSL2のネイティブファイルシステム(例: /home/username/src/
)に配置することです。
# ホームディレクトリに移動
cd ~
# プロジェクト用ディレクトリを作成
mkdir -p src/my-project
cd src/my-project
# ここでgit cloneやnpm initなどを実行
TIP
.bashrc
に自動的にWSLネイティブディレクトリに移動する設定を追加できます:
echo 'cd ~/src' >> ~/.bashrc
2. WSL1へのダウングレード
Windowsファイルシステム上のプロジェクトにアクセスする必要がある場合、WSL1に切り替えることで大幅な性能改善が見込めます。
# PowerShellで実行
wsl --set-version Ubuntu 1
WARNING
WSL1はメンテナンスモードとなっており、新しい機能の追加はありません。互換性の問題が発生する可能性があります。
3. NFSサーバーを使用したファイル共有
ハイブリッドなアプローチとして、Windows上でNFSサーバーを構築し、WSL2からマウントする方法もあります。
Windows側の設定:
- Hanewin NFS Serverなどをインストール
- 共有したいフォルダを設定
WSL2側の設定:
# nfs-commonのインストール
sudo apt update
sudo apt install nfs-common
# /etc/fstabにエントリを追加
echo "172.18.192.1:/c/Users/.../project /home/.../project nfs nfsvers=3,nolock 0 0" | sudo tee -a /etc/fstab
# マウント実行
sudo mount -a
4. ネットワーク設定の最適化
WSL2のネットワーク速度が遅い場合、以下のPowerShellコマンドで改善できる可能性があります(管理者権限で実行):
Enable-NetAdapterLso -Name vEthernet* -IncludeHidden -IPv4
Enable-NetAdapterLso -Name vEthernet* -IncludeHidden -IPv6
5. WSL2の仮想ディスクの最適化
WSL2インスタンスが大きくなりすぎた場合、パフォーマンスが低下することがあります。定期的なクリーンアップや再インストールを検討してください。
# WSLインスタンスのエクスポート
wsl --export Ubuntu ubuntu_backup.tar
# WSLインスタンスの解除
wsl --unregister Ubuntu
# 再インポート
wsl --import Ubuntu .\wsl\ ubuntu_backup.tar
開発環境の最適化
VS Codeでの作業
VS Codeを使用する場合、WSL拡張機能をインストールし、直接WSLのファイルシステムにアクセスするようにします:
\\wsl.localhost\ubuntu\home\user\project-folder
アンチウイルスソフトの除外設定
Windows DefenderなどがWSL関連のファイルアクセスをスキャンすることで遅延が発生している可能性があります。以下の除外設定を追加してみてください:
%USERPROFILE%\AppData\Local\Packages\CanonicalGroupLimited*
- WSLプロジェクトディレクトリ
パフォーマンス比較
環境 | 操作 | 時間 |
---|---|---|
WSL2 (Windows FS) | git status | 約2分 |
WSL2 (ネイティブFS) | git status | 約2秒 |
WSL1 (Windows FS) | git status | 約0.1秒 |
まとめ
WSL2でのNPM/Yarnの速度問題は、主にファイルシステムアクセスのオーバーヘッドに起因しています。最も効果的な解決策は、プロジェクトをWSL2のネイティブファイルシステムで管理することです。やむを得ずWindowsファイルシステムを使用する必要がある場合は、WSL1への切り替えやNFSサーバーの利用を検討してください。
最新のWSL2アップデートでは9Pプロトコルの性能改善が進められているため、今後のバージョンアップで状況が改善される可能性があります。