發新話題

Apache性能比較測試 MaxClients 150 256 10000

Apache性能比較測試 MaxClients 150 256 10000

Apache在配置編譯時可以自主的選擇想要使用的MPM模塊,使用./configure --with-mpm=MPM命令。我們主要瞭解prefork和worker這兩種MPM模塊。

Prefork
如果不用「--with-mpm」顯式指定某種MPM,prefork就是Unix平台上缺省的MPM。它改採用的預派生子進程方式,用單獨的子進程來處理不同的請求,進程之間彼此獨立。在make編譯和make install安裝後,使用httpd -l來確定當前使用的
MPM是prefork.c。查看httpd-mpm.conf配置文件,裡面包含如下默認的配置段:
<IfModule prefork.c>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
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 httpd|wc -l來確認),那麼後面的請求就要排隊,直到某個已處理請求完畢。這就是系統資源還剩下很多而HTTP訪問卻很慢的主要原因。

但具體這個數值以多少為宜呢?當對性能要求較高時,可以用下面的方法確定如何配置此參數。首先,估計你的最大可能並發的連接數,或者在高負載時用ps -ef|grep apache|wc命令測得最大進程數,通常MaxClients應該是這個數值的兩倍左右。如果當前網站在高負載時的訪問速度可以接受,但有拒絕服務現象,則應把此參數調大,如果無拒絕服務現象,但訪問速度緩慢,則應減低此數值。


雖然理論上這個值越大,可以處理的請求就越多,但Apache默認的限制不能大於256。ServerLimit指令無須重編譯Apache就可以加大MaxClients。 ServerLimt應該放在第一個位置,放在其他指令之間不起作用(不明白原因)。
<IfModule prefork.c>
ServerLimit  10000
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 10000
MaxRequestsPerChild 0
</IfModule>

Worker
相對於prefork,worker全新的支持多線程和多進程混合模型的MPM。由於使用線程來處理,所以可以處理相對海量的請求,而系統資源的開銷要小於基於進程的服務器。但是,worker也使用了多進程,每個進程又生成多個線程,以獲得基於進程服務器的穩定性。在configure --with-mpm=worker後,進行make編譯、make install安裝。在缺省生成的httpd-mpm.conf中有以下默認配置段:
<IfModule worker.c>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
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將會自動調節到一個相應值。
<IfModule worker.c>
ServerLimit 25
ThreadLimit 200
StartServers 3
MaxClients 2000
MinSpareThreads 50
MaxSpareThreads 200
ThreadsPerChild 100
MaxRequestsPerChild 0
</IfModule>

下面是利用Apache自帶的測試工具ab對Server進行測試的情況(設定請求的index頁面為6bytes,Apache Server配置2cpu 2G memory),cpu%為cpu佔用率,mem為內存使用量(M為單位),RequestsPerSecond為每秒處理的請求數。
1、Prefor方式
  (ServerLimit,StartServer,MinSpareServers,MaxSpareServers,MaxClients,MaxRequestPerChild)            
-n/-c(ab參數)         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參數)         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

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

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。