先我們來看一下負載圖
找了半天的原因。做了一些最佳化:
最佳化完成的時候訪問量已經沒那麼高了。所以也不知道效果到底如何。看看以後效果吧。
[root@localhost ~]# netstat -an | grep ESTABLISHED | wc -l
210 已串連數
[root@localhost ~]# ps aux|grep httpd|wc -l
55 進程數
[root@localhost ~]# ps -ef|grep httpd|wc -l
55 apache 能處理的數
[root@localhost ~]# netstat -nat|grep -i “80″|wc -l
698 網路請求數
即時檢測HTTPD串連數:
watch -n 1 -d “pgrep httpd|wc -l”
先修改./apache/conf/httpd.conf檔案。
# vi httpd.conf
將“#Include conf/extra/httpd-mpm.conf”前面的 # 去掉。
儲存。
二:再修改./apache/conf/extra/httpd-mpm.conf檔案。
# vi httpd-mpm.conf
找到<IfModule mpm_prefork_module> 這一行
原:
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
修改後
<IfModule mpm_prefork_module>
StartServers 10
MinSpareServers 10
MaxSpareServers 15
ServerLimit 2000
MaxClients 1500
MaxRequestsPerChild 10000
</IfModule>
當Apache被啟動時,Apache會自動建立StartServers個進程,並且儘力將空閑進程數保持在MinSpareServers和MaxSpareServers之間。
如果空閑進程小於MinSpareServers,Apache將會以大約每秒1個的速度建立進程。
如果空閑進程小於MaxSpareServers,Apache將會刪除多餘的空閑進程,釋放伺服器資源。
進程數的最大值由MaxClients控制,在Apache1.3中最大隻能設定為256,但在Apache2.0中,可以通過在配置開頭增加ServerLimit項目來突破256的限制,此時必須MaxClients ≤ ServerLimit ≤ 20000
MaxRequestsPerChild用來控制每個進程在處理了多少次請求之後自動銷毀,這個參數可以設定為0表示無限(即不銷毀進程)。
apache高負載效能調優
先閱讀apache配置最佳化建議如下,再對相關參數進行調整,觀察伺服器狀況.
Apache配置最佳化建議:
進入/usr/local/apache2/conf/extra 目錄下
Apache最佳化,
經過上述操作後,Apache已經能夠正常運行。但是,對於訪問量稍大的網站,Apache的這些預設配置是無法滿足需求的,我們仍需調整Apache的一些參數,使Apache能夠在大訪問量環境下發揮出更好的效能。以下我們對Apache設定檔httpd.conf中對效能影響較大的參數進行一些說明。
(1) Timeout 該參數指定Apache在接收請求或發送所請求內容之前的最長等待時間(秒),若超過該時間Apache則放棄處理該請求,並釋放串連。該參數預設值為120,推薦設定為60,對於訪問量較大的網站可以設定為30或15。
(2) KeepAlive 該參數控制Apache是否允許在一個串連中有多個請求,預設開啟。但對於大多數論壇類型網站來說,通常設定為off以關閉該支援。
(3) MPM - prefork.c 在預設情況下Apache使用Prefork(進程)工作模式,可以說這部分的參數設定是對Apache效能影響的核心和關鍵。使用者可以在配置文檔中找到以下配置段:
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 15
MaxRequestsPerChild 0
這就是控制Apache進程工作的配置段,為了更好的理解上述配置中的各項參數,下面讓我們先瞭解一下Apache是如何控制進程工作的。我們知道,在Unix系統中,很多服務(Service)的守護進程(Daemon)在啟動時會建立一個進程以準備應答可能的串連請求,服務即進入了連接埠監聽狀態,當一個來自用戶端(Client)的請求被發送至服務所監聽的連接埠時,該服務進程即會處理該請求,在處理過程中,該進程處於獨佔狀態,也就是說如果此時有其他請求到達,這些請求只能“排隊”等待當前請求處理完成且服務進程釋放。這樣就會導致越來越多的請求處於隊列等待狀態,實際表現就是該服務處理能力非常低下。Apache使用Prefork模式很好的解決了這一問題。下面我們來看看Apache實際上是如何高效率工作的。
當Apache啟動時,Apache會啟動StartSpareServers個空閑進程同時準備接收處理請求,當多個請求到來時,StarSpareServers進行會越來越少,當空閑進程減少到MinSpareServers個時,Apache為了能夠繼續有充裕的進程處理請求,它會再啟動StartsServers個進程備用,這樣就大大減少了請求隊列等待的可能,使得服務效率提高,這也是為什麼叫做Pre-fork的原因;讓我們繼續跟蹤Apache的工作,我們假設Apache已經啟動了200個進程來處理請求,理論上來說,此時Apache一共有205個進程,而過了一段時間,假設有100個請求都得到了Apache的響應和處理,那麼此時這100個進程就被釋放成為空白閑進程,那麼此時Apache有105個空閑進程。而對於服務而言,啟動太多的空閑進程時沒有任何意義的,反而會降低伺服器的整體效能,那麼Apache真的會有105個空閑進程嗎?當然不會!實際上Apache隨時在檢查自己,當發現有超過MaxSpareServers個空閑進程時,則會自動停止關閉一些進程,以保證空閑進程不過過多。說到這裡,使用者應該對Apache的工作方式有了一定的瞭解,如果想獲得更多更詳細的說明請參閱Apache手冊文檔。
我們還有兩個參數沒有介紹:MaxClients和MaxRequestPerchild;MaxClients指定Apache在同一時間內最多允許有多少用戶端能夠與其串連,如果超過MaxClients個串連,用戶端將會得到一個“伺服器繁忙”的錯誤頁面。我們看到預設情況下MaxClients設定為15,這對一些中型網站和大型網站顯然是遠遠不夠的!也許您需要同時允許512個用戶端串連才能滿足應用需求,好吧,那麼就讓我們把MaxClients修改為512,儲存httpd.conf並退出,重啟Apache,很遺憾,在重啟過程當中您看到了一些錯誤提示,Apache重啟失敗。錯誤提示中告訴您MaxClients最大隻能設定為256,相信您一定很失望。不過不要沮喪,Apache作為世界一流的Web Server一定不會如此單薄的!在預設情況下,MaxClients的確只能設定為不超過256的整數,但是,如果您有需要完全可以隨意定製,此時就需要使用ServerLimit參數來配合使用,簡單的說ServerLimit就像是水桶,而MaxClients就像是水,您可以通過更換更大的水桶(將ServerLimit設定為一個較大值)來容納更多的水(MaxClients),但要注意,MaxClients的設定數值是不能大於ServerLimit的設定數值的!
注:MaxClents < ServerLimit
下面讓我們瞭解一下MaxRequestPerChild參數,該參數指定一個串連進程中可以有多少個線程同時工作。也許這樣解釋過於專業,那麼您只要想想“網路螞蟻”、“網際快車FlashGet”中的“多點同時下載”即可,該參數實際上就是限制最多可以用幾個“點”。預設設定為0,即為:不限制。但需要注意,如果將該值設定的過小會引起訪問問題,如果沒有特殊需要或者訪問量壓力並非很大可以保持預設值,如果訪問量很大則推薦設定為2048。
好了,解釋了這麼多,讓我們看看經過修改後Perfork.c配置段的推薦配置:
StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 1024
MaxClients 768
MaxRequestsPerChild 0
完成了上述對Apache的調整,Apache已經獲得了較大的效能改善。