为什么从 WSL2 文件系统运行时 .exe 非常慢?

为什么从 WSL2 文件系统运行时 .exe 非常慢?

我在 WSL2 上使用 Ubuntu 18.04,当我从 Windows 文件系统运行 .exe 时,它​​会正常执行。但是当我将 .exe 复制到 Linux 文件系统时,它的速度非常慢。请参见下面的示例:

(18.04)geert@SEA-WIN10-02:~$ time /mnt/c/Windows/system32/whoami.exe
geert

real    0m0.071s
user    0m0.000s
sys     0m0.003s
(18.04)geert@SEA-WIN10-02:~$ cp /mnt/c/Windows/system32/whoami.exe .
(18.04)geert@SEA-WIN10-02:~$ time ./whoami.exe
geert

real    0m10.198s
user    0m0.002s
sys     0m0.000s

当我使用 Ubuntu 20.04 或 22.04 时也会发生同样的情况。

在我的 WSL2 升级后(超出我的控制范围),它最近开始出现这种情况。

我正在使用 WSL2 上的 Linux 为 ARM 进行交叉编译。我正在使用一个 Windows 工具,它将 Intel Hex 输出转换为引导加载程序的加密版本。此工具现在减慢了构建速度。构建过去需要 4 分钟,现在需要 17 分钟。该工具没有改变;它是从版本控制中获取的,多年来一直没有改变。

另一个副作用是,构建完成后,每个应用程序的启动速度都非常慢。例如,在任务栏中单击任务管理器窗口后,需要 27 秒才能显示该窗口,Acrobat Reader 或任何其他应用程序也是如此;它们都需要 10 到 30 秒才能启动。CPU 使用率(不到 3%)和内存使用率(约 35%)是“正常”的,在启动应用程序时不会“飙升”。

运行 无法解决这个问题wsl --shutdown。我必须重新启动系统才能让应用程序立即再次启动。

我正在使用的 WSL2 版本:

PS C:\Users\geert> (get-item C:\windows\system32\wsl.exe).VersionInfo.FileVersion
10.0.19041.2311 (WinBuild.160101.0800)

PS C:\Users\geert> wsl --version
WSL version: 1.0.3.0
Kernel version: 5.15.79.1
WSLg version: 1.0.47
MSRDC version: 1.2.3575
Direct3D version: 1.606.4
DXCore version: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows version: 10.0.19045.2486

PS C:\Users\geert> wsl --status
Default Distribution: Legacy
Default Version: 2

PS C:\Users\geert> wsl --update
Checking for updates.
The most recent version of Windows Subsystem for Linux is already installed.

有一个WSL 错误报告关于此问题,但它是由Windows Subsystem for Linux Preview但我没有使用它引起的。我正在使用 WSL2 的最新官方发布版本。

有人知道为什么会发生这种情况以及如何解决吗?

更新:我在另一个装有旧版 WSL2 的系统上进行了测试,一切正常(构建需要 3 分 50 秒)。此版本的 WSL2 为:

PS C:\Users\geert> (get-item C:\windows\system32\wsl.exe).VersionInfo.FileVersion
10.0.19041.2311 (WinBuild.160101.0800)

PS C:\Users\geert> wsl --version
Invalid command line option: --version
Copyright (c) Microsoft Corporation. All rights reserved.
...

PS C:\Users\geert> wsl --status
Default Distribution: Ubuntu
Default Version: 2
...
Kernel version: 5.10.16

令人惊讶的是,这wsl.exe.VersionInfo.FileVersion两个系统是相同的。

我暂时的结论是 WSL2 更新已损坏。

我的第二个系统上的 WSL2 的“旧”版本有一个“回滚”选项:

PS C:\Users\geert> wsl --version
Invalid command line option: --version
Copyright (c) Microsoft Corporation. All rights reserved.

Usage: wsl.exe [Argument] [Options...] [CommandLine]

...

    --update [Options]
        If no options are specified, the WSL 2 kernel will be updated
        to the latest version.

        Options:
            --rollback
                Revert to the previous version of the WSL 2 kernel.

但是存在问题的系统上的 WSL2 版本不再具有“回滚”选项(但具有“--version”选项)。

现在我无法回滚 WSL2,我该如何解决这个问题?

答案1

有一个WSL 错误报告关于此问题,但它是由Windows Subsystem for Linux Preview但我没有使用它引起的。我正在使用 WSL2 的最新官方发布版本。

嗯...你实际上使用它。当发布时,WSL申请材料之前是预览版。现在它已经发布,正如你所见,它的错误报告仍然处于打开状态。显然它已经不是已修复。

现在我无法回滚 WSL2,我该如何解决这个问题?

重要的是要了解,WSL 现在有两种不同的“分发方法”:

  1. 最初,WSL 是作为Windows 功能通过打开或关闭 Windows 功能在“设置”中。

    这是您所指的“旧”版本,它不支持该--version标志。

  2. 现在,WSL 以 UWP 应用程序的形式分发。在最新版本的 Windows 10 和 11 中,它可以通过wsl --install、Microsoft Store 甚至下载应用程序包并手动安装来安装。

    这个版本似乎存在“.exe速度慢”的问题,至少在某些(也许是所有)版本中存在。

您仍然可以回滚到任一版本。无论哪种情况,首先卸载现有的 WSL 包(正如我在 Github 问题中的这个评论中提到)在“开始”菜单中搜索适用于 Linux 的 Windows 子系统,右键单击,然后卸载。您也可以通过标准添加或删除程序

从您的评论中:

如果我卸载 WSL,我的 Linux 安装会丢失吗?

不。这将不是卸载所有发行版。这些是单独的软件包,例如UbuntuDebianUbuntu-22.04等。不要卸载这些,这样就没问题了。不过,先备份一下也无妨。要么查看这个答案(或其他)的wsl --export,或者找到并复制ext4.vhdx适合您的发行版的文件。

一旦问题应用版本卸载后,建议重新启动。之后,由于您使用的是 Windows 10,因此应该发现 WSL特征仍安装。(此功能对于 Windows 11 用户是可选的,仅在您需要 WSL1 支持时才需要。)

wsl --version应该不再起作用,但wsl ~应该启动较旧的“功能”版本(也与较旧的内核版本一起)。根据该 Github 问题中的用户,返回到较旧的 WSL 预应用程序(功能)版本解决了该问题。但目前,就功能而言,这是一个相当大的挫折。在 Windows 10 下,您将失去:

  • WSLg(运行 Linux GUI 应用程序的能力)
  • wsl --mount将其他设备纳入 WSL的能力
  • Systemd 支持
  • 以及更多

此时,您还可以选择安装较旧的“应用程序”包。目前没有太多非“预览”的应用程序版本,但正如我在 Github 问题中提到的那样,您可以回到问题似乎开始发生之前的预发布版本。然而,根据最后的评论在该问题中,早在 0.66.2 版本中就存在该问题。因此,这可能是应用程序包中的系统性问题。

不过,如果你想尝试,你可以手动安装任何较旧的应用程序包。请参阅“无需通过商店安装/更新”我的答案在这里- 只需从WSL 发布页面

相关内容