现在nginx + fpm 基本成为主流的配置,其中我们比较关注的是pm.max_children的配置
首先,我们关注一个前提设置: pm = static/dynamic,这个选项是标识fpm子进程的产生模式:
一般推荐用static,优点是不用动态的判断负载情况,提升性能,缺点是多占用些系统内存资源。
max_chindren代表的worker的进程数,普遍认为,这个配置越多能同时处理的并发也就越多。但这是一个比较大的误区:
理论上woker进程数=cpu的个数是最合理的,但由于第2点的原因,可能每个worker都没处理完请求,这样,就会频现502了。但多开请求,只是说避免502,暂时把请求hang住,这只是缓解之道,实际上这不但不会增加系统的并发,而且会加重系统的负荷,所以,设置一个合理的worker数就比较重要了。
天下武功,唯快不破,只有尽可能的提升程序的效率,把单个请求的时间压缩到最低,这样,单个worker的处理时间变短了,那在单位时间里能处理的请求自然就多了。
那么可以通过每个worker在单位时间内处理的请求数来预估max_children的个数。假如最大的一个请求的处理时间是100ms内,而在100ms之内同时有100个请求过来,那了理论上就需要配置100个worker进程,先把请求给hang住。
但最大的请求耗时可能会受很多外在的情况影响,不太好预估,其实这里有一个捷径,来配置你的max_children数, 就是你前期先把max_childnren设置成一个比较大的值,稳定运行一段时间后,观察fpm的status里的 max active processes 是多少,然后把max_children配置比他大一些就ok了。
希望这些文章能给大家有一些帮助。
来自 http://www.epooll.com/archives/784/
## 模式选择
pm = static/dynamic
## STATIC MODE
生效配置:
pm.max_children(同一时间可存在的最大进程数)
## DYNAMIC MODE
生效配置:
pm.start_servers(php启动时创建的进程数)
pm.min_spare_servers(处于idle状态下最少的进程数,少于此数会创建进程)
pm.max_spare_servers(处于idle状态下最多的进程数,多于此数会杀掉进程)
pm.max_children(同static中的效果,和pm.max_spare_servers区别在于,后者是设定的idel状态进程数,而前者是配置的所有状态下进程最大数目)
配置文件中的解释说明
; Choose how the process manager will control the number of child processes. ; Possible Values: ; static - a fixed number (pm.max_children) of child processes; ; dynamic - the number of child processes are set dynamically based on the ; following directives: ; pm.max_children - the maximum number of children that can ; be alive at the same time. ; pm.start_servers - the number of children created on startup. ; pm.min_spare_servers - the minimum number of children in 'idle' ; state (waiting to process). If the number ; of 'idle' processes is less than this ; number then some children will be created. ; pm.max_spare_servers - the maximum number of children in 'idle' ; state (waiting to process). If the number ; of 'idle' processes is greater than this ; number then some children will be killed. ; Note: This value is mandatory.