wsl2上的docker非常慢
Posted
技术标签:
【中文标题】wsl2上的docker非常慢【英文标题】:docker on wsl2 very slow 【发布时间】:2020-09-21 00:58:09 【问题描述】:在阅读了有关在 wsl2 上运行 Docker 时的性能改进后,我一直在等待支持 wsl2 的 Windows 10 的正式发布。 我更新了 Windows 和 Docker 并打开了 Docker 标志以使用 wsl2,并希望在 Docker 容器中运行我的 Oracle 数据库有一些性能提升,但不幸的是,这种变化大大减慢了容器和我的笔记本电脑的速度。 容器的性能大约慢了 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【问题讨论】:
我认为需要有关您的硬件规格和所有相关软件版本的信息。 我也有这个问题,我有 16gb 的内存,vmmem 进程正在消耗大部分内存。 顺便说一句,这有一个问题:github.com/microsoft/WSL/issues/4166我们所有的wsl2用户最终都会搜索如何处理卡住的窗口...... 类似问题,但内存很大,并且在构建期间***.com/questions/65231110/… 【参考方案1】:这来自“vmmem”,它消耗尽可能多的资源。 要解决问题,只需转到您的用户文件 对我来说
C:\Users\用户名
在此目录中创建一个名为“.wslconfig”的文件,您将在其中配置可以消耗 WSL2 的资源数量:
[wsl2]
memory=900MB #Limits VM memory in WSL 2 to 900MB
processors=1 #Makes the WSL 2 VM use one virtual processors
现在关闭您的 docker 并等待“vmmem”在任务管理器中关闭。
然后您可以重新启动 docker,通常“vmmem”不会超过您设置的限制(此处为 900MB) 如果不起作用,请重新启动计算机。
希望对你有帮助。
【讨论】:
非常感谢您的回答。 Docker应该提供设置这个或其他东西。 Here 是微软在.wslconfig
上的文档供参考。
使用.wslconfig
文件可以减轻资源消耗,但实际上会使容器本身比以前更慢。我想我只是没有足够的内存,将不得不继续使用 Docker 而不利用 wsl2。
我发现像这样通过.wslconfig
限制内存对Docker 的性能有很大的影响。没有它,Docker 似乎会使用尽可能多的资源。在我的 16GB 机器上将 Docker 限制为 memory=6GB
可以更好地使用 Docker。最佳设置可能取决于可用的 RAM 以及您使用 Docker 所做的事情,但我猜想在许多情况下将其设置为(相当多!)超过 500MB 可能是明智的!
这个调整对我也产生了巨大的影响。 Vmmem
在 docker build
期间编译程序时消耗了我机器上的所有可用 CPU。我的机器实际上几个小时都没有响应,而编译停滞不前,不得不kill -9
docker 进程。在将memory
和processors
分别设置为我系统上可用的一半后,相同的构建在大约10 分钟内完成。谢谢!
这使我免于对 WSL 感到厌烦而放弃了。谢谢。【参考方案2】:
您可能将代码存储在 Windows 机器上的类似文件夹中...
C:\\Users\YourName\projects\blahfu
但是您在 WSL 2 上使用 Docker,这是一个不同的 (Linux) 文件系统。因此,当您进行 Docker 构建时,所有代码/上下文都会从 Windows 文件系统复制到 Linux 文件系统,然后再从那里复制到 Docker 容器。这是最耗时的,而且速度非常慢。
尝试将您的项目放入这样的文件夹中...
/home/YouName/projects/blahfu
您应该会获得相当大的性能提升。
【讨论】:
我不确定我是否理解,但就我而言,我有一个带有 Oracle 数据库的 Linux 容器,所有数据都在容器本身内。 @doberkofler 在开发过程中,您应该将源代码挂载到 docker 容器中(如果您不想在每次代码更改时销毁/创建容器)...但是您说的是分贝,对吧!?如果您的数据库的数据目录没有存储在本地(在本地挂载点内),无论如何它都很慢;) 所有文件都存储在Linux容器中,我只通过sql*net访问容器。 @Andy:从技术上讲,您的方法是有道理的,但 WSL 的想法是利用 Linux 的强大功能在 Windows 上灵活工作,并且它应该注意性能问题。如果我们将所有东西都移到 WSL 文件夹结构中,那么我怀疑。 @srk 是的。你说得对。我更喜欢在 Ubuntu 上工作,但我的雇主坚持使用 Windows ......因为符合 PCI 标准。所以对我来说这是一种解决方法^^我什至在 WSL 上使用 X 窗口管理器运行我的 IDE....【参考方案3】:wsl 容器具有与 windows 文件系统隔离的适当文件系统。 基本思想是将源代码从 windows 文件系统复制到 wsl 文件系统。
您可以从窗口访问 wsl 容器并将您的项目复制到 wslcontainer :
用资源管理器导航到\\wsl$
从这个位置重建容器,这样就可以了!
【讨论】:
我不明白。您能否详细说明您的评论? 正如我在这里已经提到的,包含所有数据文件的完整数据库存储在容器本身中,根本没有挂载的 windows 文件系统。 好的,所以,您的计算机运行 Windows 10 是因为您询问 wsl2,对吧?因此,当您说“数据文件存储在容器本身中并且根本没有安装的 Windows 文件系统”时,问题是您的 docker-compose.yml 文件和定义您的 docker 容器的所有其他文件存储在哪里?这个 fils 不能在 docker 容器中,因为没有它们就没有容器。所以我猜你让你做docker compose的这个文件在你的windows fs上,对吧?是吗?-> 将它们迁移到 wsl 否?-> 我假设它们已经在 wsl 中,所以其他让 docker 变慢的事情 是的,我在 Windows 10 上运行并询问 wsl2,但我不确定我是否了解其他 cmets。在我的具体情况下,容器本身是docker run
来自在另一台计算机上构建的映像,并且确实包含所有需要执行的文件。
好的,所以我们是,文档说:“docker run image-name : image-name could be a docker image on your local machine[...]”当你运行你的图像构建在其他计算机上,您仍然运行位于您计算机上的映像。所以问题是这张图片在你的电脑上存储在哪里?【参考方案4】:
如果实际 docker 容器的数据存储在 windows 文件系统(即 NTFS)上,而不是存储在本机 linux 文件系统上(不管 docker 容器的内容是什么,很可能已经基于 linux),那么我认为您会看到性能下降,因为您正在运行 WSL 并使用已挂载的 WINDOWS 文件系统(即 /c/mnt/...)中的 docker 容器。
如果您将 docker 容器复制到 /usr/local 或 WSL 上的 /home//docker 之类的位置,那么您可能会看到 10 倍的性能提升。试试看它是否有效?
【讨论】:
包含所有数据文件的完整数据库存储在容器本身中,没有挂载的windows文件系统。 那些wsl文件存放在C:\对吧?如果是这样,它会使我的 C 盘很快满,因为程序文件等也存储在那里:'(【参考方案5】:您需要编辑“vmmem”资源 只需在路径中添加文件 .wslconfig
C:\Users
.wslconfig
使用 .wslconfig 配置全局选项
Available in Windows Build 19041 and later
您可以通过将 .wslconfig 文件放入用户文件夹的根目录中来配置全局 WSL 选项:C:\Users
wsl --shutdown
关闭 WSL 2 虚拟机,然后重新启动您的 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
看到这个https://docs.microsoft.com/en-us/windows/wsl/wsl-config
【讨论】:
kernel
路径是什么?如何找到它?
如果你使用这样的默认值,可以留空 [wsl2] memory=4GB # 将 WSL 2 中的 VM 内存限制为 4 GB 处理器=3 # 使 WSL 2 VM 使用两个虚拟处理器【参考方案6】:
如果您使用的是 VS Code,有一个名为“Remote-Containers: Clone Repository in Container Volume...”的命令可确保您可以全速访问文件。
形成documentation:
存储库容器使用隔离的本地 Docker 卷,而不是绑定到本地文件系统。除了不会污染您的文件树之外,本地卷还具有提高 Windows 和 macOS 性能的额外好处。
【讨论】:
以上是关于wsl2上的docker非常慢的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows 10 Home 上使用 WSL2 上的 Docker Desktop 时,如何更改 docker 映像的位置?
带有 VSCode + WSL2 + Docker 的 Windows 上的 Git + SSH 密钥问题