網站故障處理記實:apache引起的麻煩 |
發布時間: 2012/8/13 11:22:31 |
春節還沒過完就接到同事的電話,說論壇訪問速度慢,遭致用戶強烈的投訴,要求我馬上處理。這個bbs是運行在RedhatAS5上,由apache、mysql、php和discuz組成,有129550位注冊會員,同時在線的最高人數11128,按照當前的硬件條件,應該滿足訪問需求(新上線的HP服務器)。在瀏覽器輸入論壇的url,果然很慢,再聯系朋友幫忙測試,打開網絡還是很慢。
惡意攻擊?mysql癱瘓? 先不管這么多,登錄到服務器上去看看再做下一步打算。還好,登錄比較順利。運行命令uptime看系統負載,很低呀,再運行命令top,跟uptime得出的結論基本吻合,于是得出結論:系統負載不大。 是否被惡意攻擊呢?基于這個想法,察看系統帳號—打開文件/etc/passwd,沒看見任何異常;運行命令iptables–L–n發現防火墻規則仍按我當初設定的策略執行,這些跡象表明,系統不存在安全問題。 那會不會是mysql的性能問題呢?用mysql客戶端連接數據庫,察看負載,其情況如下: 從輸出結果看,連接數和保持時間也在正常范圍內。以前曾經有過mysql數據庫連接數過多(達到設定的最大連接數)及會話保持時間(Time)過長的事故,從而導致網站訪問速度變慢,以至于無法忍受。由此分析,這個故障不是由mysql數據庫所引起的。 現在還剩下apache了,看來該懷疑一下它了。我們先看看有多少個httpd進程,其過程如下:
這個結果表明請求數比較大但卻沒有得到適時的響應,再看一下這些請求都是發往那些服務端口,只需運行netstat–anp|grep–vunix,發現絕大部分請求是針對80端口的。由這個現象基本可以斷定是apache引起的麻煩。那好,我就從這里著手。關apache服務再啟用,這時察看httpd進程,馬上就是256.既然這樣,我就在配置文件httpd.conf加入下面的代碼塊: 執行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.confMaxClients的值為1500,運行apachectl–t檢查語法是否正確,無誤后啟用apache服務apachectlstart.現在,我們再回過頭來察看apache的進程數,基本上在170-400這個范圍,并且在不停的變化,隔設定的1500這個值還差得遠;另外那些等待的請求值也降低了,這意味apache能正常響應用戶的請求。在瀏覽器輸入論壇的url,速度正常,再請其他朋友幫著測試,一切正常。 本文出自:億恩科技【www.vbseamall.com】 |