Skip to content

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/)に配置することです。

bash
# ホームディレクトリに移動
cd ~

# プロジェクト用ディレクトリを作成
mkdir -p src/my-project
cd src/my-project

# ここでgit cloneやnpm initなどを実行

TIP

.bashrcに自動的にWSLネイティブディレクトリに移動する設定を追加できます:

bash
echo 'cd ~/src' >> ~/.bashrc

2. WSL1へのダウングレード

Windowsファイルシステム上のプロジェクトにアクセスする必要がある場合、WSL1に切り替えることで大幅な性能改善が見込めます。

powershell
# PowerShellで実行
wsl --set-version Ubuntu 1

WARNING

WSL1はメンテナンスモードとなっており、新しい機能の追加はありません。互換性の問題が発生する可能性があります。

3. NFSサーバーを使用したファイル共有

ハイブリッドなアプローチとして、Windows上でNFSサーバーを構築し、WSL2からマウントする方法もあります。

Windows側の設定:

  1. Hanewin NFS Serverなどをインストール
  2. 共有したいフォルダを設定

WSL2側の設定:

bash
# 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コマンドで改善できる可能性があります(管理者権限で実行):

powershell
Enable-NetAdapterLso -Name vEthernet* -IncludeHidden -IPv4
Enable-NetAdapterLso -Name vEthernet* -IncludeHidden -IPv6

5. WSL2の仮想ディスクの最適化

WSL2インスタンスが大きくなりすぎた場合、パフォーマンスが低下することがあります。定期的なクリーンアップや再インストールを検討してください。

powershell
# 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プロトコルの性能改善が進められているため、今後のバージョンアップで状況が改善される可能性があります。