天天看點

一次網站故障處理過程

一次網站故障處理過程

作者:田逸([email][email protected][/email]) from [url]http://netsecurity.51cto.com/art/200802/65683.htm[/url]

春節還沒過完就接到同僚的電話,說論壇通路速度慢,遭緻使用者強烈的投訴,要求我馬上處理。這個bbs是運作在Redhat AS 5上,由apache、mysql、php和discuz組成,有129550位注冊會員,同時線上的最高人數11128,按照目前的硬體條件,應該滿足通路需求(新上線的HP伺服器)。在浏覽器輸入論壇的url, 果然很慢,再聯系朋友幫忙測試,打開網絡還是很慢。

先不管這麼多,登入到伺服器上去看看再做下一步打算。還好,登入比較順利。運作指令

uptime

看系統負載,很低呀,再運作指令

top

,跟

得出的結論基本吻合,于是得出結論:系統負載不大。

是否被惡意攻擊呢?基于這個想法,察看系統帳号—打開檔案 /etc/passwd,沒看見任何異常;運作指令

iptables –L –n

發現防火牆規則仍按我當初設定的政策執行,這些迹象表明,系統不存在安全問題。

那會不會是mysql的性能問題呢?用mysql用戶端連接配接資料庫,察看負載,其情況如下:

mysql>

show processlist

;

+---------+-----------+-----------+--------+---------+------+-------+------------------+

| Id      | User     | Host   | db    | Command | Time | State | Info           |

| 1917230 | bbsdiscuz | localhost | discuz | Sleep   |  284 |       | NULL             |

| 1917412 | bbsdiscuz | localhost | discuz | Sleep   |  223 |       | NULL             |

| 1917442 | bbsdiscuz | localhost | discuz | Sleep   |  222 |       | NULL             |

| 1917554 | bbsdiscuz | localhost | discuz | Sleep   |  205 |       | NULL             |

| …………………..省略若幹………………………..

| 1918404 | bbsdiscuz | localhost | discuz | Sleep   |    0 |       | NULL             |

19 rows in set (0.00 sec)

從輸出結果看,連接配接數和保持時間也在正常範圍内。以前曾經有過mysql資料庫連接配接數過多(達到設定的最大連接配接數)及會話保持時間(Time)過長的事故,進而導緻網站通路速度變慢,以至于無法忍受。由此分析,這個故障不是由mysql資料庫所引起的。

現在還剩下apache了,看來該懷疑一下它了。我們先看看有多少個httpd程序,其過程如下:

[root@web1 ~]#

ps aux | grep httpd | grep -v grep | wc -l

256

結果剛好是apache預設設定的最大連接配接數,再執行 [root@web1 ~]#

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 

其運作結果如下所示:

LAST_ACK 3

SYN_RECV 628

…………省略若幹…………

TIME_WAIT 524

這個結果表明請求數比較大但卻沒有得到适時的響應,再看一下這些請求都是發往那些服務端口,隻需運作netstat –anp | grep –v unix ,發現絕大部分請求是針對80端口的。由這個現象基本可以斷定是apache引起的麻煩。那好,我就從這裡着手。關apache服務再啟用,這時察看httpd程序,馬上就是256.既然這樣,我就在配置檔案httpd.conf加入下面的代碼塊:

<IfModule prefork.c> 

StartServers 10

MinSpareServers 10

MaxSpareServers 15 

MaxClients 1500

ServerLimit 2000

MaxRequestsPerChild 10000 

</IfModule> 

執行apachectl –t ,報錯,警告說MaxClients超過256,以至于apache服務不能正常運作,該小一點呢?好,改成150,運作後,查httpd程序數,剛好150。用浏覽器通路論壇,還是十分的緩慢。看來得朝大的方向改,否則瞬間apache達到最大連接配接數,就不再響應新的請求。從前面的操作(把MaxClients的值改大超過256)可以知道,必須重新編譯和安裝apache才可以達到目的。當時曾經嘗試把apache置于worker模式,但在編譯時涉及到php,不想再節外生枝,就不再繼續。我用的apache版本是httpd-2.2.6,進安裝包所在的目錄(如我的目錄是/root/httpd-2.2.6,即解壓httpd-2.2.6.tgz後生成的目錄),修改檔案 server/mpm/prefork/prefork.c,把第77行的值改成1500,如下圖所示:

一次網站故障處理過程

然後再編譯,運作和安裝。再使配置檔案 httpd.conf

MaxClients

的值為

1500

,運作apachectl –t檢查文法是否正确,無誤後啟用apache服務

apachectl start

.現在,我們再回過頭來察看apache的程序數,基本上在170-400這個範圍,并且在不停的變化,隔設定的1500這個值還差得遠;另外那些等待的請求值也降低了,這意味apache能正常響應使用者的請求。在浏覽器輸入論壇的url,速度正常,再請其他朋友幫着測試,一切正常。

                                                2008-2-18

                                                海澱福緣門悟真閣

繼續閱讀