選擇prefork還是worker能在編譯時(shí)使用?with-mpm=MPM參數(shù)指定,默認(rèn)為prefork,
prefork
prefork采用預(yù)派生子進(jìn)程方式,用獨(dú)立的子進(jìn)程來(lái)處理 不同的請(qǐng)求,進(jìn)程之間彼此獨(dú)立。在make編譯和make install安裝后,使用httpd -l來(lái)確定當(dāng)前使用的MPM是prefork.c。查看httpd-mpm.conf設(shè)置文件,里面包含如下默認(rèn)的設(shè)置段:
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
prefork 控制進(jìn)程在最初建立“StartServers”個(gè)子進(jìn)程后,為了滿足MinSpareServers設(shè)置的需要?jiǎng)?chuàng)建一個(gè)進(jìn)程,等待一秒鐘,繼續(xù)創(chuàng)建兩個(gè),再等待一秒鐘,繼續(xù)創(chuàng)建四個(gè)……如此按指數(shù)級(jí)增加創(chuàng)建的進(jìn)程數(shù),最多達(dá)到每秒32個(gè),直到滿足MinSpareServers設(shè)置的值為止。這種模式能不必在請(qǐng)求到來(lái)時(shí)再產(chǎn)生新的進(jìn)程,從而減小了系統(tǒng)開(kāi)銷(xiāo)以增加性能。MaxSpareServers設(shè)置了最大的空閑進(jìn)程數(shù),如果空閑進(jìn)程數(shù)大于這個(gè)值,Apache會(huì)自動(dòng)kill掉一些多余進(jìn)程。這個(gè)值不要設(shè)得過(guò)大,但如果設(shè)的值比MinSpareServers小,Apache會(huì)自動(dòng)把其調(diào)整為 MinSpareServers+1。如果站點(diǎn)負(fù)載較大,可考慮同時(shí)加大MinSpareServers和MaxSpareServers。 MaxRequestsPerChild設(shè)置的是每個(gè)子進(jìn)程可處理的請(qǐng)求數(shù)。每個(gè)子進(jìn)程在處理了“MaxRequestsPerChild”個(gè)請(qǐng)求后將自動(dòng)銷(xiāo)毀。0意味著無(wú)限,即子進(jìn)程永不銷(xiāo)毀。雖然缺省設(shè)為0能使每個(gè)子進(jìn)程處理更多的請(qǐng)求,但如果設(shè)成非零值也有兩點(diǎn)重要的好處:1、可防止意外的內(nèi)存泄漏。2、在服務(wù)器負(fù)載下降的時(shí)侯會(huì)自動(dòng)減少子進(jìn)程數(shù)。因此,可根據(jù)服務(wù)器的負(fù)載來(lái)調(diào)整這個(gè)值。MaxClients是這些指令中最為重要的一個(gè),設(shè)定的是 Apache能同時(shí)處理的請(qǐng)求,是對(duì)Apache性能影響最大的參數(shù)。其缺省值150是遠(yuǎn)遠(yuǎn)不夠的,如果請(qǐng)求總數(shù)已達(dá)到這個(gè)值(可通過(guò)ps -ef|grep http|wc -l來(lái)確認(rèn)),那么后面的請(qǐng)求就要排隊(duì),直到某個(gè)已處理請(qǐng)求完畢。這就是系統(tǒng)資源還剩下非常多而HTTP訪問(wèn)卻非常慢的主要原因。雖然理論上這個(gè)值越大,能處理的請(qǐng)求就越多,但Apache默認(rèn)的限制不能大于256。ServerLimit指令無(wú)須重編譯Apache就能加大MaxClients。
ServerLimit  10000
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 10000
MaxRequestsPerChild 0


Worker
相對(duì)于prefork,worker全新的支持多線程和多進(jìn)程混合模型的MPM。由于使用線程來(lái)處理,所以能處理相對(duì)海量的請(qǐng)求,而系統(tǒng)資源的開(kāi)銷(xiāo)要小于基于進(jìn)程的服務(wù)器。不過(guò),worker也使用了多進(jìn)程,每個(gè)進(jìn)程又生成多個(gè)線程,以獲得基于進(jìn)程服務(wù)器的穩(wěn)定性。在configure ?with-mpm=worker后,進(jìn)行make編譯、make install安裝。在缺省生成的httpd-mpm.conf中有以下默認(rèn)設(shè)置段:

StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0

Worker 由主控制進(jìn)程生成“StartServers”個(gè)子進(jìn)程,每個(gè)子進(jìn)程中包含固定的ThreadsPerChild線程數(shù),各個(gè)線程獨(dú)立地處理請(qǐng)求。同樣,為了不在請(qǐng)求到來(lái)時(shí)再生成線程,MinSpareThreads和MaxSpareThreads設(shè)置了最少和最多的空閑線程數(shù);而MaxClients 設(shè)置了同時(shí)連入的clients最大總數(shù)。如果現(xiàn)有子進(jìn)程中的線程總數(shù)不能滿足負(fù)載,控制進(jìn)程將派生新的子進(jìn)程。MinSpareThreads和 MaxSpareThreads的最大缺省值分別是75和250。這兩個(gè)參數(shù)對(duì)Apache的性能影響并不大,能按照實(shí)際情況相應(yīng)調(diào)節(jié)。 ThreadsPerChild是worker MPM中和性能相關(guān)最密切的指令。ThreadsPerChild的最大缺省值是64,如果負(fù)載較大,64也是不夠的。這時(shí)要顯式使用 ThreadLimit指令,他的最大缺省值是20000。Worker模式下所能同時(shí)處理的請(qǐng)求總數(shù)是由子進(jìn)程總數(shù)乘以ThreadsPerChild 值決定的,應(yīng)該大于等于MaxClients。如果負(fù)載非常大,現(xiàn)有的子進(jìn)程數(shù)不能滿足時(shí),控制進(jìn)程會(huì)派生新的子進(jìn)程。默認(rèn)最大的子進(jìn)程總數(shù)是16,加大時(shí)也需要顯式聲明ServerLimit(最大值是20000)。需要注意的是,如果顯式聲明了ServerLimit,那么他乘以 ThreadsPerChild的值必須大于等于MaxClients,而且MaxClients必須是ThreadsPerChild的整數(shù)倍,否則 Apache將會(huì)自動(dòng)調(diào)節(jié)到一個(gè)相應(yīng)值。
ServerLimit 25
ThreadLimit 200
StartServers 3
MaxClients 2000
MinSpareThreads 50
MaxSpareThreads 200
ThreadsPerChild 100
MaxRequestsPerChild 0
下面是利用Apache自帶的測(cè)試工具ab對(duì)Server進(jìn)行測(cè)試的情況(設(shè)定請(qǐng)求的index頁(yè)面為6bytes),cpu%為cpu占用率,mem為內(nèi)存使用量(M為單位),RequestsPerSecond為每秒處理的請(qǐng)求數(shù)。
1、Prefor方式
  (ServerLimit,StartServer,MinSpareServers,MaxSpareServers,MaxClients,MaxRequestPerChild)            

-n/-c(ab參數(shù))
Cpu%
Mem
Requestspersecond
(-,5,5,10,150,0)
100000/100
28.8
285
8434
100000/200
29.2
304
8032
100000/500
25.3
323
7348
100000/1000
24.4
330
5886
(10000,5,5,10,500,0)
100000/100
28.7
371
8345
100000/200
27.4
389
7929
100000/500
24.9
417
7229
100000/1000
23.4
437
6676
(10000,5,5,10,1000,0)
100000/100
28.8
408
8517
100000/200
27.0
422
8045
100000/500
24.2
455
7236
100000/1000
22.5
470
6570
(10000,5,5,10,1500,0)
100000/100
29.6
330
8407
100000/200
28.1
349
8014
100000/500
26.4
380
7290
100000/1000
24.0
400
6686
2、Worker方式
(ServerLimt,Threadlimt,Startservers,MaxClients,MinspareThread,MaxspareThread,ThreadperChild,MaxRequestPerChild)
                  

-n/-c(ab參數(shù))
cpu%
mem
RequestsperSecond
(50,500,5,10000,50,200,200,0)
100000/100
18.6
188
6020
100000/200
20.1
195
5892
100000/500
19.8
209
5708
100000/1000
22.2
218
6081
(100,500,5,10000,50,200,100,0)
100000/100
24.5
240
6919
100000/200
23.6
247
6798
100000/500
24.6
254
6827
100000/1000
22.3
271
6114
(200,500,5,10000,50,200,50,0)
100000/100
27.3
301
7781
100000/200
27.4
307
7789
100000/500
26.0
320
7141
100000/1000
21.8
344
6110
相對(duì)來(lái)說(shuō),prefork方式速度要稍高于worker,然而他需要的cpu和memory資源也稍多于woker。