apache配置mpm_worker(多道處理模塊)
worker的工做原理及配置
worker是2.0 版中全新的支持多線程和多進程混合模型的MPM。因爲使用線程來處理,因此能夠處理相對海量的請求,而系統資源的開銷要小於基於進程的服務器,worker也使用了多進程,每一個進程又生成多個線程,以得到基於進程服務器的穩定性
configure -with-mpm=worker && make && make install(不指定worker,默認linux/unix採用的是prefork)
配置:
<IfModule mpm_worker_module>
# StartServers 2 //初始化創建的進程數
# MaxClients 150 //全部子進程中的線程總數
# MinSpareThreads 25 //最少空閒線程數(爲了避免在請求到來時再生成線程)
# MaxSpareThreads 75 //最大空閒線程數
# ThreadsPerChild 25 //每一個子進程數包含的線程數
# MaxRequestsPerChild 0 //控制服務器創建新進程和結束舊進程的頻率
StartServers 60
MaxClients 3200
ServerLimit 100
MinSpareThreads 1920
MaxSpareThreads 3200
#ThreadLimit 512
ThreadsPerChild 32
MaxRequestsPerChild 300
</IfModule>
公式:活動子進程的最大數量=MaxClients/ThreadsPerChild
MaxChients=ThreadsPerChild的整數倍
ServerLimit(活動子進程數量的硬限制)>= 活動子進程的最大數量
ThreadLimit(全部服務線程總數的硬限制)>=ThreadsPerChild
ServerLimit*ThreadsPerChild >= MaxClient
注意:ServerLimit,ThreadLimit必須放在前列
worker的工做原理是,由主控制進程生成「StartServers」個子進程,每一個子進程中包含固定的ThreadsPerChild線程數,各個線程獨立地處理請求。一樣,爲了避免在請求到來時再生成線程,MinSpareThreads和MaxSpareThreads設置了最少和最多的空閒線程數;而MaxClients設置了全部子進程中的線程總數。若是現有子進程中的線程總數不能知足負載,控制進程將派生新的子進程。
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沒寫就是16,它決定系統最多啓動幾個httpd進程。
ThreadLimit 沒寫默認是64,
ThreadsPerChild* ServerLimit=25*16=400,
400就是系統理論支持的最大併發。
MaxClients<ThreadsPerChild* ServerLimit,
MaxClients若是大於400將被限制在400.
400只是理論最大併發,實際併發就是MaxClients的值。
我作了以下試驗:
第一次,ab -n 10000 -c 5000
http://192.168.1.101/
Time taken for tests: 127.952487 seconds
Requests per second: 78.15 [#/sec] (mean)
Time per request: 63976.242 [ms] (mean)
Time per request: 12.795 [ms] (mean, across all concurrent requests)
Transfer rate: 22.89 [Kbytes/sec] received
第二次,ab -n 10000 -c 400
http://192.168.1.101/
Time taken for tests: 138.340074 seconds
Requests per second: 72.29 [#/sec] (mean)
Time per request: 5533.603 [ms] (mean)
Time per request: 13.834 [ms] (mean, across all concurrent requests)
Transfer rate: 21.17 [Kbytes/sec] received
第三次,ab -n 10000 -c 150
http://192.168.1.101/
Time taken for tests: 6.727553 seconds
Requests per second: 1486.42 [#/sec] (mean)
Time per request: 100.913 [ms] (mean)
Time per request: 0.673 [ms] (mean, across all concurrent requests)
Transfer rate: 435.37 [Kbytes/sec] received
前提:訪問apache的靜態頁面,本機。 結論是:併發若是大於MaxClients,服務器的效率會很低,若是併發等於小於MaxClients,10000個請求將迅速被處理完畢,效率很高