mpm_worker模塊也主要應用於Unix/
Linux平台的Apache服務器,它可以看作是mpm_prefork模塊的改進版。mpm_worker模塊的工作方式與mpm_prefork模塊類似。不過,由於處理相同請求的情況下,基於進程(例如mpm_prefork)比基於線程的處理方式占用的系統資源要多。因此,與mpm_prefork模塊不同的是,mpm_worker模塊會讓每個子進程創建固定數量的服務線程和一個監聽線程,並讓每個服務線程來處理客戶端的請求,監聽線程用於監聽接入請求並將其傳遞給服務線程處理和應答。Apache總是試圖維持一個備用或是空閒的服務線程池。這樣,客戶端無須等待新線程或新進程的建立即可得到處理。
與mpm_prefork模塊相比,mpm_worker模塊可以進一步減少系統資源的開銷。再加上它也使用了多進程,每個進程又有多個線程,因此它與完全基於線程的處理方式相比,又增加了一定的穩定性。
<IfModule mpm_worker_module>
StartServers 2 #推薦設置:小=默認 中=3~5 大=5~10
MaxClients 150 #推薦設置:小=500 中=500~1500 大型=1500~3000
MinSpareThreads 25 #推薦設置:小=默認 中=50~100 大=100~200
MaxSpareThreads 75 #推薦設置:小=默認 中=80~160 大=200~400
ThreadsPerChild 25 #推薦設置:小=默認 中=50~100 大型=100~200
MaxRequestsPerChild 0 #推薦設置:小=10000 中或大=10000~50000
(此外,如果MaxClients/ThreadsPerChild大於16,還需額外設置ServerLimit參數,ServerLimit必須大於等於 MaxClients/ThreadsPerChild 的值。)
</IfModule>
對應的配置參數作用如下:
StartServers
啟動Apache時創建的子進程數。
MinSpareServers
處於空閒狀態的最小子進程數。
所謂空閒子進程是指沒有正在處理請求的子進程。如果當前空閒子進程數少於MinSpareServers,那麼Apache將以最大每秒一個的速度產生新的子進程。只有在非常繁忙機器上才需要調整這個參數。此值不宜過大。
MaxSpareServers
處於空閒狀態的最大子進程數。
只有在非常繁忙機器上才需要調整這個參數。此值不宜過大。如果你將該指令的值設置為比MinSpareServers小,Apache將會自動將其修改成MinSpareServers+1。
MaxClients
允許同時連接的最大請求數量。
任何超過MaxClients限制的請求都將進入等待隊列,直到達到ListenBacklog指令限制的最大值為止。
對於非線程型的MPM(也就是mpm_prefork),MaxClients表示可以用於處理客戶端請求的最大子進程數量,默認值是256。要增大這個值,你必須同時增大ServerLimit。
對於線程型或者混合型的MPM(也就是mpm_beos或mpm_worker),MaxClients表示可以用於處理客戶端請求的最大線程數量。線程型的mpm_beos的默認值是50。對於混合型的MPM默認值是16(ServerLimit)乘以25(ThreadsPerChild)的結果。因此要將MaxClients增加到超過16個進程才能提供的時候,你必須同時增加ServerLimit的值。
MinSpareThreads
處於空閒狀態的最小線程數。
不同的MPM對這個指令的處理是不一樣的:
mpm_worker的默認值是75。這個MPM將基於整個服務器監視空閒線程數。如果服務器中總的空閒線程數太少,子進程將產生新的空閒線程。mpm_netware的默認值是10。既然這個MPM只運行單獨一個子進程,此MPM當然亦基於整個服務器監視空閒線程數。mpm_beos和mpmt_os2的工作方式與mpm_netware差不多,mpm_beos的默認值是1;mpmt_os2的默認值是5。
MaxSpareThreads
處於空閒狀態的最大線程數。
不同的MPM對這個指令的處理是不一樣的:
mpm_worker的默認值是250。這個MPM將基於整個服務器監視空閒線程數。如果服務器中總的空閒線程數太多,子進程將殺死多余的空閒線程。mpm_netware的默認值是100。既然這個MPM只運行單獨一個子進程,此MPM當然亦基於整個服務器監視空閒線程數。mpm_beos和mpmt_os2的工作方式與mpm_netware差不多,mpm_beos的默認值是50;mpmt_os2的默認值是10。
備注:ServerLimit表示Apache允許創建的最大進程數。 值得注意的是,Apache在編譯時內部有一個硬限制ServerLimit 20000(對於mpm_prefork模塊為ServerLimit 200000)。你不能超越這個限制。
使用這個指令時要特別當心。如果將ServerLimit設置成一個高出實際需要許多的值,將會有過多的共享內存被分配。如果將ServerLimit和MaxClients設置成超過系統的處理能力,Apache可能無法啟動,或者系統將變得不穩定。
注意:在配置相關參數時,請先保證服務器具備足夠的硬件性能(例如:CPU、內存等)。 如果發現自啟動後,隨著服務器的運行時間增加,服務器的內存占用也隨之增加,可能是程序中出現內存洩露,請向下調整參數MaxRequestsPerChild的值以降低內存洩露帶來的影響,然後盡快找出程序中的問題之所在。