现象: 某日和开发的同事调试服务器php状态时候发现下面这种情况: ps aux |grep php-fcgi |wc -l 602 表面上看是没什么问题,可是我明明记得 php-fcgi我只开了300个啊!难道有人改过了? 立刻查看 php-fpm.conf 找到这一项 <value name="max_children">300</value> 确实是300个啊~~,怎么会有600个? ps aux |grep php-fcgi |more www 11707 0.0 0.7 250192 3888 ? S 17:07 www 11708 0.0 0.7 250192 3888 ? S 17:07 www 11709 0.0 0.7 250192 3888 ? S 17:07 www 11710 0.0 0.7 250192 3888 ? S 17:07 www 11711 0.0 0.7 250192 3888 ? S 17:07 状态都正常啊,奇怪了。尝试把 php-fcgi重启一下 /usr/local/php-fcgi/sbin/php-fpm restart Shutting down php_fpm . done Starting php_fpm done 再次查看 ps aux |grep php-fcgi |wc -l 602 还是多了300个.....奇怪了,这三百个是怎么来的呢? 因为我们的php和nginx是一起的,所以我又想到了nginx。 在访问量不高的时候偷偷重启了一下nginx /etc/init.d/nginx restart 停止 nginx: [确定] Shutting down php_fpm done 启动 nginx: [确定] Starting php_fpm done 再次查看,我倒.....真服了。我和开发的同事都一头雾水 ps aux |grep php-fcgi |wc -l 602 这回不能简单的考虑重启服务了,需要想想到底是哪里出的问题,而且这是生产服务器不能随便弄。 因为现在线上的服务都还算正常,这个问题我们就先放下了。 第二天,那个同事跟我说。那个问题他知道怎么解决了,而且也知道是什么原因造成的。我赶紧问清楚: 原来是这样,最近因为测试比较频繁,对nginx服务重启次数较多。不知道哪次重启时候失败导致 nginx进程虽然停止了, 但是一起的300个php-fcgi却没有重启,导致这些进程还留在内存里不能被释放。需要强制手动杀掉所有的php-fcgi进程后再重启php-fpm就可以了。 听到这里我恍然大悟。马上去服务器上操作,果然问题解决了,具体步骤如下 pkill php-cgi 再次查看 ps aux |grep php-fcgi |wc -l 1 好了没有了,赶紧重启,因为现在访问网页已经是 502了。 /usr/local/php-fcgi/sbin/php-fpm restart Shutting down php_fpm warning, no pid file found - php-fpm is not running ? Starting php_fpm done 再次查看进程数 ps aux |grep php-cgi |wc -l 302 好了,正常了,呵呵 后来我在试验机上面又测试了一下,果然重现了那个问题 [root@ime /]# /etc/init.d/nginx restart 停止 nginx: [确定] Shutting down php_fpm done 启动 nginx: [确定] Starting php_fpm done [root@ime /]# ps aux |grep php-cgi|wc -l 302 这时进程数是正常的,下面杀掉nginx进程 [root@ime /]# pkill nginx [root@ime /]# lsof -i:80 [root@ime /]# ps aux |grep php-cgi|wc -l 302 这300个进程就傻乎乎的留在这里了,再次启动nginx [root@ime /]# /etc/init.d/nginx start 启动 nginx: [确定] Starting php_fpm done [root@ime /]# lsof -i:80 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME nginx 14072 root 8u IPv4 64090 TCP *:http (LISTEN) nginx 14073 www 8u IPv4 64090 TCP *:http (LISTEN) [root@ime /]# ps aux |grep php-cgi|wc -l 603 php-fcgi没有去理会在内存中存在的进程,继续开启了300个... 我如果再重复这个过程呢? [root@ime /]# pkill nginx [root@ime /]# lsof -i:80 [root@ime /]# /etc/init.d/nginx start 启动 nginx: [确定] Starting php_fpm done [root@ime /]# pkill nginx [root@ime /]# lsof -i:80 [root@ime /]# ps aux |grep php-cgi|wc -l 904 900个... 继续重复 [root@ime /]# /etc/init.d/nginx start 启动 nginx: [确定] Starting php_fpm done [root@ime /]# ps aux |grep php-cgi|wc -l 954 [root@ime /]# ps aux |grep php-cgi|wc -l 1205 机器开始变慢了,估计再重复几次机器就会挂掉了... [root@ime /]# pkill php-cgi [root@ime /]# ps aux |grep php-cgi|wc -l 5 [root@ime /]# ps aux |grep php-cgi|wc -l 5 [root@ime /]# ps aux |grep php-cgi|wc -l 1 [root@ime /]# /etc/init.d/nginx restart 停止 nginx: [确定] Shutting down php_fpm warning, no pid file found - php-fpm is not running ? 启动 nginx: [确定] Starting php_fpm done [root@ime /]# ps aux |grep php-cgi|wc -l 302 好了,恢复正常.... 看来需要修改一下 php-fpm的启动脚本了 本文出自 “story的天空” 博客,请务必保留此出处http://storysky.blog.51cto.com/628458/282939 |
|