Laravel 5.2 高 cpu 和长路线

Posted

技术标签:

【中文标题】Laravel 5.2 高 cpu 和长路线【英文标题】:Laravel 5.2 High cpu with long routes 【发布时间】:2016-11-25 17:04:28 【问题描述】:

我已经用 php 5.5 和 apache 2.4 设置了一个 ubuntu 14.04。

我安装了新的 laravel 5.2。项目中没有数据库连接。

然后我什么时候去app/Http/routes.php并编辑成:

Route::get('/', function () 
    return view('welcome');
);


Route::get('/test/direct', function () 
    return view('welcome');
);

所以基本上我有 2 条路线只显示欢迎视图。

然后我运行:

ab -n 9999999 -t 300 -c 30 http://xxxxx/laravel52/public

Cpu 从未超过 6%,我得到以下结果:

Server Software:        Apache/2.4.7
Server Hostname:        xxxxx
Server Port:            80

Document Path:          /laravel52/public
Document Length:        328 bytes

Concurrency Level:      30
Time taken for tests:   146.271 seconds
Complete requests:      50000
Failed requests:        0
Non-2xx responses:      50000
Total transferred:      28550000 bytes
html transferred:       16400000 bytes
Requests per second:    341.83 [#/sec] (mean)
Time per request:       87.763 [ms] (mean)
Time per request:       2.925 [ms] (mean, across all concurrent requests)
Transfer rate:          190.61 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       15   47  77.0     40    3157
Processing:    17   41  28.1     37    2140
Waiting:       17   40  26.9     37    2140
Total:         40   87  84.3     78    3208

Percentage of the requests served within a certain time (ms)
  50%     78
  66%     83
  75%     86
  80%     89
  90%    100
  95%    120
  98%    162
  99%    228
 100%   3208 (longest request)

然后我运行:

ab -n 9999999 -t 300 -c 30 http://xxxxx/laravel52/public/test/direct

Cpu 立即上升到 100%,最后我得到以下结果:

Server Software:        Apache/2.4.7
Server Hostname:        xxxxx
Server Port:            80

Document Path:          /laravel52/public/test/direct
Document Length:        1023 bytes

Concurrency Level:      30
Time taken for tests:   300.001 seconds
Complete requests:      11888
Failed requests:        0
Total transferred:      24585740 bytes
HTML transferred:       12161424 bytes
Requests per second:    39.63 [#/sec] (mean)
Time per request:       757.070 [ms] (mean)
Time per request:       25.236 [ms] (mean, across all concurrent requests)
Transfer rate:          80.03 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        4   12  29.4      8    1020
Processing:    75  740 790.0    609   14045
Waiting:       74  738 789.9    608   14043
Total:         88  752 789.4    622   14050

Percentage of the requests served within a certain time (ms)
  50%    622
  66%    835
  75%    952
  80%   1020
  90%   1237
  95%   1536
  98%   2178
  99%   2901
 100%  14050 (longest request)

如果不是根路由,如果有很多连接,似乎 laravel 会使 cpu 尖峰。这也发生在 laravel 4.2 的全新安装中。

谁能指出为什么会发生这种情况?我真的需要解决这个问题。

我的服务器有一个 8 核 Intel(R) Core(TM) i7-4771 CPU @ 3.50GHz 和 8GB RAM。

谢谢。

【问题讨论】:

【参考方案1】:

您可以缓存路由以加快路由解析,但route caching 不适用于基于闭包的路由。要使用路由缓存,您必须将任何 Closure 路由转换为使用控制器类。

要缓存您的路由,请执行 php artisan route:cache 并清除缓存 php artisan route:clear

您还应该考虑php artisan optimize 将公共类编译到单个文件中,从而减少每个请求中包含的数量,以及php artisan config:cache 将所有配置文件合并到单个文件中以加快加载速度。

【讨论】:

嗨@Malta,它没有解决问题。它仍然存在。使用 1 个返回欢迎视图的方法创建了一个控制器。将我必须的 2 条路线映射到“TestController@showWelcome”。跑php artisan route::cachephp artisan optimize。得到或多或少相同的结果。【参考方案2】:

忘记这个。这不是 Laravel 的问题。这是本机特有的问题。不久前,我将 ubuntu 12.04 升级到 14.04。在这样做的过程中,它将 apache 2.2 升级到 2.4,但保留了部分配置。问题应该存在,因为 Magento 等其他框架的行为方式相同。

【讨论】:

以上是关于Laravel 5.2 高 cpu 和长路线的主要内容,如果未能解决你的问题,请参考以下文章

laravel 5.2 中特定路由的 web 中间件

只能访问 Laravel 5.2 中的 / 路由

如何更改 Laravel 5.2 更改登录路由?

Laravel 5.2 - 会话不会在路由更改中持续存在

删除功能 Laravel 5.2

java(12)-深入分析java进程CPU飙高和长耗时