近来看到某些项目,出现异常,负载会飙升到 100 ,200 。
运维的亲们认为 php-fpm 不够用。把标准的配置 100 个 php-fpm 进程修改为 150 个,200 个,或者更大。so,那么
一切猜想还得通过实际来验证。
测试仍然是通过 tcpcopy 这种方便快捷得工具。引流 播放页的请求。修改 php-fpm 配置,主要修改如下:
pm = static -- - 进程数为静态
pm.max_children = 10 --- 开启 10 个
pm.status_path = /status --- 增加一个状态页
分别在 8 core 和 24 core 下进行测试:
[root@SHANGH21-88-DX-DB ~]# curl ‘
……………………………..
idle processes: 0
active processes: 10
total processes: 10
max active processes: 10
max children reached: 0
这是一种比较忙的节奏,但是看nginx 的 error,基本也没有响应出问题的情况。
修改 pm.max_children = 50, 再来看看:
[root@SHANGH21-88-DX-DB logs]# curl ‘
……………………………..
idle processes: 36
active processes: 14
total processes: 50
max active processes: 39
max children reached: 0
看到 max active processes 才 39 个。所以 50 个就可以满足了。
保持 50 个 php-fpm 进程,放大 nginx 的请求为当前的 5 倍。php-fpm 的状态:
[root@SHANGH21-88-DX-DB logs]# curl ‘
……………………………..
idle processes: 0
active processes: 50
total processes: 50
max active processes: 50
max children reached: 0
so,我们再增大 php-fpm 的进程数量,修改到 100 个 php-fpm,负载会不会好些呢?
[root@SHANGH21-88-DX-DB logs]# curl ‘
……………………………..
idle processes: 0
active processes: 100
total processes: 100
max active processes: 100
max children reached: 0
load 只是一路的在上涨,php-fpm 的也没有空闲的。
nginx 的 error 开始间歇性有了 104 的错误:
recv() failed (104: Connection reset by peer) while reading response header from upstream
这种情况下解决的方法,重启服务是没有意义的操作。
我们再来对比一下 24 core 的情况:
按照上门的测试情况再来一边:
[root@SHANGH21-88-DX-DB logs]# curl ‘
……………………………..
idle processes: 0
active processes: 10
total processes: 10
max active processes: 10
max children reached: 0
nginx error 日志会有偶尔的 104 错误。
调整 php-fpm 进程数为 50 个,
[root@SHANGH21-88-DX-DB logs]# curl ‘
……………………………..
idle processes: 34
active processes: 16
total processes: 50
max active processes: 32
max children reached: 0
没有 104 情况,负载很正常。
保持 php-fpm 进程数为 50 ,放大请求为原来的 5 倍:
[root@SHANGH21-88-DX-DB logs]# curl ‘
……………………………..
idle processes: 0
active processes: 50
total processes: 50
max active processes: 51
max children reached: 0
没有 104 ,还可以 hold 住。nginx error 偶尔有这种错误:
zero size buf in output t:1
增大进程到 100 个 php-fpm,再来看看:
[root@SHANGH21-88-DX-DB logs]# curl ‘
……………………………..
idle processes: 29
active processes: 71
total processes: 100
max active processes: 100
max children reached: 0
基本上负载无变化,可以 hold 住。nginx 没有错误日志。
把请求放到 10 倍,看看:
[root@SHANGH21-88-DX-DB logs]# curl ‘
……………………………..
idle processes: 0
active processes: 100
total processes: 100
max active processes: 101
max children reached: 0
开 500 个 php-fpm
[root@SHANGH21-88-DX-DB logs]# curl ‘
……………………………..
idle processes: 167
active processes: 333
total processes: 500
max active processes: 501
max children reached: 0
nginx 伴随着 111 ,104 的错误。
看累了,表格统计一下上面的测试:
php 进程不够用,还是系统 cpu 忙,需要实际验证,而不是盲目的增加 php-fpm 进程数。