为什么与本机Windows NPM/Yarn处理相比,WSL非常慢?

a8jjtwal  于 2023-02-23  发布在  Windows
关注(0)|答案(2)|浏览(336)

最近我经常使用WSL,因为我需要一些本地UNIX工具(模拟器还不够好)。我注意到使用NPM/Yarn时速度的差异是难以置信的。
我做了一个简单的测试来证实我的感觉,测试运行npx create-react-app my-test-app,WSL结果是Done in 287.56s.,而GitBash运行Done in 10.46s.
这并不是全部,因为在两种情况下,感知时间都更长,但即使基于此--也有一个大问题。我只是不知道在哪里。我正在做的项目使用了数十个库,即使修改其中一个也需要几分钟而不是几秒钟。
这是我能解决的问题吗?如果是的话-到哪里去寻找线索?
其他信息:

  • 我的处理器:处理器AMD锐龙7 5800H,搭载Radeon显卡,3201 Mhz,8核,16颗逻辑处理器
  • 我正在运行Windows 11,系统和WSL都有最新更新。选择的系统是Ubuntu 20.04
  • 我见过一些类似于'npm install' extremely slow on Windows的问题,但它们根本没有触及WSL(我的纯Windows NPM工作得很快)。
  • 这个问题不仅限于NPM,它也适用于Yarn
  • 我遇到的另一个问题是文件监视没有发生(我需要在每次更改时重新启动服务器)。在一些应用程序中,我没有收到任何错误,有时我会收到以下错误:
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-app中需要很长时间才能在WSL的浏览器中呈现一些东西,当从GitBash执行时-我可以在2 - 4秒内看到东西
  • 有可能这纯粹是一个WSL问题,但它在使用NPM/Yarn时伤害最大
a2mppw5e

a2mppw5e1#

既然你提到了在Git Bash中执行相同的文件(性能良好),我就在这里做一个假设,如果我错了,请纠正我,我会删除这个答案,并寻找其他可能性。
如果您的文件存储在/mnt/c(Git Bash下的C:/C)或任何其他Windows驱动器上,这将得到解释(也是意料之中的),因为它们可能需要由Git Bash访问。
WSL2使用9P协议来访问Windows驱动器,目前已知与以下设备相比,它 * 非常 * 慢:

  • 本机NTFS(显然)
  • WSL2使用的虚拟磁盘上的ext4文件系统
  • 甚至WSL1在Windows驱动器上的性能

我见过一个大型repo(WSL2 Linux内核Github)的git clone在Windows驱动器上的WSL2上需要8分钟,但在根文件系统上只需几秒钟。
两种可能性:

  • 如果可能的话(大多数Node项目都是这样),使用wsl --set-version <distroname> 1将您的WSL转换为版本1。

既然你无论如何都要做一个备份,你也可以通过wsl --import把你的备份作为--version 1(作为最后一个参数)来创建一个示例的副本。WSL1和WSL2都有它们的用途,你会发现保留它们是很有帮助的。
有关确切语法的详细信息,请参见this answer

  • 或者只是将项目移到WSL根目录下的某个位置,例如/home/username/src/
8xiog9wr

8xiog9wr2#

  • 基于@notthedr01ds的回应 *

如果你看看微软的Comparing WSL 1 and WSL 2,"* 操作系统文件系统的性能 *"在WSL2中明显更差。

我的案例属于使用WSL 1而不是WSL 2的异常

  • 项目文件必须存储在Windows文件系统中。WSL 1提供了对从Windows装入的文件的更快访问。
  • 如果您将使用WSL Linux发行版访问Windows文件系统上的项目文件,并且这些文件无法存储在Linux文件系统上,则可以使用WSL 1在操作系统文件系统之间实现更快的性能。

这意味着我需要切换到版本1。

wsl --set-version Ubuntu 1
Conversion in progress, this may take a few minutes...
Conversion complete.

测试之前

>time git status
...
real    0m6.436s
user    0m0.055s
sys     0m36.380s

之后测试

> time git status
...
real    0m0.126s
user    0m0.016s
sys     0m0.641s

相关问题