使用Apache作為HTTP伺服器的站點,不可避免的會遇到這個問題:apache負載很低,但是訪問web伺服器非常慢。排除腳本程式的原因後,基本上就是apache設定問題。
以下內容或許能夠幫助解決這個問題。
1. 首先要了解Apache所採用的MPM(Multi -Processing Modules,多道處理模組)
MPM是Apache的核心,它的作用是管理網路連線、調度請求。
Apache2.0 中MPM分為3種(perfork、worker、event)。 perfork從Apache1.3繼承下來的,它採用的是進程管理方式,所以它可以提供更可靠的效能和更好的相容性;worker是Apache2.0中新增加的方式,它採用了執行緒控制方法,可以比perfork更節約系統開銷、處理更多的資料量,但同時相容性並不是很好,很多舊的程式無法工作在worker下;event仍處於試驗階段,它為每個任務分配不同的進程池,目前不應該採用。
透過指令 httpd -l 可以取得目前Apache採用的是哪一種MPM
本文僅針對perfork方式進行討論
2. 了解perfork的工作方式
查看Apache2.0的設定檔httpd.conf,可以看到perfork的設定段,大致如下:
ServerLimit 256
StartServers 5
MinSpareServers 10
MaxSpareServers 15
MaxClients 256
MaxRequestsPerChild 4000
當Apache啟動時,Apache會自動建立StartServers個進程,並且盡力將空閒進程數保持在MinSpareServers和MaxSpareServers之間。
如果空閒進程小於MinSpareServers,Apache將會以大約每秒1個的速度新建進程。
如果空閒進程小於MaxSpareServers,Apache將會刪除多餘的空閒進程,並釋放伺服器資源。
進程數的最大值由MaxClients控制,在Apache1.3中最大隻能設定為256,但在Apache2.0中,可以透過在設定開頭增加ServerLimit專案來突破256的限制,此時必須MaxClients ≤ ServerLimit ≤ 20000
MaxRequestsPerChild用來控制每個行程在處理了多少次請求之後自動銷毀,這個參數可以設定為0表示無限(即不銷毀進程)。
3. 優化perfork
首先,對於一個負載相對較高的網站來說,256的進程限制是不夠的,如果伺服器已經達到256的極限,那麼接下去的訪問就需要排隊,這也就是為什麼某些伺服器負載不高,但是訪問卻很慢的原因之一。所以首先應該要了解伺服器在繁忙時的進程數量。
透過命令ps -ef|grep httpd|wc -l可以了解目前系統中Apache進程數,透過設定ServerLimit和MaxClients來達到伺服器軟擴容的目的。
然後,在訪問量高峰期,經常出現的情況是突然之間發生非常多的並發連接,然後突然之間減少了很多訪問。如果Apache沒有準備足夠數量的預備進程,那麼訪問只能等待Apache每秒1個的新增進程,隨後又要將多餘的進程刪除,那Apache只能一直忙於新建和銷毀進程,大大地降低了訪問速度。可以 適當地增加StartServers、MinSpareServers、MaxSpareServers來讓Apache不需要一直忙於做無用功。
最後,強烈建議MaxRequestsPerChild不要設定為0,設定為非0,可以保護Apache進程免於記憶體洩漏的影響,因為你不知道在Apache上運行的應用程式何時會出錯導致記憶體外洩。
設定完之後大致是這樣的:
ServerLimit 1000
StartServers 30
MinSpareServers 30
MaxSpareServers 45
MaxClients 1000
MaxRequestsPerChild 4000
詳細步驟http://www.liaoxiansheng.cn/?p=496