解决 Windows 系统使用 Docker 运行 Larave

作者: 怀老师 | 来源:发表于2020-05-23 22:12 被阅读0次

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

    相关文章

      网友评论

        本文标题:解决 Windows 系统使用 Docker 运行 Larave

        本文链接:https://www.haomeiwen.com/subject/rdhrahtx.html