Why is WSL extremely slow when compared with native Windows NPM/Yarn processing? Ask Question

Why is WSL extremely slow when compared with native Windows NPM/Yarn processing? Ask Question

I am working with WSL a lot lately because I need some native UNIX tools (and emulators aren't good enough). I noticed that the speed difference when working with NPM/Yarn is incredible.

I conducted a simple test that confirmed my feelings. The test was running npx create-react-app my-test-app and the WSL result was Done in 287.56s. while GitBash finished with Done in 10.46s..

This is not the whole picture, because the perceived time was higher in both cases, but even based on that - there is a big issue somewhere. I just don't know where. The project I'm working on uses tens of libraries and changing even one of them takes minutes instead of seconds.

Is this something that I can fix? If so - where to look for clues?

Additional info:

  • my processor: Processor AMD Ryzen 7 5800H with Radeon Graphics, 3201 Mhz, 8 Core(s), 16 Logical Processors

  • I'm running Windows 11 with all the latest updates to both the system and the WSL. The chosen system is Ubuntu 20.04

  • I've seen some questions that are somewhat similar like 'npm install' extremely slow on Windows, but they don't touch WSL at all (and my pure Windows NPM works fast).

  • the issue is not limited to NPM, it's also for Yarn

  • 私が遭遇しているもう 1 つの問題は、ファイルの監視が行われていないことです (変更ごとにサーバーを再起動する必要があります)。一部のアプリケーションではエラーは発生しませんが、次のようなエラーが発生することがあります。

    Watchpack Error (initial scan): Error: EACCES: permission denied, lstat '/mnt/c/DumpStack.log.tmp'
    Watchpack Error (initial scan): Error: EACCES: permission denied, lstat '/mnt/c/hiberfil.sys'
    Watchpack Error (initial scan): Error: EACCES: permission denied, lstat '/mnt/c/pagefile.sys'
    Watchpack Error (initial scan): Error: EACCES: permission denied, lstat '/mnt/c/swapfile.sys'
    
  • npm start空の(新しく初期化された)では、create-react-appWSLのブラウザで何かをレンダリングするのに非常に時間がかかりますが、GitBashから実行すると2〜4秒で表示されます。

  • これは純粋に WSL の問題である可能性もありますが、NPM/Yarn を使用するときに最も問題になります。

ベストアンサー1

Git Bash 内から同じファイルを(適切なパフォーマンスで)実行するとおっしゃっているので、ここでは仮定を立ててみます。

ファイルが/mnt/c(別名C:、または/CGit Bash の下) またはその他の Windows ドライブに保存されている場合、Git Bash からアクセスするにはその必要がある可能性が高いため、このことが説明されます (予想されます)。

WSL2はWindowsドライブにアクセスするために9Pプロトコルを使用しており、現在は(脚注参照)知られているとても以下と比較すると遅い:

  • ネイティブ NTFS (当然)
  • WSL2 で使用される仮想ディスク上の ext4 ファイルシステム
  • そして、WindowsドライブでのWSL1のパフォーマンスも

大規模なリポジトリ (WSL2 Linux カーネル Github) の実行に、git cloneWindows ドライブ上の WSL2 では 8 分かかりましたが、ルート ファイル システムでは数秒しかかかりませんでした。

2つの可能性:

  • プロジェクトを WSL ルートの下のどこか (など) に移動します/home/username/src/。すぐにパフォーマンスが大幅に向上するはずです。

  • 可能であれば (ほとんどの Node プロジェクトでは可能です)、 を使用して WSL をバージョン 1 に変換しますwsl --set-version <distroname> 1。最初に必ず を使用してバックアップを作成することをお勧めしますwsl --export

    (補足: 残念ながら、WSL1 はここ何年も更新されていません。まだ選択肢の 1 つですが、互換性の問題が増えるにつれて、これを解決策として推奨することが難しくなってきています)

    いずれにせよバックアップを作成するのであれば、コピーインスタンスのwsl --importバックアップを--version 1(最後の引数として) として実行します。WSL1 と WSL2 はどちらも用途があり、両方を保持しておくと便利な場合があります。

    見るこの答え正確な構文の詳細については、こちらをご覧ください。


脚注:

最近の開発状況から、この分野では改善の見込みがあるかもしれません。9P のパッチがアップストリームでリリースされており、パフォーマンスが大幅に向上すると報告されています。このGithubスレッドのコメント詳細については (および親スレッド) を参照してください。

おすすめ記事