先說下我們網站的架構,由于目前網站訪問量不是很大,但是由于最近公司網站要推廣,所以將網站由單機切換成前端用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-cgi13882 www 25 0 227m 13m 9284 S 100.1 0.1 10:53.18 php-cgi13924 www 25 0 227m 9936 5732 S 100.1 0.1 23:20.80 php-cgi13927 www 25 0 226m 5228 2064 R 100.1 0.0 24:44.24 php-cgi13827 www 25 0 228m 15m 10m R 99.7 0.1 12:57.60 php-cgi13900 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 13827poll([{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的慢日志中,設置如下:
3s
logs/slow.log
設置完成,利用命令/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調用就更慢了,因此出現了這個故障。感謝這次故障,才發現了這個嚴重的問題。
故障修復了,但是問題還遠遠沒有解決,重點要找到文件是如何被修改的,防止再出現類似的事故??磥硐旅孢€有很多事情要忙乎了。呵呵!
新聞熱點
疑難解答
圖片精選