wsl2 上的 docker 非常慢

dob*_*ler 47 docker windows-10 wsl-2

在阅读了在 wsl2 上运行 Docker 时的性能改进后,我一直在等待支持 wsl2 的 Windows 10 的正式版本。我更新了 Windows 和 Docker 并打开了 Docker 标志以使用 wsl2,并希望我的 Oracle 数据库在 Docker 容器中运行时获得一些性能提升,但不幸的是,这种变化大大降低了容器和我的笔记本电脑的速度。容器的性能大约慢了 10 倍,而且我的笔记本电脑在启动容器时几乎卡住了。似乎内存消耗将完全耗尽我的 8GB 并且大量内存交换开始发生。我可以做些什么来提高 Docker 在 wsl2 上的性能,或者至少可以更好地了解我的设置有什么问题?

我的环境:

  • 处理器 Intel(R) Core(TM) i7-2620M CPU @ 2.70GHz,2 核
  • 已安装的物理内存 (RAM) 8.00 GB
  • Microsoft Windows 10 专业版 10.0.19041 内部版本 19041
  • Docker 版本 19.03.8,构建 afacb8b

The*_*o L 40

这来自消耗尽可能多的资源的“vmmem”。要解决这个问题,只需转到您的用户文件中

C:\用户\用户名

在此目录中创建一个名为“ .wslconfig ”的文件,您将在其中配置可以使用 WSL2 的资源数量:

[wsl2] 
memory=900MB    #Limits VM memory in WSL 2 to 900MB 
processors=1    #Makes the WSL 2 VM use one virtual processors
Run Code Online (Sandbox Code Playgroud)

现在关闭您的 docker 并等待“vmmem”在任务管理器中关闭。

那么您可以重新启动 docker,通常“vmmem”不会超过您设置的限制(此处为 900MB) 如果不起作用,请重新启动您的计算机。

我希望它对你有帮助。

  • 我发现像这样通过“.wslconfig”限制内存对 Docker 的性能产生了巨大的影响。如果没有它,Docker 似乎会使用尽可能多的资源。在我的 16GB 机器上将 Docker 限制为“内存 = 6GB”使得使用 Docker 变得更好。最佳设置可能取决于可用 RAM 以及您使用 Docker 所做的事情,但我猜想在许多情况下将其设置为(相当多!)超过 500MB 可能是明智的! (3认同)
  • 非常感谢您的回答。Docker 应该提供设置这个或其他东西。[此处](https://docs.microsoft.com/en-us/windows/wsl/wsl-config#configure-global-options-with-wslconfig) 是 Microsoft 关于“.wslconfig”的文档,供参考。 (2认同)
  • 使用“.wslconfig”文件可以减轻资源消耗,但实际上使容器本身比以前更慢。我想我只是没有足够的内存,必须继续使用 Docker,而不利用 wsl2。 (2认同)
  • 就我而言, vmmem 进程不会自行停止。当我执行“wsl.exe --shutdown”时它终于停止了 (2认同)

And*_*ndy 19

您可能将代码存储在 Windows 机器上的一个类似于此的文件夹中...

C:\\Users\YourName\projects\blahfu
Run Code Online (Sandbox Code Playgroud)

但是您在 WSL 2 上使用 Docker,这是一个不同的(Linux)文件系统。因此,当您执行 Docker 构建时,所有代码/上下文都会从 Windows 文件系统复制到 Linux 文件系统,然后再从那里复制到 Docker 容器。这是最耗时的,而且速度非常慢。

尝试将您的项目放入这样的文件夹中...

/home/YouName/projects/blahfu
Run Code Online (Sandbox Code Playgroud)

你应该得到相当大的性能提升。

  • 将代码库从 Windows Drive 移至 WSL 目录,运行 docker build,速度提高 10 倍! (3认同)
  • @Andy:从技术上讲,您的方法是有意义的,但 WSL 的想法是利用 Linux 的强大功能在 Windows 上灵活地工作,并且它应该正确处理性能。如果我们将所有内容移至 WSL 文件夹结构中,那么我对此表示怀疑。 (2认同)

ato*_*m88 13

如果实际 docker 容器的数据存储在 Windows 文件系统(即 NTFS)上,而不是存储在本机 Linux 文件系统上(无论 docker 容器内容是什么,很可能已经基于 Linux),那么我认为您是由于您正在运行 WSL 并使用已安装的 WINDOWS 文件系统中的 docker 容器(即/c/mnt/...),因此会看到性能缓慢。

如果将 docker 容器复制到/usr/local、 或/home/<username>/dockerWSL 上,那么您可能会看到性能提高 10 倍。

尝试一下,看看是否有效?


too*_*ooy 12

wsl 容器具有与 Windows 文件系统隔离的适当文件系统。基本思想是将源代码从 windows 文件系统复制到 wsl 文件系统。

从窗口您可以访问 wsl 容器并将您的项目复制到 wslcontainer :

使用资源管理器导航到 \\wsl$

从这个位置重建容器这将奏效!

  • 我不明白。您能详细说明一下您的评论吗? (2认同)

Hos*_*agh 6

您需要编辑“vmmem”资源,只需在路径中添加文件 .wslconfig

C:\Users<您的用户名>.wslconfig

使用 .wslconfig 配置全局选项

Available in Windows Build 19041 and later
Run Code Online (Sandbox Code Playgroud)

您可以通过将 .wslconfig 文件放入用户文件夹的根目录中来配置全局 WSL 选项:C:\Users<yourUserName>.wslconfig。其中许多文件与 WSL 2 相关,请记住您可能需要运行

wsl--关闭

关闭 WSL 2 VM,然后重新启动 WSL 实例以使这些更改生效。

这是一个示例 .wslconfig 文件:

安慰

Copy
[wsl2]
kernel=C:\\temp\\myCustomKernel
memory=4GB # Limits VM memory in WSL 2 to 4 GB
processors=2 # Makes the WSL 2 VM use two virtual processors
Run Code Online (Sandbox Code Playgroud)

看到这个https://learn.microsoft.com/en-us/windows/wsl/wsl-config