CentOS下php-fpm进程cpu占用率100%导致无法访问的情况 – Jaydon

CentOS下php-fpm进程cpu占用率100%导致无法访问的情况

/ 0评 / 0

最近我的阿里云服务器经常出现网站无法访问的情况,同时也无法ssh登陆,只有服务器ip可以ping通。只能通过阿里云后台重启系统才能恢复。之前也出现过几次,但一直懒得处理,还天真的认为是不是太久没访问系统待机了,=。=#   现在得干点活了。(ง •̀_•́)ง

1. 在阿里云后台添加站点监控,监控lvjindong.cn访问超时的情况。

2015.3.4 18:40 收到监控告警, lvjindong.cn无法访问。赶紧尝试ssh服务器,果然无法登陆了。阿里云监控显示服务器cpu使用率100% 。

2. 重启服务器后查看系统日志(ar/log/messages)与php日志(ar/log/php-fpm/error.log)

这时候的php日志记录如下:

[04-Mar-2015 18:32:02] 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 15 total children
[04-Mar-2015 18:32:03] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or

pm.min/max_spare_servers),

spawning 16 children, there are 0 idle, and 20 total children
可以看出php-fpm开始不断的生成子进程。
这时候的系统日志记录如下:
Mar  4 18:32:07 AY1402152000018549a5Z kernel: Out of memory: Kill process 1140 (php-fpm) score 52 or sacrifice child

可以看出由于out of memory,系统开始杀php-fpm进程,但每杀掉一个进程,就会有更多个php-fpm进程产生(messages在杀进程时会记录当前进程情况),估计就是因为这样不停的杀进程、启进程,系统陷入无限循环,导致最终cpu使用率100%,系统当机。

3. 检查正常情况下的进程情况

使用top命令,再按shift+m可以按内存使用率排序;

或者可以使用 ps aux | sort -k4nr | head -10 命令来查看占用内存最多的10个进程;

发现在php-fpm刚重启的时候,系统中有1个php-fpm父进程,5个php-fpm子进程。而过不了多久就会变成7、8个子进程。每个进程大概有40~50mb。

(注:php-fpm单个进程占用内存大小主要跟加载php扩展有关,跟要处理的网站个数有关;另外刚启动时php-fpm进程内存占用很小只有几mb)

由于我的服务器只有1GB的内存,且没有开swap交换分区。那么只要系统开了近20个php-fpm子进程,那么必然出现内存不够的情况。观察之前当机时候的系统日志,php-fpm进程数远超20个了。

(但是我还是没明白为什么系统会不断生成php-fpm进程,我网站的访问量那么少,也就我自己、以及baidu、google的爬虫了)

4. 限制php-fpm进程的内存占用率

上面说过,单个php-fpm进程的内存占用主要由加载的php扩展有关、以及与处理的网站个数有关。我尝试删除了一些不用的php扩展,对减少单个进程的内存占用效果并不明显,测试了一下发现主要是因为我加载了imagick扩展,占内存比较大,而且我还要处理3、4个网站。=。=#

而且从实际情况出发,php-fpm耗尽内存主要是由于进程数过多,所以需要进行限制的还是php-fpm进程数量。百度一番,发现php-fpm的进程数跟如下几个参数有关:(在/etc/php-fpm.d/www.conf文件中)

pm.max_children = 50                   # 系统允许同时运行的php-fpm子进程最大数量
pm.start_servers = 5                       # php-fpm父进程启动时派生出来的子进程数量
pm.min_spare_servers = 5            # php-fpm空闲子进程的最小数量
pm.max_spare_servers = 35         # php-fpm空闲子进程的最大数量

上面的是我系统的默认配置,可以看出,允许的最大php-fpm进程数是50个。这简直就是逗我玩,开20个进程都要把我的内存耗尽了,还50个!所以我将配置改成如下情况:

pm.max_children = 7
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

重启php-fpm服务,观察了几天,已经没有再出现内存耗尽,cpu 100%的情况了。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注