php cgi占用cpu100 的一次排障之旅

2022-08-02 22:33:20 字數 3154 閱讀 4420

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...