<value name="max_children">64</value>
max_children :这个要按照服务器的繁忙程度来计算,最好是得到详细的访问者日志后再进行调整。设置的值越大后台跑的php-cgi 进程就越多,这样排队速度就越快。反之就是越少就越慢。但是每一个php-cgi所耗费的内存在20M左右。所以2g的服务器这个值默认都设置成40-64。
<value name="request_slowlog_timeout">0s</value>
request_slowlog_timeout:0s的含义是让PHP-CGI一直执行下去而没有时间限制。默认就设置成0,如果可能出现脚本执行时间超长的话,那就设置为600s左右。
<value name="max_requests">10240</value>
PHP_FCGI_MAX_REQUESTS is the maximum number of requests before an fcgid process is stopped and a new one is launched
强制停止一个php CGi 进程,新建一个进程以响应新请求时,所允许的最大请求数,可以理解为队列长度
PHP_FCGI_CHILDREN php进程数目
PHP_FCGI_MAX_REQUESTS 每个php的进程在退出前能够响应的请求数,用于释放资源 上面两个根据硬件配置和网站访问量设置,默认值是8,500。
一般来说 PHP_FCGI_CHILDREN > 访问并发最大值+10
PHP_FCGI_MAX_REQUESTS 如果设置过小,访问量大的网站会因为php进程重起频繁增加负荷。
max_children=40 , 每个children平均占用20M-30M内存,children越多,可以同时接受的并发数量越多,一般children的值是网站最高并发数+浮动值,这值再×内存占用,就是你需要用到的内存。
max_requests = N 是指当每个children接受了N次请求以后,就会把自己杀死,然后重新建立一个children。
PV / max_children = 每一个children接受的request次数
比如上面的值是1000,而你定义的是10240,那么fpm要超过10天才能杀死children并重建,这样如果存在内存泄露的话,就会导致进程占用过多的内存而无法释放,从而使fpm的处理能力降低,还会产生一些莫名其妙的错误。
但是如果你把这个值设置的过小,fpm频繁的杀死children并重建,也会导致额外的开销。
最好的优化当然是根据你网站的运行情况,去不断的调试,找到一个平衡点。
针对max_children还有一个偷懒的做法,如果你的php是5.3,那么你可以把fpm的style设置为apache-like,这个时候children的数量就由fpm自动控制。相应的配置参数是
start_servers:起始进程数量
min_spare_servers:最小进程数量
max_spare_servers:最大进程数量
当服务器比较空闲的时候,fpm会主动杀死一些多余的children,用来节约资源,当服务器繁忙的时候,服务器会自动建立更多的children。