nginx+php-fpm怎么配置才可以每秒处理能力?

玖伍陈海天 发布于 2017/06/25 16:46
阅读 1K+
收藏 2

centos,24核32G

ab压力测试工具,1000并发客户端请求页面5万次

lnmp环境下,压力测试静态html处理能力达到14000次每秒

(这个静态处理能力我也想提升,主要是服务器资源还剩余的多)

 ab -c 1000 -n 50000 -k   http://127.0.0.1/index.html

Concurrency Level:      1000
Time taken for tests:   3.387 seconds
Complete requests:      50000
Failed requests:        0
Write errors:           0
Keep-Alive requests:    50000
Total transferred:      23341512 bytes
HTML transferred:       11619792 bytes
Requests per second:    14764.11 [#/sec] (mean)
Time per request:       67.732 [ms] (mean)
Time per request:       0.068 [ms] (mean, across all concurrent requests)
Transfer rate:          6730.79 [Kbytes/sec] received

 

================================

 

但是测试一个很简单的PHP页面(只有echo语句)才3000次每秒

Concurrency Level:      1000
Time taken for tests:   12.982 seconds
Complete requests:      50000
Failed requests:        0
Write errors:           0
Keep-Alive requests:    0
Total transferred:      13250265 bytes
HTML transferred:       3450069 bytes
Requests per second:    3851.56 [#/sec] (mean)
Time per request:       259.635 [ms] (mean)
Time per request:       0.260 [ms] (mean, across all concurrent requests)
Transfer rate:          996.76 [Kbytes/sec] received

php-fpm的状态页大概如下:最大800的php-fpm进程实际最高用了不到30的进程

在压力测试的期间,top命令查看机器的cpu和内存,cpu占用不到8%,内存占用不到20%

listen queue:         0
max listen queue:     0
listen queue len:     0
idle processes:       355
active processes:     14
total processes:      369
max active processes: 269
max children reached: 0
slow requests:        0

php-fpm开的进程是800,但是压力测试的时候观察php-fpm状态页显示的活动进程只有300左右,请求完成都是200状态,但是秒处理能力太弱了,感觉php-fpm没有完全启动并发处理,按道理应该是在有请求的时候应该全部启动运行,有人知道这个怎么提高php处理能力么??

我想要压榨服务器的性能啊,这感觉没有跑起来啊。。有大神知道的给我指导下拉,,谢谢。

加载中
0
mickelfeng
mickelfeng

php-fpm进程数并不是开得越多越好。php-fpm 进程同一时间只能处理一个请求。

0
玖伍陈海天
玖伍陈海天

引用来自“mickelfeng”的评论

php-fpm进程数并不是开得越多越好。php-fpm 进程同一时间只能处理一个请求。

php-fpm是同时只能处理一个请求,所以我才多开,希望让php-fpm同时可以处理800个请求,但是现在看来在并发的情况下,这800个都没有用到,大部分是空闲状态的,反而正常的请求还是在进行一个排队处理,怎么利用起来呢?

0
开源中国-首席营养师

start_servers = 500

max_children = 800

request_terminate_timeout = 0

max_requests = 0

0
玖伍陈海天
玖伍陈海天

引用来自“取名字总是失败”的评论

start_servers = 500

max_children = 800

request_terminate_timeout = 0

max_requests = 0

差不多是按你这样的设置的哈
pm = dynamic
pm.max_children = 800
pm.start_servers = 300
pm.min_spare_servers = 100
pm.max_spare_servers = 800

request_terminate_timeout = 100
request_slowlog_timeout = 0

0
我玩长线
我玩长线

start_servers = min_spare_servers + (max_spare_servers - min_spare_servers) / 2

我玩长线
我玩长线
回复 @玖伍陈海天 : 涨姿势了
玖伍陈海天
玖伍陈海天
谢谢大哥,回来看评论
0
开源中国-首席营养师

引用来自“取名字总是失败”的评论

start_servers = 500

max_children = 800

request_terminate_timeout = 0

max_requests = 0

引用来自“玖伍陈海天”的评论

差不多是按你这样的设置的哈
pm = dynamic
pm.max_children = 800
pm.start_servers = 300
pm.min_spare_servers = 100
pm.max_spare_servers = 800

request_terminate_timeout = 100
request_slowlog_timeout = 0

pm = static

pm.min_spare_servers = 0

0
eechen
eechen
<?php
// 1 秒 = 1000 毫秒 = 1000000 微秒
$start = microtime(true);
for ($i = 0; $i < 1000; $i++) {
	// 睡眠会导致发生1次上下文切换,所以耗时总和为睡眠的耗时+上下文切换的耗时.
	usleep(1000);
}
echo (microtime(true) - $start) . "\n";
?>

1次上下文切换耗时 = ( 1.092894077301(总耗时) - 1(睡眠耗时) - 0.000014066696166992(无usleep时脚本耗时) ) / 1000次 = 0.00009288 秒/次 = 92.88 微秒/次 (接近万分之一秒)
vmstat 1 中也确实看到了上下文切换(cs)增加了1000多.

 

可见,1次上下文切换耗时大约为万分之一秒.
也就是说,如果系统发生了1万次上下文切换,那就有1秒中的CPU时间会被浪费掉.

 

所以,别搞太多PHP-FPM工作进程,你可以尝试只开固定数量的24个PHP-FPM进程来测试,看看RPS有没有提高.其中24是为了跟CPU核心数对应,而listen.backlog是PHP请求队列的大小,队列里的PHP请求等待PHP-FPM accept后处理.

 

PHP测试内容建议使用phpinfo(),Nginx测试内容建议使用phpinfo()输出的HTML(100KB左右).

 

nginx.conf:
worker_processes 24;

 

php-fpm.conf:
listen.backlog = 65535
pm = static
pm.max_children = 24

玖伍陈海天
玖伍陈海天
感谢你!谢谢
返回顶部
顶部