最近我的阿里云服务器经常出现网站无法访问的情况,同时也无法ssh登陆,只有服务器ip可以ping通。只能通过阿里云后台重启系统才能恢复。之前也出现过几次,但一直懒得处理,还天真的认为是不是太久没访问系统待机了,=。=# 现在得干点活了。(ง •̀_•́)ง
1. 在阿里云后台添加站点监控,监控hawu.me访问超时的情况。
2015.3.4 18:40 收到监控告警, hawu.me无法访问。赶紧尝试ssh服务器,果然无法登陆了。阿里云监控显示服务器cpu使用率100% 。
2. 重启服务器后查看系统日志(/var/log/messages)与php日志(/var/log/php-fpm/error.log)
这时候的php日志记录如下:
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%的情况了。
找了好久了。。。。。今天研究一天了。请问大佬的联系方式啊。723170339 帮下忙
你可以先尝试一下限制php-fpm进程数看看会不会还出现这样问题。