php-cgi占用cpu100%的一次排障之旅
先說下我們**的架構
,由於目前**訪問量不是很大,但是由於最近公司**要推廣,所以將**由單機切換成前端用
nginx
做負載均衡,帶動兩台
web伺服器,所有網頁和靜態檔案都通過
nfs共享呼叫,
nfs服務裝在其中的乙個
web伺服器上,後端用
mysql
主從的方式,是很典型的架構。
切換成這個架構才
2天,就收到
nagios
的報警,報警資訊顯示有一台
web伺服器負載很高,於是通過
securecrt
登入到伺服器上,用
top命令看了一下,發現有幾個
php-cgi
程序占用了大量的
cpu,如下:
13889 www250228m14m 9344 s 100.40.114:51.22 php-cgi
13882 www250227m13m 9284 s 100.10.110:53.18 php-cgi
13924 www250227m 9936 5732 s 100.10.123:20.80 php-cgi
13927 www250226m 5228 2064 r 100.10.024:44.24 php-cgi
13827
www250228m15m10m r 99.70.112:57.60 php-cgi
13900 www25
0228m19m13m r 99.70.19: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(, 1,
0)= 0 (timeout)
select(5, [4], [4], , )= 1 (out [4], left )
poll(, 1,
0)= 0 (timeout)
select(5, [4], [4], , )= 1 (out [4], left )
poll(, 1,
0)= 0 (timeout)
select(5, [4], [4], , )= 1 (out [4], left )
poll(, 1,
0)= 0 (timeout)
select(5, [4], [4], , )
=1 (out [4], left )
poll(, 1,
0)= 0 (timeout)
select(5, [4], [4], , )= 1 (out [4], left )
poll(, 1,
0)= 0 (timeout)
select(5, [4], [4], , )= 1 (out [4], left )
poll(, 1,
0)= 0 (timeout) …….
可以看出,這個程序不斷的超時,到底為何會超時呢???看來需要從
php-cgi
的日誌中查詢問題了,由於原來
php-fpm.conf
配置的超時時間為
0,也就是不設定超時時間。於是先將
php-fpm.conf
的超時時間設定成
5s,然後超過5s的
php-cgi
的請求就會記錄到
php的慢日誌中,設定如下:
3slogs/
slow.log
設定完成,利用命令
/usr/local/php/sbin/php-fpm restart
重啟php-fpm
,過一會檢視
slow.log
的內容發現很多如下內容:
檢視/data/htdocs/bbs.hrloo.com/apl.php
第十行的內容如下:
echo file_get_contents('
');網上查了一下發現了介紹
php這個函式當裡面**響應很慢的時候就會出現
cpu占用很高的情況,而且會一直卡住,不會超時,再看看這個鏈結,訪問一下指向到了乙個****,是別人攻擊後嵌入的,將這個檔案還原後恢復正常。奇怪的是那個安裝
nfs的
web伺服器卻不會出現那個問題,看來是由於本來那個站點又慢,通過
nfs呼叫就更慢了,因此出現了這個故障。感謝這次故障,才發現了這個嚴重的問題。
故障修復了,但是問題還遠遠沒有解決,重點要找到檔案是如何被修改的,防止再出現類似的事故。看來下面還有很多事情要忙乎了。呵呵!
列印程序Spooler占用 cpu 100
當列印佇列檔案損壞時,print spooler 服務的程序 spoolsv.exe 可能會導致很高的 cpu 占有率,同時無法繼續執行列印過程。重新啟動 print spooler 服務也不能解決上述問題。當使用者嘗試列印檔案時,如果位於 systemroot system32 spool pri...
mysql占用cpu 100 解決辦法
今天對uchome的讀資料,轉移到另外臺資料庫伺服器 發現這台mysql伺服器,就mysql乙個程序 cpu顯示已經超過100 並且高居不下!訪問量比較高 首先排除了程式的問題!那估計是mysql配置的問題,開啟發現 query cache size 0 估計就是這個問題在造成的,沒有開查詢快取 一...
Linux下java程序占用CPU 100 排查
網上已經有老哥分享了。原文 主要是做個記錄備查 幾個命令 1.top檢視程序pid pid 37654 2.top p 37654 shift h 檢視子執行緒的pid 559 3.printf x n 559 轉成16進製制 0x22f,使用jstack的時候使用 4.jstack 37654 g...