解决访问本地 docker 项目慢的问题

前言

以前在本地开发都是直接搭建nginx+php+mysql,后来因php版本问题,将其单独打包成docker应用来使用,但是在使用过程中发现访问项目时特别慢,几乎每次都是4-6秒,甚至有时会超过10秒,开始以为是项目本身代码的问题,调试发现如果仅在index.php直接输出的话还是非常快的,说明这个消耗是在框架内部产生的,所以按照启动顺序逐步排查,发现代码本身的解析速度几乎不受影响,只是在某些需要引入其他文件(路由文件)的地方会特别慢,文件越大所需时间越长,不想在本地开发时浪费太多的时间去等待,所以想查看一下是哪块引起的原因,该怎么解决。

解决方案:

如果觉得太麻烦不想看解决过程的话可以直接看本次解决方案:

在docker挂载宿主机目录时加入cached参数,作用是把主机文件缓存至容器中,容器会使用内部的缓存而不是宿主机上的文件
例如 : docker run -d -p 9000:9000 –name php-dubbo-cache -v /Users/admin/Site:/data/:cached php-fpm

环境说明

操作系统:mac 10.14.5
PHP框架: Laravel 5.7
docker资源分配: cpu(2) memory(2GB) swap(1GB)

因代码一模一样,所以想从环境本身的原因找下问题,暂时没有开启框架本身的路由缓存和配置缓存。本来想使用xdebug的性能分析,但是返回504,后来将nginx的超时时间加长后返回502,暂时没有找到原因,故手动跟踪代码。

测试代码

为本次分析只想查看框架启动耗时,所以不包含任何业务逻辑,仅仅到路由层就结束。

Route::get('docker',function(){
    execTime('到达路由文件的时间');
});

结果(完整查询过程在最后)

本次访问用时大概6秒左右,从分析过程中发现有两处比较明显的耗时和文件处理有关,所以猜测是不是和docker的目录有关系,然后去查找相关资料,有说在挂载目录处加入cached参数,试了下加上后效果有明显的提升,文档上说可能会有写入延迟,但我试了下几乎没感觉出来,可能在机器负载比较高的时候会有体现吧。

加cache之前大概用时6秒,加cache之后平均速度基本在100毫秒左右。

1.引入自定义的路由文件: App\Providers\RouteServiceProvider.php->map()

image

2.解析路由至指定代码处: Illuminate\Foundation\Http\Kernel.php->dispatchToRouter

image

完整过程

没有在所有方法中打印耗时,仅在我认为可能会有问题的地方打印

【加cache前】

[开始时间(毫秒)] - [与上次执行间隔时间(毫秒)] - [当前时间] - [执行内容]
[0] - [0] - 1564561617.095 - Laravel start
[639] - [0] - 1564561617.7337 - Kernel construct start
[639] - [0] - 1564561617.7341 - Kernel construct end
[750] - [111] - 1564561617.8451 - Kernel handle start
[760] - [10] - 1564561617.8548 - Kernel bootstrap start
[760] - [0] - 1564561617.8549 - App bootstrapWith start
[760] - [0] - 1564561617.855 - App bootstarpWith Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables start
[898] - [138] - 1564561617.9926 - App bootstarpWith Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables end
[898] - [0] - 1564561617.9927 - App bootstarpWith Illuminate\Foundation\Bootstrap\LoadConfiguration start
[1234] - [336] - 1564561618.3287 - App bootstarpWith Illuminate\Foundation\Bootstrap\LoadConfiguration end
[1234] - [0] - 1564561618.3288 - App bootstarpWith Illuminate\Foundation\Bootstrap\HandleExceptions start
[1244] - [10] - 1564561618.3388 - App bootstarpWith Illuminate\Foundation\Bootstrap\HandleExceptions end
[1244] - [0] - 1564561618.3388 - App bootstarpWith Illuminate\Foundation\Bootstrap\RegisterFacades start
[1293] - [49] - 1564561618.3881 - App bootstarpWith Illuminate\Foundation\Bootstrap\RegisterFacades end
[1293] - [0] - 1564561618.3882 - App bootstarpWith Illuminate\Foundation\Bootstrap\RegisterProviders start
[1735] - [442] - 1564561618.8303 - App bootstarpWith Illuminate\Foundation\Bootstrap\RegisterProviders end
[1735] - [0] - 1564561618.8303 - App bootstarpWith Illuminate\Foundation\Bootstrap\BootProviders start
[1750] - [14] - 1564561618.8446 - BootProviders bootstrap start
[1750] - [0] - 1564561618.8447 - BootProviders bootstrap Illuminate\Events\EventServiceProvider start
[1750] - [0] - 1564561618.8448 - BootProviders bootstrap Illuminate\Events\EventServiceProvider end
[1750] - [0] - 1564561618.8448 - BootProviders bootstrap Illuminate\Log\LogServiceProvider start
[1750] - [0] - 1564561618.8449 - BootProviders bootstrap Illuminate\Log\LogServiceProvider end
[1750] - [0] - 1564561618.845 - BootProviders bootstrap Illuminate\Routing\RoutingServiceProvider start
[1750] - [0] - 1564561618.8451 - BootProviders bootstrap Illuminate\Routing\RoutingServiceProvider end
[1750] - [0] - 1564561618.8452 - BootProviders bootstrap Illuminate\Auth\AuthServiceProvider start
[1750] - [0] - 1564561618.8453 - BootProviders bootstrap Illuminate\Auth\AuthServiceProvider end
[1750] - [0] - 1564561618.8453 - BootProviders bootstrap Illuminate\Cookie\CookieServiceProvider start
[1750] - [0] - 1564561618.8454 - BootProviders bootstrap Illuminate\Cookie\CookieServiceProvider end
[1750] - [0] - 1564561618.8455 - BootProviders bootstrap Illuminate\Database\DatabaseServiceProvider start
[1785] - [34] - 1564561618.8798 - BootProviders bootstrap Illuminate\Database\DatabaseServiceProvider end
[1785] - [0] - 1564561618.8799 - BootProviders bootstrap Illuminate\Encryption\EncryptionServiceProvider start
[1785] - [0] - 1564561618.88 - BootProviders bootstrap Illuminate\Encryption\EncryptionServiceProvider end
[1785] - [0] - 1564561618.8801 - BootProviders bootstrap Illuminate\Filesystem\FilesystemServiceProvider start
[1785] - [0] - 1564561618.8802 - BootProviders bootstrap Illuminate\Filesystem\FilesystemServiceProvider end
[1785] - [0] - 1564561618.8803 - BootProviders bootstrap Illuminate\Foundation\Providers\FormRequestServiceProvider start
[1786] - [1] - 1564561618.8808 - BootProviders bootstrap Illuminate\Foundation\Providers\FormRequestServiceProvider end
[1786] - [0] - 1564561618.8809 - BootProviders bootstrap Illuminate\Foundation\Providers\FoundationServiceProvider start
[1786] - [0] - 1564561618.881 - BootProviders bootstrap Illuminate\Foundation\Providers\FoundationServiceProvider end
[1786] - [0] - 1564561618.8811 - BootProviders bootstrap Illuminate\Notifications\NotificationServiceProvider start
[1889] - [102] - 1564561618.9836 - BootProviders bootstrap Illuminate\Notifications\NotificationServiceProvider end
[1889] - [0] - 1564561618.9838 - BootProviders bootstrap Illuminate\Pagination\PaginationServiceProvider start
[1893] - [4] - 1564561618.9879 - BootProviders bootstrap Illuminate\Pagination\PaginationServiceProvider end
[1893] - [0] - 1564561618.988 - BootProviders bootstrap Illuminate\Session\SessionServiceProvider start
[1893] - [0] - 1564561618.9883 - BootProviders bootstrap Illuminate\Session\SessionServiceProvider end
[1893] - [0] - 1564561618.9884 - BootProviders bootstrap Illuminate\View\ViewServiceProvider start
[1893] - [0] - 1564561618.9885 - BootProviders bootstrap Illuminate\View\ViewServiceProvider end
[1894] - [0] - 1564561618.9886 - BootProviders bootstrap Fideloper\Proxy\TrustedProxyServiceProvider start
[1909] - [16] - 1564561619.0044 - BootProviders bootstrap Fideloper\Proxy\TrustedProxyServiceProvider end
[1909] - [0] - 1564561619.0045 - BootProviders bootstrap Maatwebsite\Excel\ExcelServiceProvider start
[1940] - [30] - 1564561619.0346 - BootProviders bootstrap Maatwebsite\Excel\ExcelServiceProvider end
[1940] - [0] - 1564561619.0347 - BootProviders bootstrap Overtrue\LaravelWeChat\ServiceProvider start
[1940] - [0] - 1564561619.035 - BootProviders bootstrap Overtrue\LaravelWeChat\ServiceProvider end
[1940] - [0] - 1564561619.0351 - BootProviders bootstrap App\Providers\AppServiceProvider start
[1943] - [3] - 1564561619.0384 - BootProviders bootstrap App\Providers\AppServiceProvider end
[1943] - [0] - 1564561619.0385 - BootProviders bootstrap App\Providers\AuthServiceProvider start
[1984] - [41] - 1564561619.0795 - BootProviders bootstrap App\Providers\AuthServiceProvider end
[1985] - [0] - 1564561619.0796 - BootProviders bootstrap App\Providers\EventServiceProvider start
[1994] - [10] - 1564561619.0895 - BootProviders bootstrap App\Providers\EventServiceProvider end
[1995] - [0] - 1564561619.0896 - BootProviders bootstrap App\Providers\RouteServiceProvider start
[1995] - [0] - 1564561619.0899 - routeServiceProvider boot start
[2026] - [31] - 1564561619.1213 - map start
[3611] - [1585] - 1564561620.7065 - map end
[3612] - [0] - 1564561620.7066 - routeServiceProvider boot end
[3612] - [0] - 1564561620.7067 - BootProviders bootstrap App\Providers\RouteServiceProvider end
[3612] - [0] - 1564561620.7067 - BootProviders bootstrap App\Log\LogServiceProvider start
[3612] - [0] - 1564561620.7068 - BootProviders bootstrap App\Log\LogServiceProvider end
[3612] - [0] - 1564561620.7069 - BootProviders bootstrap App\Providers\ComposerServiceProvider start
[3626] - [14] - 1564561620.7212 - BootProviders bootstrap App\Providers\ComposerServiceProvider end
[3822] - [196] - 1564561620.9169 - BootProviders bootstrap end
[3823] - [1] - 1564561620.9176 - App bootstarpWith Illuminate\Foundation\Bootstrap\BootProviders end
[3823] - [0] - 1564561620.9177 - App bootstrapWith end
[3823] - [0] - 1564561620.9178 - Kernel bootstrap end
[3983] - [160] - 1564561621.0776 - Kernel dispatchToRouter start
[6287] - [2305] - 1564561623.3823 - 到达路由文件的时间

【加cache后】

[0] - [0] - 1564564509.84 - Laravel start
[2] - [0] - 1564564509.8415 - Kernel construct start
[2] - [0] - 1564564509.8416 - Kernel construct end
[2] - [1] - 1564564509.8422 - Kernel handle start
[2] - [0] - 1564564509.8422 - Kernel bootstrap start
[2] - [0] - 1564564509.8423 - App bootstrapWith start
[2] - [0] - 1564564509.8423 - App bootstarpWith Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables start
[14] - [12] - 1564564509.854 - App bootstarpWith Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables end
[14] - [0] - 1564564509.8541 - App bootstarpWith Illuminate\Foundation\Bootstrap\LoadConfiguration start
[30] - [15] - 1564564509.8695 - App bootstarpWith Illuminate\Foundation\Bootstrap\LoadConfiguration end
[30] - [0] - 1564564509.8696 - App bootstarpWith Illuminate\Foundation\Bootstrap\HandleExceptions start
[30] - [0] - 1564564509.8698 - App bootstarpWith Illuminate\Foundation\Bootstrap\HandleExceptions end
[30] - [0] - 1564564509.8699 - App bootstarpWith Illuminate\Foundation\Bootstrap\RegisterFacades start
[36] - [6] - 1564564509.8755 - App bootstarpWith Illuminate\Foundation\Bootstrap\RegisterFacades end
[36] - [0] - 1564564509.8756 - App bootstarpWith Illuminate\Foundation\Bootstrap\RegisterProviders start
[39] - [3] - 1564564509.879 - App bootstarpWith Illuminate\Foundation\Bootstrap\RegisterProviders end
[39] - [0] - 1564564509.879 - App bootstarpWith Illuminate\Foundation\Bootstrap\BootProviders start
[39] - [0] - 1564564509.8791 - BootProviders bootstrap start
[39] - [0] - 1564564509.8791 - BootProviders bootstrap Illuminate\Events\EventServiceProvider star
[39] - [0] - 1564564509.8791 - BootProviders bootstrap Illuminate\Events\EventServiceProvider end
[39] - [0] - 1564564509.8791 - BootProviders bootstrap Illuminate\Log\LogServiceProvider start
[39] - [0] - 1564564509.8792 - BootProviders bootstrap Illuminate\Log\LogServiceProvider end
[39] - [0] - 1564564509.8792 - BootProviders bootstrap Illuminate\Routing\RoutingServiceProvider start
[39] - [0] - 1564564509.8792 - BootProviders bootstrap Illuminate\Routing\RoutingServiceProvider end
[39] - [0] - 1564564509.8792 - BootProviders bootstrap Illuminate\Auth\AuthServiceProvider start
[39] - [0] - 1564564509.8792 - BootProviders bootstrap Illuminate\Auth\AuthServiceProvider end
[39] - [0] - 1564564509.8792 - BootProviders bootstrap Illuminate\Cookie\CookieServiceProvider start
[39] - [0] - 1564564509.8793 - BootProviders bootstrap Illuminate\Cookie\CookieServiceProvider end
[39] - [0] - 1564564509.8793 - BootProviders bootstrap Illuminate\Database\DatabaseServiceProvider start
[39] - [0] - 1564564509.8794 - BootProviders bootstrap Illuminate\Database\DatabaseServiceProvider end
[39] - [0] - 1564564509.8794 - BootProviders bootstrap Illuminate\Encryption\EncryptionServiceProvider start
[39] - [0] - 1564564509.8794 - BootProviders bootstrap Illuminate\Encryption\EncryptionServiceProvider end
[39] - [0] - 1564564509.8794 - BootProviders bootstrap Illuminate\Filesystem\FilesystemServiceProvider start
[39] - [0] - 1564564509.8795 - BootProviders bootstrap Illuminate\Filesystem\FilesystemServiceProvider end
[40] - [0] - 1564564509.8795 - BootProviders bootstrap Illuminate\Foundation\Providers\FormRequestServiceProvider start
[40] - [0] - 1564564509.8795 - BootProviders bootstrap Illuminate\Foundation\Providers\FormRequestServiceProvider end
[40] - [0] - 1564564509.8795 - BootProviders bootstrap Illuminate\Foundation\Providers\FoundationServiceProvider start
[40] - [0] - 1564564509.8795 - BootProviders bootstrap Illuminate\Foundation\Providers\FoundationServiceProvider end
[40] - [0] - 1564564509.8796 - BootProviders bootstrap Illuminate\Notifications\NotificationServiceProvider start
[40] - [1] - 1564564509.8804 - BootProviders bootstrap Illuminate\Notifications\NotificationServiceProvider end
[40] - [0] - 1564564509.8804 - BootProviders bootstrap Illuminate\Pagination\PaginationServiceProvider start
[41] - [0] - 1564564509.8805 - BootProviders bootstrap Illuminate\Pagination\PaginationServiceProvider end
[41] - [0] - 1564564509.8805 - BootProviders bootstrap Illuminate\Session\SessionServiceProvider start
[41] - [0] - 1564564509.8805 - BootProviders bootstrap Illuminate\Session\SessionServiceProvider end
[41] - [0] - 1564564509.8805 - BootProviders bootstrap Illuminate\View\ViewServiceProvider start
[41] - [0] - 1564564509.8806 - BootProviders bootstrap Illuminate\View\ViewServiceProvider end
[41] - [0] - 1564564509.8806 - BootProviders bootstrap Fideloper\Proxy\TrustedProxyServiceProvider start
[41] - [1] - 1564564509.8814 - BootProviders bootstrap Fideloper\Proxy\TrustedProxyServiceProvider end
[41] - [0] - 1564564509.8814 - BootProviders bootstrap Maatwebsite\Excel\ExcelServiceProvider start
[42] - [0] - 1564564509.8815 - BootProviders bootstrap Maatwebsite\Excel\ExcelServiceProvider end
[42] - [0] - 1564564509.8815 - BootProviders bootstrap Overtrue\LaravelWeChat\ServiceProvider start
[42] - [0] - 1564564509.8815 - BootProviders bootstrap Overtrue\LaravelWeChat\ServiceProvider end
[42] - [0] - 1564564509.8816 - BootProviders bootstrap App\Providers\AppServiceProvider start
[42] - [0] - 1564564509.8817 - BootProviders bootstrap App\Providers\AppServiceProvider end
[42] - [0] - 1564564509.8817 - BootProviders bootstrap App\Providers\AuthServiceProvider start
[42] - [0] - 1564564509.8818 - BootProviders bootstrap App\Providers\AuthServiceProvider end
[42] - [0] - 1564564509.8818 - BootProviders bootstrap App\Providers\EventServiceProvider start
[42] - [0] - 1564564509.8818 - BootProviders bootstrap App\Providers\EventServiceProvider end
[42] - [0] - 1564564509.8819 - BootProviders bootstrap App\Providers\RouteServiceProvider start
[42] - [0] - 1564564509.8819 - routeServiceProvider boot start
[43] - [1] - 1564564509.8826 - map start
[68] - [25] - 1564564509.9079 - map end
[68] - [0] - 1564564509.9079 - routeServiceProvider boot end
[68] - [0] - 1564564509.9079 - BootProviders bootstrap App\Providers\RouteServiceProvider end
[68] - [0] - 1564564509.908 - BootProviders bootstrap App\Log\LogServiceProvider start
[68] - [0] - 1564564509.908 - BootProviders bootstrap App\Log\LogServiceProvider end
[68] - [0] - 1564564509.908 - BootProviders bootstrap App\Providers\ComposerServiceProvider start
[68] - [0] - 1564564509.9081 - BootProviders bootstrap App\Providers\ComposerServiceProvider end
[69] - [1] - 1564564509.9094 - BootProviders bootstrap end
[70] - [0] - 1564564509.9096 - App bootstarpWith Illuminate\Foundation\Bootstrap\BootProviders end
[70] - [0] - 1564564509.9096 - App bootstrapWith end
[70] - [0] - 1564564509.9096 - Kernel bootstrap end
[71] - [1] - 1564564509.9111 - Kernel dispatchToRouter start
[125] - [54] - 1564564509.9646 - 到达路由文件的时间

后记

可能并不是最好的解决方案,我会持续的跟进这个问题,争取找到最优解决方案。虽然解决方法很简单,但仍然受益很多,可以更深入的了解框架启动过程,从index.php到我们的业务代码都经历了哪些处理,以及分析问题的一些思路,这些是最重要的。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 25

慢在哪里

4年前 评论
ligkwww (楼主) 4年前

我 windows 之前电脑也是很慢,平均 7-8 秒,换了 i7 + 16g 电脑之后,好多了,从按刷新到加载完成也就 1秒 略多吧 :grin:

4年前 评论
ligkwww (楼主) 4年前
Wsmallnews (作者) 4年前

要是运行队列任务,你电脑会直接发呆!~!

4年前 评论
Bin 4年前

Win、Mac都不建议使用docker类似的虚拟化环境

4年前 评论
墨鱼坞 2年前

你们配置的容器都这么慢?我本地windows 10环境,页面打开500ms左右,接口100ms左右,服务器上页面100ms左右,接口20ms左右,windows上会有效率问题,但是不会有这么严重,电脑配置,i5三代,8g内存,ssd

4年前 评论
hbj111 2年前
CleverBilly 2年前

我现在升级wsl2 后一个接口里面什么逻辑也没有 时间久的接口都要5s了,快点16000MS。抓狂

3年前 评论
panqihuan 3年前
墨鱼坞 2年前
panqihuan 2年前
panqihuan 2年前
panqihuan 2年前
墨鱼坞 2年前

现在我是再wsl2 子系统装docker 不存在慢的问题了,不要用docker 桌面版,断电的时候,桌面版 一定会文件损坏,只能重置

2年前 评论
ligkwww (楼主) 2年前
爆炸青山绿水 (作者) 2年前

file 有两个文件夹放哪个比较好呢?

2年前 评论
欧阳逸 (作者) 2年前

可以把代码挂一个tmpfs,丢内存里就快的起飞了。

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!