prefork模式使用多個子進程,每個子進程只有一個線程。每個進程在某個確定的時間只能維持一個串連。在大多數平台上,Prefork MPM在效率上要比Worker MPM要高,但是記憶體使用量大得多。prefork的無線程設計在某些情況下將比worker更有優勢:它可以使用那些沒有處理好安全執行緒的第三方模組,並 且對於那些線程調試困難的平台而言,它也更容易調試一些。
worker模式使用多個子進程,每個子進程有多個線程。每個線程在某個確定的時間只能維持一個串連。通常來說,在一個高流量的HTTP伺服器 上,Worker MPM是個比較好的選擇,因為Worker MPM的記憶體使用量比Prefork MPM要低得多。但worker MPM也由不完善的地方,如果一個線程崩潰,整個進程就會連同其所有線程一起”死掉”.由於線程共用記憶體空間,所以一個程式在運行時必須被系統識別為”每 個線程都是安全的”。
prefork方式速度要稍高於worker,然而它需要的cpu和memory資源也稍多於woker。
查看現使用的工作模式:
apachectl -l
兩種模式設定檔+說明:
perfork模式:
複製代碼 代碼如下:<IfModule mpm_prefork_module>
ServerLimit 2000
#串連數大於256需設定此項。20000是ServerLimit這個參數的最大值
StartServers 5
#初始化時建立的子進程數。prefork預設為5
MinSpareServers 10
#最小的空閑進程數
MaxSpareServers 15
#最大的空閑進程數
MaxClients 1000
#最大並發用戶端串連數上限
MaxRequestsPerChild 10000
#控制伺服器殺死舊進程產生新進程的頻率
#將MaxRequestsPerChild設定成非零值有兩個好處:
#1.可以防止(偶然的)記憶體流失無限進行,從而耗盡記憶體。
#2.給進程一個有限壽命,從而有助於當伺服器負載減輕的時候減少活動進程的數量。
</IfModule>
worker模式:
複製代碼 代碼如下:<IfModule mpm_worker_module>
StartServers 3
#初始化時建立的子進程數
MaxClients 2000
#最大平行處理數量。子進程最大數量=MaxClients/ThreadsPerChild
ServerLimit 25
#只有在你需要將MaxClients和ThreadsPerChild設定成需要超過預設值16個子進程的時候才需要使用這個指令。不要將該指令的值設定的比MaxClients 和ThreadsPerChild需要的子進程數量高。
MinSpareThreads 50
#最少空線程數
MaxSpareThreads 200
#最大空閑線程數
ThreadLimit 200
#這個指令設定了每個子進程可配置的線程數ThreadsPerChild上限,該指令的值應當和ThreadsPerChild可能達到的最大值保持一致。
ThreadsPerChild 100
#子進程建立的服務線程數
MaxRequestsPerChild 0
#設定每個子進程在其生存期內允許伺服的最大請求數量。到達MaxRequestsPerChild的限制後,子進程將會結束。如果MaxRequestsPerChild為"0",子進程將永遠不會結束。
</IfModule>
工作模式修改方法:
重新編譯指定工作模式(預設為prefork)
複製代碼 代碼如下:./configure --with-mpm=worker
注意:
對工作模式相關參數做出更改後,必須關閉apache服務後重新啟動服務方可。
直接利用restart啟動將是無效的。