共计 1620 个字符,预计需要花费 5 分钟才能阅读完成。
现在 nginx + fpm 基本成为主流的配置,其中我们比较关注的是 pm.max_chindren 的配置
首先,我们关注一个前提设置:pm = static/dynamic,
这个选项是标识 fpm 子进程的产生模式:
static:表示在 fpm 运行时直接 fork 出 pm.max_chindren 个 worker 进程,
dynamic:表示,运行时 fork 出 start_servers 个进程,随着负载的情况,动态的调整,最多不超过 max_children 个进程。
一般推荐用 static,优点是不用动态的判断负载情况,提升性能,缺点是多占用些系统内存资源。
上面的告诉我们 max_chindren 代表的 worker 的进程数。普遍认为,这个配置越多能同时处理的并发也就越多,这是一个比较大的误区:
1)查看了 fpm 的相关源码,管理进程和 worker 进程是通过 pipe 进行数据通讯的。所以进程多了,增加进程管理的开销,系统进程切换的开销,更核心的是,能并发执行的 fpm 进程不会超过 cpu 个数。通过多开 worker 的个数来提升 qps,是错误的理解,不会说你多开了几个进程,就多出几个 cpu 来处理。
2)但 worker 进程开少了,如果 server 比较繁忙的话,会导到 nginx 把数据打到 fpm 的时候,发现所有的 woker 都在工作中,没有空闲的 worker 来接受请求,从而导致 502。
那 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 了。
希望这些文章能给大家有一些帮助。
LAMP-PHP-fpm 服务器配置 http://www.linuxidc.com/Linux/2014-06/103093.htm
Ubuntu 14.04 LTS 安装 LNMP Nginx\PHP5 (PHP-FPM)\MySQL http://www.linuxidc.com/Linux/2014-05/102351.htm
高负载 PHP-FPM 调优 http://www.linuxidc.com/Linux/2013-07/86963.htm
Nginx php-fpm 出现 502 解决办法和调优心得 http://www.linuxidc.com/Linux/2013-01/78566.htm
Nginx+PHP-FPM 在两台服务器实现 http://www.linuxidc.com/Linux/2012-11/74001.htm
Ubuntu 10.04 配置 nginx + php-fpm 模式 http://www.linuxidc.com/Linux/2012-11/74001p2.htm
Nginx&&PHP-FPM 配置及优化指南(上)http://www.linuxidc.com/Linux/2012-07/65732.htm