解决 Windows 系统使用 Docker 运行 Laravel 本地项目响应缓慢问题

今天在新电脑上装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文件,这也侧面辅助我做了判断。

打赏作者

发表评论

电子邮件地址不会被公开。