1. 程式人生 > >Apache如何提高併發連線請求數量

Apache如何提高併發連線請求數量

使用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

Apache MPM 公共指令

http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/mpm_common.html