9

Windows 10 Docker 基于 WSL 2 时读写性能的坑

 3 years ago
source link: https://www.mokeyjay.com/archives/2970
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
Docker

Windows 10 Docker 基于 WSL 2 时读写性能的坑

Windows 10 启用 WSL 2
Windows 10 启用 Hyper-V 虚拟机

首先到 Docker 官网下载一个 Docker Desktop Windows 安装包
https://www.docker.com/get-started

这有官方的安装教程 https://docs.docker.com/docker-for-windows/install/
安装过程中你会发现它一直在引导你启用 WSL 2,并表示基于 WSL 2 的 Docker 相比基于 Hyper-V 而言拥有各种各样的好处
就连微软官方也在 WSL 2 文档中强调 WSL 2 拥有更好的文件性能等等

3c4c7763a720de14d64e48ccb7140896.png

那既然两个官方都这么说了,那就启用吧。启用完毕后,根据自己的需求部署了 php 和 nginx 容器,准备作为本地开发环境,将 Windows 下的代码目录挂载到容器中,试着访问了一下项目
吃惊地发现原本几百 ms 就能执行完的代码,现在竟要好几秒钟

954d90806d40377864be093ab87f4525.png

这还是在代码已经放到 SSD 里的情况下。如果是在 HDD 里甚至一度逼近 8s

经过几个小时的苦苦排障,最后找到了微软官方的这篇文档《比较 WSL 1 和 WSL 2

667e9c322beb146566f3acba63301a1e.png

我们直接看最后一行,可以看到,WSL 1 的跨 OS 文件性能是要好于 WSL 2 的
好家伙,感情之前说 WSL 2 更好的文件性能是指不跨 OS 的情况下?

又是一番搜索,看了看 WSL 项目 下的几个 issues(具体链接找不到了),大致都是说由于 Windows 和 Linux 的跨系统文件兼容性问题无法得到很好的解决,WSL 2 下访问 Windows 文件性能会非常差

于是,我关闭了 Use the WSL 2 based engine,重启 Docker,此时自动切换到基于 Hyper-V 的模式。再次启动相关容器,尝试访问项目

速度一下子就恢复到可以忍受的范围了,性能竟相差 8 倍有多

也就是说,如果你也像我一样在 Windows 中写代码又在 docker 中运行的话,要么放弃使用 WSL 2,要么忍受龟速文件 IO。好在日常 PHP 的开发并不依赖 WSL 2 的各种完整 Linux 特性

这时可能有人会想到,我把代码文件放在 WSL 2 中挂载到容器里不就没有性能问题了吗?至于 Windows 下如何开发,用 IDE 打开 \\wsl$\ 不就行了吗?
这个办法我已经尝试过了。虽然文件都在本地,但由于 WSL 2 虚拟磁盘的原因,\\wsl$\ 依然走的是 SMB 协议,不仅性能稀烂,而且 IDE 无法获取到文件变更的事件。具体来说就是你 composer 随便依赖一个包,IDE 可能十几二十分钟都缓不过来。这同样是我无法忍受的

但如果你日常开发中使用 VSCode,那么一切又变得简单起来。只要把代码放在 WSL 2 系统中即可解决。至于 Windows 下如何开发,安装一个 Remote – WSL 插件即可。Docker 的官方文档《Develop with Docker and WSL 2》中也有提到这一点
我尝试过这个插件,真的是非常舒服,是真正的云开发。不像 JetBrains 家 IDEs 里所谓的 remote,本质上只是个自动上传的功能而已

DockerHyper-VWindowsWSL
本站文章除注明转载外,均为原创文章。如需转载请注明出处:https://www.mokeyjay.com/archives/2970

Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK