php-fpm优化

vps配置

  • SSD: 10 GB RAID-10
  • RAM: 512 MB
  • CPU: 1x Intel Xeon

问题

php-fpm常年占用过多内存(>60%)。

解决方法

更改php-fpm.conf,路径一般为:/usr/local/php/etc

调整进程管理模式pm,及其相关参数

php-fpm.conf几个重要的参数说明如下:

pm #设置进程管理器如何管理子进程。可用值:static,ondemand,dynamic。

pm.max_children #pm 设置为 static 时表示创建的子进程的数量,pm 设置为 dynamic 时表示最大可创建的子进程的数量。

pm.start_servers #设置启动时创建的子进程数目。仅在 pm 设置为 dynamic 时使用。

pm.min_spare_servers #设置空闲服务进程的最低数目。仅在 pm 设置为 dynamic 时使用。

pm.max_spare_servers #设置空闲服务进程的最大数目。仅在 pm 设置为 dynamic 时使用。

pm.max_requests #设置每个子进程重生之前服务的请求数。

pm.process_idle_timeout #秒数,多久之后结束空闲进程。 仅当设置 pm 为 ondemand。 可用单位:s(秒),m(分),h(小时)或者 d(天)。
  • pm = static,始终保持一个固定数量的子进程,这个数由pm.max_children定义,这种方式很不灵活,也通常不是默认的。
  • pm = dynamic,启动时会产生固定数量的子进程(由pm.start_servers控制)可以理解成最小子进程数,而最大子进程数则由pm.max_children去控制,子进程数会在最大和最小数范围中变化。闲置的子进程数还可以由另2个配置控制,分别是pm.min_spare_servers和pm.max_spare_servers。如果闲置的子进程超出了pm.max_spare_servers,则会被杀掉。小于pm.min_spare_servers则会启动进程(注意,pm.max_spare_servers应小于pm.max_children)。
  • pm = ondemand,这种模式和pm = dynamic相反,把内存放在第一位,每个闲置进程在持续闲置了pm.process_idle_timeout秒后就会被杀掉,如果服务器长时间没有请求,就只会有一个php-fpm主进程。弊端是遇到高峰期或者如果pm.process_idle_timeout的值太短的话,容易出现504 Gateway Time-out错误,因此pm = dynamic和pm = ondemand谁更适合视实际情况而定。

参考配置1:pm = dynamic

适合绝大部分使用需求,可根据网站流量和服务器配置灵活调节以下参数:

pm = dynamic
pm.max_children = 5
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 200

参考配置2:pm = ondemand

仅适合小流量,低配置服务器,访问网页瞬时cpu使用率会飙升。

pm = ondemand
pm.max_children = 5
pm.process_idle_timeout = 10s
pm.max_requests = 200

途中出现的问题

WARNING: [pool www] listen.backlog(-1) was too low for the ondemand process manager. I updated it for you to 65535.

出现问题的原因:

listen.backlog设为-1(Ubuntu的默认设置)对于ondemand进程管理器来说太小了,系统将他调成了(Linux的默认设置)65535。

整形变量listen.backlog代表了当服务器处理不过来当前的请求时,后面排队请求的最大长度。值得注意的是,当该值设得过小时,可能会导致后面排队的请求丢失,导致访问网页时报错(ECONNREFUSED)。

严格意义上说,两个设置都没有错。其中,-1代表没有限制,65535是这个变量可以设置的最大值。当然你也可以自己设定一个合适的值(256/512)。

參考文章

https://ma.ttias.be/a-better-way-to-run-php-fpm/

http://linuxbsdos.com/2015/02/17/the-ideal-value-of-listen-backlog-when-setting-php-fpm-pm-ondemand/

https://wzfou.com/php-fpm/

https://www.php.net/manual/zh/install.fpm.configuration.php

发表评论

您的电子邮箱地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据