现象:
一番排查后,发现 `/usr/local/php/var/log/php-fpm ` 的日志文件,出现如下信息:
[20-Dec-2019 14:05:26] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it
[20-Dec-2019 14:05:40] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it
[20-Dec-2019 14:05:55] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it
解决办法,调整 `pm` 相关配置即可解决,例如
pm = dynamic
pm.max_children = 20
pm.start_servers = 7
pm.min_spare_servers = 5
pm.max_spare_servers = 10
再次来温习下PHP-FPM 的运行方式
pm = static
子进程的数量是固定的,由 pm.max_children 值决定具体的数量。
pm = ondemand
子进程在有需求时才产生。
工作模式为:每个闲置进程,在持续闲置了 pm.process_idle_timeout 秒后就会被杀掉,
服务器低峰期内存自然会降下来,如果服务器长时间没有请求,就只会有一个php-fpm主进程。
pm = dynamic
动态创建子进程的数量。
启动时,会产生固定数量的子进程(由pm.start_servers控制,即最小子进程数);
而最大子进程数则由 pm.max_children 来控制;
子进程数会根据“请求量”在最小和最大数范围之间变化;
闲置的子进程数由 pm.min_spare_servers(最小闲置进程数) 和 pm.max_spare_servers(最大闲置进程数) 控制
而如果闲置的子进程超出了 pm.max_spare_servers,则会被杀掉,闲置进程数保留在 pm.min_spare_servers 值
pm.start_servers=6
仅 pm 设置为 dynamic 时使用,启动时,产生的固定子进程数量
改值值必须大于 min_spare_servers 且 小于 max_spare_servers
一般计算方法为: (max_spare_servers + min_spare_servers) / 2
pm.max_children = 50
pm 设置为 static 时表示创建的子进程的数量,pm 设置为 dynamic 时表示最大可创建的子进程的数量
一般计算方法为:
分配给PHP的可用内存/单个子进程平均使用的内存数量
例如:一个子进程需要30M的内存,假设分配给PHP的内存为 3G,则设置为 3 * 1024 / 30 ≈ 100
pm.max_requests = 500
单个 php-fpm 子进程处理完多少个请求后自动重启,
主要目的就是为了防止请求处理过程中的内存溢出,导致进程占用过多的内存而无法释放,从而使fpm的处理能力降低,
避免产生一些莫名其妙的错误
每一个子进程每天接受的 request 次数 = PV / max_children
比如一个子进程每天接受的 request 次数为 50, ,而 max_requests 的设置为 500,
那么fpm要10天才能重启这个子进程,如果存在内存泄露的话,就会导致进程占用过多的内存而无法释放或产生一些莫名其妙的错误。
但是如果你把这个值设置的过小,fpm频繁的重启,会导致额外的系统开销。
最好的优化是根据网站的具体运行情况,不断的进行调试,找到一个理想的平衡点。
pm.status_path = /status
fpm的状态页,php 自带的,可以通过该状态页了解监控 php-fpm 的状态,去掉注释即可开启
修改 nginx 中的 配置,添加如下
server {
server_name xxx.demo.cn;
... ...
location = /status {
include fastcgi_params;
fastcgi_pass unix:/var/run/php.sock;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
}
... ...
}
重启 PHP,重启 nginx ,在浏览器中输入 xxx.demo.cn/status 即可看到,
/status 可以随意自定义,比如改成 /demostatus 也可以,记得 NGINX 里面记得同时修改即可