Apache MPM兩種方式講解

2022-04-05 14:59:30 字數 4670 閱讀 7404

選擇prefork還是worker可以在編譯時使用–with-mpm=mpm引數指定,預設為prefork,

prefork

prefork採用預派生子程序方式,用單獨的子程序來處理 不同的請求,程序之間彼此獨立。在make編譯和make install安裝後,使用httpd -l來確定當前使用的mpm是prefork.c。檢視httpd-mpm.conf配置檔案,裡面包含如下預設的配置段:

startservers 5 

minspareservers 5 

maxspareservers 10 

maxclients 150 

maxrequestsperchild 0 

prefork 控制程序在最初建立「startservers」個子程序後,為了滿足minspareservers設定的需要建立乙個程序,等待一秒鐘,繼續建立兩 個,再等待一秒鐘,繼續建立四個……如此按指數級增加建立的程序數,最多達到每秒32個,直到滿足minspareservers設定的值為止。這種模式 可以不必在請求到來時再產生新的程序,從而減小了系統開銷以增加效能。maxspareservers設定了最大的空閒程序數,如果空閒程序數大於這個 值,apache會自動kill掉一些多餘程序。這個值不要設得過大,但如果設的值比minspareservers小,apache會自動把其調整為 minspareservers+1。如果站點負載較大,可考慮同時加大minspareservers和maxspareservers。 maxrequestsperchild設定的是每個子程序可處理的請求數。每個子程序在處理了「maxrequestsperchild」個請求後將自 動銷毀。0意味著無限,即子程序永不銷毀。雖然預設設為0可以使每個子程序處理更多的請求,但如果設成非零值也有兩點重要的好處:1、可防止意外的記憶體洩 漏。2、在伺服器負載下降的時侯會自動減少子程序數。因此,可根據伺服器的負載來調整這個值。maxclients是這些指令中最為重要的乙個,設定的是 apache可以同時處理的請求,是對apache效能影響最大的引數。其預設值150是遠遠不夠的,如果請求總數已達到這個值(可通過ps -ef|grep http|wc -l來確認),那麼後面的請求就要排隊,直到某個已處理請求完畢。這就是系統資源還剩下很多而http訪問卻很慢的主要原因。雖然理論上這個值越大,可以 處理的請求就越多,但apache預設的限制不能大於256。serverlimit指令無須重編譯apache就可以加大maxclients。

serverlimit 10000

startservers 5 

minspareservers 5 

maxspareservers 10 

maxclients 10000 

maxrequestsperchild 0 

worker

相對於prefork,worker全新的支援多執行緒和多程序混合模型的mpm。由於 使用執行緒來處理,所以可以處理相對海量的請求,而系統資源的開銷要小於基於程序的伺服器。但是,worker也使用了多程序,每個程序又生成多個執行緒,以 獲得基於程序伺服器的穩定性。在configure –with-mpm=worker後,進行make編譯、make install安裝。在預設生成的httpd-mpm.conf中有以下預設配置段:

startservers 2 

maxclients 150 

minsparethreads 25 

maxsparethreads 75 

threadsperchild 25 

maxrequestsperchild 0 

worker 由主控制程序生成「startservers」個子程序,每個子程序中包含固定的threadsperchild執行緒數,各個執行緒獨立地處理請求。同樣, 為了不在請求到來時再生成執行緒,minsparethreads和maxsparethreads設定了最少和最多的空閒執行緒數;而maxclients 設定了同時連入的clients最大總數。如果現有子程序中的執行緒總數不能滿足負載,控制程序將派生新的子程序。minsparethreads和 maxsparethreads的最大預設值分別是75和250。這兩個引數對apache的效能影響並不大,可以按照實際情況相應調節。 threadsperchild是worker mpm中與效能相關最密切的指令。threadsperchild的最大預設值是64,如果負載較大,64也是不夠的。這時要顯式使用 threadlimit指令,它的最大預設值是20000。worker模式下所能同時處理的請求總數是由子程序總數乘以threadsperchild 值決定的,應該大於等於maxclients。如果負載很大,現有的子程序數不能滿足時,控制程序會派生新的子程序。預設最大的子程序總數是16,加大時 也需要顯式宣告serverlimit(最大值是20000)。需要注意的是,如果顯式宣告了serverlimit,那麼它乘以 threadsperchild的值必須大於等於maxclients,而且maxclients必須是threadsperchild的整數倍,否則 apache將會自動調節到乙個相應值。

serverlimit 25

threadlimit 200

startservers 3 

maxclients 2000

minsparethreads 50 

maxsparethreads 200 

threadsperchild 100 

maxrequestsperchild 0 

下面是利用apache自帶的測試工具ab對server進行測試的情況(設定請求的index頁面為6bytes),cpu%為cpu佔用率,mem為記憶體使用量(m為單位),requestspersecond為每秒處理的請求數。

1、prefor方式

(serverlimit,startserver,minspareservers,maxspareservers,maxclients,maxrequestperchild)

-n/-c(ab引數)

cpu%

memrequestspersecond

(-,5,5,10,150,0)

100000/100

28.8

2858434

100000/200

29.2

3048032

100000/500

25.3

3237348

100000/1000

24.4

3305886

(10000,5,5,10,500,0)

100000/100

28.7

3718345

100000/200

27.4

3897929

100000/500

24.9

4177229

100000/1000

23.4

4376676

(10000,5,5,10,1000,0)

100000/100

28.8

4088517

100000/200

27.0

4228045

100000/500

24.2

4557236

100000/1000

22.5

4706570

(10000,5,5,10,1500,0)

100000/100

29.6

3308407

100000/200

28.1

3498014

100000/500

26.4

3807290

100000/1000

24.0

4006686

2、worker方式

(serverlimt,threadlimt,startservers,maxclients,minsparethread,maxsparethread,threadperchild,maxrequestperchild)

-n/-c(ab引數)

cpu%

memrequestspersecond

(50,500,5,10000,50,200,200,0)

100000/100

18.6

1886020

100000/200

20.1

1955892

100000/500

19.8

2095708

100000/1000

22.2

2186081

(100,500,5,10000,50,200,100,0)

100000/100

24.5

2406919

100000/200

23.6

2476798

100000/500

24.6

2546827

100000/1000

22.3

2716114

(200,500,5,10000,50,200,50,0)

100000/100

27.3

3017781

100000/200

27.4

3077789

100000/500

26.0

3207141

100000/1000

21.8

3446110

相對來說,prefork方式速度要稍高於worker,然而它需要的cpu和memory資源也稍多於woker。

兩種過載方式

過載的方式 用某次作業題中的實現complex類做例子 1 實現加法 1 complex complex operator const complex c 2 友元函式 complex operator const complex l,const complex r 2 實現 1 complex c...

C DLL匯出的兩種方式和鏈結的兩種方式

第一種 匯出方式 extern c declspec dllexport int plus int x,int y extern c declspec dllexport int sub int x,int y extern c declspec dllexport int mul int x,in...

iddenField兩種取值方式

hiddenfield控制項顧名思義就是隱藏輸入框的伺服器控制項,它能讓你儲存那些不需要顯示在頁面上的且對安全性要求不高的資料。也許這個時候應該有這麼乙個疑問,為什麼有了viewstate session和cookie等狀態儲存機制,還需要用起hiddenfield呢?增加hiddenfield,其...