Apache提供併發連線請求數量

qiqiaiairen發表於2016-08-17



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

httpd -l


httpd -V



2.瞭解perfork的工作方式

檢視配置檔案httpd-mpm.conf,可以看到perfork的配置端,大致如下:

<IfModule mpm_prefork_module>
    StartServers             5
    MinSpareServers          5
    MaxSpareServers         10
    MaxRequestWorkers      250
    MaxConnectionsPerChild   0
</IfModule>

當Apache被啟動時,Apache會自動建立StartServers個程式,並且盡力將空閒程式數保持在MinSpareServers和MaxSpareServers之間。

如果空閒程式小於MinSpareServers,Apache將會以大約每秒1個的速度新建程式。

如果空閒程式小於MaxSpareServers,Apache將會刪除額空閒程式,釋放伺服器資源。

程式數的最大值由MaxClient控制,在Apache1.3中最大隻能設定為256,但在Apache2.0中,可以通過在配置開頭增加ServerLimit專案來突破256的限制,此時必須MaxClients<=ServerLimit<=20000

MaxRequestsPerChild用來控制每個程式在處理了多少次請求之後自動銷燬,這個引數可以設定為0表示無限(即不銷燬程式)

3. 優化perfork

對於一個負載相對較高的網站來說,256的程式限制是不夠的,如果伺服器已經達到256的極限,那麼接下來的訪問就需要排隊,這也就是為什麼某些伺服器負載不高,但是訪問卻很慢的原因之一。所以首先應該瞭解伺服器在繁忙時的程式數量。

 

通過設定ServerLimit和MaxClients來達到為伺服器軟擴容的目的。

然後,在訪問量高峰期,經常會出現的情況是突然之間發生非常多的併發連線,然後突然之間減少了很多訪問。如果Apache沒有準備足夠數量的預備程式,那訪問只能等待Apache每秒1個的新增程式,隨後又要將多餘的程式刪除,那Apache只能一直忙於新建和銷燬程式,大大地降低了訪問速度。可以適當增加StartServers、MinSpareServers、MaxSpareServers來使得Apache不需要一直忙於做無用功。

最後強烈推薦MaxRequestsPerChild不要設定為0,設定為非0,可以保護Apache程式免遭記憶體洩漏的影響,因為你不知道執行在Apache上的應用程式在什麼時候回出錯導致記憶體洩漏。

設定完之後大致是這樣的:

<IfModule mpm_prefork_module>
    StartServers             1000
    MinSpareServers          30
    MaxSpareServers         30
    MaxRequestWorkers      1000
    MaxConnectionsPerChild   4000
</IfModule>


1. httpd-mpm.conf配置

Apache的執行緒數控制檔案為httpd-mpm.conf,在conf/extra資料夾下面,要是該配置檔案其作用需要在httpd.conf中將#Include conf/extra/httpd-mpm.conf前#去掉,以便httpd-mpm.conf生效。

在windows系統中,其作用的是Winnt mpm段

<IfModule mpm_winnt_module>
    ThreadsPerChild        150
    MaxConnectionsPerChild   0
</IfModule>



windows下如果優化Apache的效能主要是通過專門針對WindowsNT優化的MPM(多路處理模組)-mpm_winnt.c來優化的,它使用一個單獨的父程式產生一個單獨的子程式,在這個子程式中輪流產生多個執行緒來處理請求。也就是說mpm_winnt只能啟動父子兩個程式,不能像Linux下那樣同時啟動多個程式。

 

mpm_winnt主要通過ThreadsPerChild和MaxRequestsPerChild兩個引數來優化Apache.

ThreadsPerChild

這個引數用於設定每個程式的執行緒數,子程式在啟動時建立這些執行緒後就不再建立新的執行緒了。一方面因為mpm_winnt不能啟動多個程式,所以這個數值要足夠大,以便可以處理可能的請求高峰;另一方面該引數以伺服器的響應速度為準的,數目太大的反而會變慢。因此需要綜合均衡一個合理的數值。mpm_winnt上的預設值是64,最大值是1920.這裡建議設定為100-500之間,伺服器效能高的話值大一些,反之值小一些。

 

MaxRequestsPerChild

該參數列示每個子程式能夠處理的最大請求數,即同時間內子程式數目。設定為零表示不限制,mpm_winnt上的預設值就是0.

官方參考手冊中不建議設定為0,主要基於兩點考慮:

(1)      可以防止(偶然的)記憶體洩漏無限進行,從而耗盡記憶體;

(2)      給程式一個有限壽命,從而有助於當伺服器負載減輕的時候減少活動程式的數量。

因此這個引數的值更大程度上取決於伺服器的記憶體,如果記憶體比較大的話可以設定為0或很大的數字,否則設定一個小的數值。需要說明的是,如果這個值設定的太小的話會造成Apache頻繁重啟,在日誌檔案中會看到如下的文字:Process exiting because it reached MaxRequestsPerChild. Signalingthe parent, 這樣一來降低了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

httpd -l


httpd -V



2.瞭解perfork的工作方式

檢視配置檔案httpd-mpm.conf,可以看到perfork的配置端,大致如下:

<IfModule mpm_prefork_module>
    StartServers             5
    MinSpareServers          5
    MaxSpareServers         10
    MaxRequestWorkers      250
    MaxConnectionsPerChild   0
</IfModule>

當Apache被啟動時,Apache會自動建立StartServers個程式,並且盡力將空閒程式數保持在MinSpareServers和MaxSpareServers之間。

如果空閒程式小於MinSpareServers,Apache將會以大約每秒1個的速度新建程式。

如果空閒程式小於MaxSpareServers,Apache將會刪除額空閒程式,釋放伺服器資源。

程式數的最大值由MaxClient控制,在Apache1.3中最大隻能設定為256,但在Apache2.0中,可以通過在配置開頭增加ServerLimit專案來突破256的限制,此時必須MaxClients<=ServerLimit<=20000

MaxRequestsPerChild用來控制每個程式在處理了多少次請求之後自動銷燬,這個引數可以設定為0表示無限(即不銷燬程式)

3. 優化perfork

對於一個負載相對較高的網站來說,256的程式限制是不夠的,如果伺服器已經達到256的極限,那麼接下來的訪問就需要排隊,這也就是為什麼某些伺服器負載不高,但是訪問卻很慢的原因之一。所以首先應該瞭解伺服器在繁忙時的程式數量。

 

通過設定ServerLimit和MaxClients來達到為伺服器軟擴容的目的。

然後,在訪問量高峰期,經常會出現的情況是突然之間發生非常多的併發連線,然後突然之間減少了很多訪問。如果Apache沒有準備足夠數量的預備程式,那訪問只能等待Apache每秒1個的新增程式,隨後又要將多餘的程式刪除,那Apache只能一直忙於新建和銷燬程式,大大地降低了訪問速度。可以適當增加StartServers、MinSpareServers、MaxSpareServers來使得Apache不需要一直忙於做無用功。

最後強烈推薦MaxRequestsPerChild不要設定為0,設定為非0,可以保護Apache程式免遭記憶體洩漏的影響,因為你不知道執行在Apache上的應用程式在什麼時候回出錯導致記憶體洩漏。

設定完之後大致是這樣的:

<IfModule mpm_prefork_module>
    StartServers             1000
    MinSpareServers          30
    MaxSpareServers         30
    MaxRequestWorkers      1000
    MaxConnectionsPerChild   4000
</IfModule>


1. httpd-mpm.conf配置

Apache的執行緒數控制檔案為httpd-mpm.conf,在conf/extra資料夾下面,要是該配置檔案其作用需要在httpd.conf中將#Include conf/extra/httpd-mpm.conf前#去掉,以便httpd-mpm.conf生效。

在windows系統中,其作用的是Winnt mpm段

<IfModule mpm_winnt_module>
    ThreadsPerChild        150
    MaxConnectionsPerChild   0
</IfModule>



windows下如果優化Apache的效能主要是通過專門針對WindowsNT優化的MPM(多路處理模組)-mpm_winnt.c來優化的,它使用一個單獨的父程式產生一個單獨的子程式,在這個子程式中輪流產生多個執行緒來處理請求。也就是說mpm_winnt只能啟動父子兩個程式,不能像Linux下那樣同時啟動多個程式。

 

mpm_winnt主要通過ThreadsPerChild和MaxRequestsPerChild兩個引數來優化Apache.

ThreadsPerChild

這個引數用於設定每個程式的執行緒數,子程式在啟動時建立這些執行緒後就不再建立新的執行緒了。一方面因為mpm_winnt不能啟動多個程式,所以這個數值要足夠大,以便可以處理可能的請求高峰;另一方面該引數以伺服器的響應速度為準的,數目太大的反而會變慢。因此需要綜合均衡一個合理的數值。mpm_winnt上的預設值是64,最大值是1920.這裡建議設定為100-500之間,伺服器效能高的話值大一些,反之值小一些。

 

MaxRequestsPerChild

該參數列示每個子程式能夠處理的最大請求數,即同時間內子程式數目。設定為零表示不限制,mpm_winnt上的預設值就是0.

官方參考手冊中不建議設定為0,主要基於兩點考慮:

(1)      可以防止(偶然的)記憶體洩漏無限進行,從而耗盡記憶體;

(2)      給程式一個有限壽命,從而有助於當伺服器負載減輕的時候減少活動程式的數量。

因此這個引數的值更大程度上取決於伺服器的記憶體,如果記憶體比較大的話可以設定為0或很大的數字,否則設定一個小的數值。需要說明的是,如果這個值設定的太小的話會造成Apache頻繁重啟,在日誌檔案中會看到如下的文字:Process exiting because it reached MaxRequestsPerChild. Signalingthe parent, 這樣一來降低了Apache的總體效能。

















相關文章