解决 Windows 系统使用 Docker 运行 Larave
今天在新电脑上装docker,项目搭建好之后,发现访问项目异常的慢,仔细排查后,发现是微软wsl2子系统的问题,磁盘IO太慢,导致的响应时间超长。
解决方法:在docker设置页面,General->把除第一个复选框全部取消掉。特别是其中一个use the wsl2 based engine,就是我们访问慢的罪魁祸首。
点击apply & restart。
注意:这会使镜像丢失,我们需要重新安装镜像。
下面总结下我在排查时用到的关键词:
nginx error.log access.log
我排查了nginx的error.log和access.log未见异常,排除是网络层面的bug。
PHP-FPM.log 和 slow.log
然后排查了php-fpm.log和slow.log(slow.log需要自己修改php-fpm.conf)
slow.log中没有异常,但是php-fpm.log有一条报错,并且提示我index.php执行时间过长
php slowlog causing ptrace error in docker container
child , script '/www/public/index.php' (request: "GET /index.php") executing too slow
我查询了下关键词:
使用docker run --cap-add参数解决权限问题
ERROR: failed to ptrace(ATTACH) child 425: Operation not permitted (1)
Docker php-fpm 慢查询 failed to ptrace Operation not permitted
发现是权限问题,但这不涉及到我们的项目,存在误导性。
laravel 社区
Laravel 第一次访问慢的问题
解决 Windows 系统使用 Homestead 运行 Laravel 本地项目响应缓慢问题
在laravel社区寻找,发现其中一篇提到,磁盘IO的关键词。我想了想,他这是NTFS的磁盘问题,我的会不会也是这个导致的。
解铃还须系铃人
回想我上一个系统所装的docker是基于Hyper-v的,就没有出问题,难道是WSL2的磁盘IO不行?我在Docker设置中关闭WSL2的支持,启用Hyper-v,问题果然解决了。
总结
docker不能使用wsl2,windows的子系统,会导致磁盘IO异常的慢。我所使用的是Windows企业版,其他暂未测试,但应该大抵相同。
最后
如果使用了debugbar,可以看到日志如下
"time": {
"start": 1590236649.486974,
"end": 1590236663.997423,
"duration": 14.510448932647705,
"duration_str": "14.51s",
"measures": [{
"label": "Booting",
"start": 1590236649.486974,
"relative_start": 0,
"end": 1590236659.366377,
"relative_end": 1590236659.366377,
"duration": 9.879403114318848,
"duration_str": "9.88s",
"params": [],
"collector": null
}, {
"label": "Application",
"start": 1590236659.618144,
"relative_start": 10.13117003440857,
"end": 1590236663.997425,
"relative_end": 2.1457672119140625e-6,
"duration": 4.379281044006348,
"duration_str": "4.38s",
"params": [],
"collector": null
}]
},
可以看到Booting占时超长。Boot时,多数是在执行autoload,以及require文件,这也侧面辅助我做了判断。