- max_children:php-fpm最大可执行进程数
- max_requests :每个进程请求多少次后就自动结束,然后重新建立一个children。
- request_terminate_timeout:每个请求最长执行时间
max_requests 参数
- max_requests = N 是指当每个children接受了N次请求以后,就会把自己杀死,然后重新建立一个children。
- PV / max_children = 每一个children接受的request次数
比如应该是 max_requests=1000,而定义的是10240,那么fpm要超过10天才能杀死children并重建,这样如果存在内存泄露的话,就会导致进程占用过多的内存而无法释放,从而使fpm的处理能力降低,还会产生一些莫名其妙的错误。
但是如果这个值设置的过小,fpm频繁的杀死children并重建,也会导致额外的开销。
max_requests即是说每个进程若超过这个数目(跟php进程有一点点关系,关系不大),就自动杀死。
max_children 参数
max_children = N
每个children平均占用20M-30M内存,children越多,可以同时接受的并发数量越多,一般children的值是网站最高并发数+浮动值,这值再×内存占用,就是需要用到的内存。
相应的配置参数是
start_servers:起始进程数量
min_spare_servers:最小进程数量
max_spare_servers:最大进程数量
当服务器比较空闲的时候,fpm会主动杀死一些多余的children,用来节约资源,当服务器繁忙的时候,服务器会自动建立更多的children。
max_children & request_terminate_timeout 参数设置
这两个值不是通用的,而是需要自己计算的。
request_terminate_timeout 计算的方式:
如果你的服务器性能足够好,且宽带资源足够充足,PHP脚本没有系循环或BUG的话你可以直接将”request_terminate_timeout” 设置成0s。
0s的含义是让PHP-CGI一直执行下去而没有时间限制。也就是说你的PHP-CGI可能出现某个BUG,或者宽带不够充足或者其他的原因导致你的PHP-CGI能够假死。
那么就建议给”request_terminate_timeout”赋一个值,这个值可以根据你服务器的性能进行设定。一般来说性能越好你可以设置越高,20分钟-30分钟都可以。由于我的服务器PHP脚本需要长时间运行,有的可能会超过10 分钟因此我设置了900秒,这样不会导致PHP-CGI死掉而出现502 Bad gateway这个错误。
max_children 计算的方式:
这个值原则上是越大越好,php-cgi的进程多了就会处理的很快,排队的请求就会很少。
设 置”max_children”也需要根据服务器的性能进行设定,一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M左右,例如 ”max_children”设置成40个,20M*40=800M也就是说在峰值的时候所有PHP-CGI所耗内存在800M以内,低于我的有效内存1G。而如果我的”max_children”设置的较小,比如5-10个,那么php-cgi就会“很累”,处理速度也很慢,等待的时间也较长。如果长时间没有得到处理的请求就会出现504 Gateway Time-out这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现502 Bad gateway这个错误。
max_children基本就是进程数,跟nginx的进程没有想象中的那么大,因为FPM会自己管理进程参数不宜设置过大,很占内存,增加进程的消耗。