PHP-FPM pm.max_chindren该怎么设置?是不是越大越好?

  • A+
所属分类:LNMP

前言:
2018年5月25日,我实在忍受不了网站的高负载了,用了一个下午直接在生产环境进行测试,终于解决了这个问题

对于云主机,负载高,极有可能是php-fpm.conf设置不对,该怎么设置,请参照以下文章,重点:pm.max_chindren不是越大越好,对于系统反而是拖累,请注意!!!
根据我的测试,云主机1核pm.max_chindren设置2足够,4核云主机pm.max_chindren设置为8即可,否则会导致负载奇高,这与虚拟主机的虚拟化技术中资源的调度也有极大关系,如果你使用的独立服务器,可以稍微设置大些,云主机单机情况下,对于高并发应用及密集计算型或数据库操作频繁的应用或网站并不适用,要达到同样的性能实际成本比使用独立服务器还高,怎么取舍,仁者见仁智者见智!!!

调整配置后,日IP5万,4核普通云主机非SSD硬盘,无压力!! php-fpm.conf配置如下:

pm = static
pm.max_children = 8
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 4
pm.max_requests = 600
request_terminate_timeout = 0
request_slowlog_timeout = 5

注意,我用的static模式,只有pm.max_children参数有效,其他几个pm开头的忽略,那些在dynamic模式下才有效
如果你按我的设置,服务器还是容易出现502,那我只能说,你到这个阶段该升级了!

PHP-FPM 子进程数量,是不是越多越好?

当然不是,pm.max_chindren,进程多了,增加进程管理的开销以及上下文切换的开销。

更核心的是,能并发执行的 php-fpm 进程不会超过 cpu 个数。

如何设置,取决于你的代码

如果代码是 CPU 计算密集型的,pm.max_chindren 不能超过 CPU 的内核数。

如果不是,那么将 pm.max_chindren 的值大于 CPU 的内核数,是非常明智的。

pm.max_chindren该怎么设置?

国外技术大拿给出这么个公式:

在 N + 20% 和 M/m 之间。

N 是 CPU 内核数量。
M 是 PHP 能利用的内存数量。
m 是每个 PHP 进程平均使用的内存数量。
适用于 dynamic 方式。

static方式:M/(m * 1.2)

当然,还有一种保险的方式,来配置 max_children。适用于 static 方式。

先把 max_childnren 设置成一个比较大的值。
稳定运行一段时间后,观察 php-fpm 的 status 里的 max
active processes 是多少
然后把 max_children 配置比它大一些就可以了。
pm.max_requests:指的是每个子进程在处理了多少个请求数量之后就重启。

这个参数,理论上可以随便设置,但是为了预防内存泄漏的风险,还是设置一个合理的数比较好

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: