Apache兩種常用工作模式:prefork和worker。
prefork MPM
prefork是一個非線程型的、預派生的MPM,使用多個進程,每個進程在某個確定的時間只單獨處理一個連接,效率高,但內存使用比較大。
可通過了解prefork的配置認識prefork,配置位置:apache/conf/extra/httpd-mpm.conf
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
參數:
–StartServer:服務器啟動時一次建立的子進程數量
–MinSpareServers:設置空閑子進程的最小數量。如果當前空閑子進程數少於這個值,那么Apache會從一秒創建一個進程,第二秒繼續創建兩個…直到滿足MinSpareServers設置的值為止。不需要設的太大。
–MaxSpareServers:設置空閑子進程的最大數量。如果空閑子進程數量超過MaxSpareServers,apache則會kill掉多余空閑子進程。
–MaxClients:設定apache同一時間處理的最大請求數量。任何超過MaxClients的請求都將進入等候對列。默認最大為256,要設置大於256時,必須同時設置ServerLimit(保持ServerLimit大於或等於MaxClient)。如果發現請求處理很慢但系統資源使用少,就需要調高這個參數。
–MaxRequestsPerChild:每個子進程最多處理的請求數量,到達這個值,子進程將會自動結束,這樣可以避免內存泄漏。設為0則永遠不結束。
–ServerLimit:用於限制MaxClient,最大值為20000,超過了就需要修改apache內核重新編譯。注意此參數必須放在其他參數之前。
最重要的值是MaxClients允許足夠多的工作進程,同時又不會導致服務器當機。
可通過查看httpd進程數:#ps -ef | grep httpd | wc -l,選擇高峰期,結合當時服務器資源使用情況,來設置MaxClients。
worker MPM
worker是支持混合的多線程多進程的多路處理的MPM,使用多個子進程,每個子進程有多個線程,每個線程在某個確定的時間只處理一個連接,內存使用較低,但一個線程崩潰,就會影響同一個進程下的所有線程。
同樣通過配置認識worker
<IfModule mpm_worker_module>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
參數:
–StartServer:服務器啟動時一次建立的子進程數量
–MaxClients:設定apache同一時間處理的最大請求數量,這里是指最大線程數量,大小仍受ServerLimit限制且必須是ThreadsPerChild的倍數。
–MinSpareThreads:設置最少的空閑線程數
–MaxSpareServers:設置最大的空閑線程數,必須大於等於MinSpareThreads加上ThreadsPerChild的和(因為每個子進程擁有的線程數是固定的)
–ThreadsPerChild:每個子進程建立的常駐線程,之后不會再創建新的線程。大小受ThreadLimit限制。
–MaxRequestsPerChild:每個子進程最多處理的請求數量,同prefork的一樣
–ServerLimit:服務器允許配置的進程數上限,和ThreadLimit共同限制MaxClients(MaxClients <= ServerLimit * ThreadsPerChild)。
–ThreadLimit:TreadsPerChild可以配置的線程數上限,默認為64。
根據網友一些測試數據,實際情況下還是選prefork工作模式較好。
默認情況下,Linux下的Apache是prefork模式,切換成worker模式步驟如下:
prefork和worker模式的切換
1.將當前的prefork模式啟動文件改名
mv httpd httpd.prefork
2.將worker模式的啟動文件改名
mv httpd.worker httpd
3.修改Apache配置文件
vim /usr/local/apache2/conf/extra/httpd-mpm.conf
找到里邊的如下一段,可適當修改負載等參數:
<IfModule mpm_worker_module> StartServers 2 MaxClients 150 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 </IfModule>
4.重新啟動服務
/usr/local/apache2/bin/apachectl restart
即可換成worker方式啟動apache2
處於穩定性和安全性考慮,不建議更換apache2的運行方式,使用系統默認prefork即可。另外很多PHP模塊不能工作在worker模式下,例如redhat Linux自帶的PHP也不能支持線程安全。所以最好不要切換工作模式。
網友評論:
for redhat
在 /etc/sysconfig/httpd 打開 #HTTPD=/usr/sbin/httpd.worker 的注釋
請教 .mpm_worker +mod_php 有在用到生產么?
worker mpm一般不會跟mod_php搭配,worker mpm一般都是跟apache的mod_fcgid 搭配,然后PHP要安裝php-cgi 來跑PHP的。
海哥CentOS博客的LAMP一鍵安裝包寫到:
++++++++++++++++++++++++++++++++++++++++++++++++ echo "select the mpm of apache" echo "1) prefork (Recommend)" echo "2) worker (Multi-threaded)" echo "3) event (Multi-threaded,not support ssl.)" ++++++++++++++++++++++++++++++++++++++++++++++++
延伸閱讀:
