由于时间耽误了,今天才把文章整理出来。前几天的时候,一位朋友他在Linux服务器用“top"命令的时候,发现“平均负载 Load Average”非常的高,高达40、50、60左右了。如下图:
从上图,你还会发现%Cpu这里,us也占了93.8%。这里占用高,说明服务器上的程序应用访问用户比较多。
除以上截图之外,top"命令后,还出现了“php-fpm占用cpu过高“,所有的几个php-fpm加起来会接近100%,由于没来得及截图存起来,大家知道一下就行了。
后来,我去查看了php-fpm日志文件:php-fpm.log ,发现有提示内容如下,由于当天的内容日志很多,很多都是重复的,我整理结果如下:
[21-Jan-2021 01:47:58] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 0 idle, and 19 total children
[21-Jan-2021 01:47:59] WARNING: [pool www] server reached pm.max_children setting (20), consider raising it
[21-Jan-2021 05:02:58] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 0 idle, and 18 total children
[21-Jan-2021 05:03:02] WARNING: [pool www] server reached pm.max_children setting (20), consider raising it
[21-Jan-2021 05:14:20] WARNING: [pool www] server reached pm.max_children setting (20), consider raising it
[21-Jan-2021 05:33:02] WARNING: [pool www] server reached pm.max_children setting (20), consider raising it
中文翻译
[21-Jan-2021 01:47:58] 警告:[pool www]似乎很忙(您可能需要增加 pm.start_servers或pm.min / max_spare_servers),产生32个孩子,有0个空闲,总共19个 孩子们
[21-Jan-2021 01:47:59]警告:[pool www]服务器已达到pm.max_children设置(20),请考虑将其提高
原因:
从上面,我们可以先分析验证问题:
1、报警级别“WARNING”,也就是说业务受到的影响比较小,实际验证也是这样;
2、php-fpm的进程数比较少,建议增加 pm.start_servers 或 pm.min/max_spare_servers 或 pm.max_children
3、增加到多少呢?spawning 8,也就是说至少得8个进程;
解决方法
第一步:执行命令:
ps -ef | grep php
可以得到当前的php-fpm进程数以及php-fpm.conf配置文件位置。
我的这位朋友这里肯定是只有20个进程数了。
第二步:修改 php-fpm.conf 文件
由于我用的是 pm = dynamic,再加上php-fpm.log有一个提示:spawning 32,其它的都是spawning 8,因此我个人设置如下:
pm.start_servers = 20;
pm.min_spare_servers = 20;
pm.max_spare_servers = 42;
pm = dynamic 如何控制子进程,选项有static和dynamic
pm.max_children:静态方式下开启的php-fpm进程数量
pm.max_requests:php-fpm子进程能处理的最大请求数
pm.start_servers:动态方式下的起始php-fpm进程数量
pm.min_spare_servers:动态方式下的最小php-fpm进程数
pm.max_spare_servers:动态方式下的最大php-fpm进程数量
区别:
如果pm设置为 static,那么,其实只有pm.max_children这个参数生效。系统会开启设置数量的php-fpm进程。
如果pm设置为 dynamic,那么pm.max_children参数失效,后面3个参数生效。
第三步:重启php-fpm验证结果与持续观察
1、杀掉php-fpm所有的进程
pkill -9 php-fpm
2、重启php-fpm
cd /usr/local/php
./sbin/php-fpm
3、经过我后续观察php-fpm日志,未发现类似日志出现。
再观察平均负载,后面也慢慢恢复正常了,最高也就不超过3。