解决访问本地 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()
2.解析路由至指定代码处: Illuminate\Foundation\Http\Kernel.php->dispatchToRouter
完整过程
没有在所有方法中打印耗时,仅在我认为可能会有问题的地方打印
【加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 协议》,转载必须注明作者和本文链接
慢在哪里
我 windows 之前电脑也是很慢,平均 7-8 秒,换了 i7 + 16g 电脑之后,好多了,从按刷新到加载完成也就 1秒 略多吧 :grin:
要是运行队列任务,你电脑会直接发呆!~!
Win、Mac都不建议使用docker类似的虚拟化环境
你们配置的容器都这么慢?我本地windows 10环境,页面打开500ms左右,接口100ms左右,服务器上页面100ms左右,接口20ms左右,windows上会有效率问题,但是不会有这么严重,电脑配置,i5三代,8g内存,ssd
我现在升级wsl2 后一个接口里面什么逻辑也没有 时间久的接口都要5s了,快点16000MS。抓狂
现在我是再wsl2 子系统装docker 不存在慢的问题了,不要用docker 桌面版,断电的时候,桌面版 一定会文件损坏,只能重置
可以把代码挂一个tmpfs,丢内存里就快的起飞了。