現象:
某日和開發的同事調試服務器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 |