1?Apache的3種模式和版本
?Apache目前一共有三種穩定的MPM(Multi-Processing Module,多進程處理模塊)模式,它們分別是prefork,worker和event。
我們可以使用httpd -V 命令查看apache的版本和模式,如果你服務端允許了apache,你先用httpd -V試下,如果提示如下
-bash: httpd: command not found
那就先找到運行的httpd進程,ps -ef | grep httpd,然后直接用這個進程的全路徑進行-V操作
/**/**/apache_portal/bin/httpd -V
AH00318: WARNING: MaxRequestWorkers of 20000 would require 100 servers andwould exceed ServerLimit of 60, decreasing to 12000.To increase, please see the ServerLimit directive.
Server version: Server/2.4.18 (Unix)
Server built: Jul 21 2017 08:43:23
Server's Module Magic Number: 20120211:52
Server loaded: APR 1.5.2, APR-UTIL 1.5.4
Compiled using: APR 1.5.2, APR-UTIL 1.5.4
Architecture: 64-bit
Server MPM: worker
這里我們可以知道apache的模式是worker模式,然后版本是2.4.18
1)prefork模式
Prefork MPM優點:先預派生一些子進程,然后等待連接;可以減少頻繁創建和銷毀進程的開銷,每個子進程只有一個線程,在一個時間點內,只能處理一個請求不需要擔心線程安全問題
缺點:一個進程相對占用資源,消耗大量內存,不擅長處理高并發
?
2)worker模式
worker使用了多進程和多線程的混合模式,worker模式也同樣會先預派生一些子進程,然后每個子進程創建一些線程,同時包括一個監聽線程,每個請求過來會被分配到一個線程來服務。線程比起進程會更輕量,因為線程是通過共享父進程的內存空間,因此,內存的占用會減少一些,在高并發的場景下會比prefork有更多可用的線程,表現會更優秀一些;另外,如果一個線程出現了問題也會導致同一進程下的線程出現問題,如果是多個線程出現問題,也只是影響Apache的一部分,而不是全部。由于用到多進程多線程,需要考慮到線程的安全,在使用keep-alive長連接的時候,某個線程會一直被占用,即使中間沒有請求,需要等待到超時才會被釋放(該問題在prefork模式下也存在)
?
3)event模式
它和worker模式很像,不同的是在于它解決了keep-alive長連接的時候占用線程資源被浪費的問題,在event工作模式中,會有一些專門的線程用來管理這些keep-alive類型的線程,當有真實請求過來的時候,將請求傳遞給服務器的線程,執行完畢后,又允許它釋放。這增強了在高并發場景下的請求處理。
?
4)我們看下httpd平均占用內存的大小
ps aux|grep -v grep|awk '/httpd/{sum+=$6;n++};END{print sum/n}'
11792.7
差不多11M
?
?
?
?
?
2??Apache的配置和性能優化
Apache的配置文件httpd.conf的配置方式如下,不同的模式標簽不一樣,但是里面的參數類似
prefork模式部分配置如下
<IfModule mpm_prefork_module>StartServers 5MinSpareServers 5MaxSpareServers 10MaxRequestWorkers 250MaxConnectionsPerChild 1000
</IfModule>
worker模式部分配置如下
<IfModule mpm_worker_module>StartServers 3ServerLimit 16MinSpareThreads 75MaxSpareThreads 250ThreadsPerChild 25MaxRequestWorkers 400MaxConnectionsPerChild 1000
</IfModule>
event模式部分配置如下
<IfModule mpm_event_module>StartServers 3ServerLimit 16MinSpareThreads 75MaxSpareThreads 250ThreadsPerChild 25MaxRequestWorkers 400MaxConnectionsPerChild 1000
</IfModule>
1)StartServers
服務器啟動時建立的子進程數量
?
?
2)ServerLimit
系統配置的最大進程數量
?
3)MinSpareServers
空閑子進程的最小數量,比如默認5;如果當前空閑子進程數少于MinSpareServers ,那么Apache將以最大每秒一個的速度產生新的子進程,此參數不要設的太大.
?
4)MaxSpareServers
空閑子進程的最大數量,默認10;如果當前有超過MaxSpareServers數量的空閑子進程,那么父進程會殺死多余的子進程。這參數也不需要設置太大,如果你將其設置比MinSpareServers 小,Apache會自動將其修改為MinSpareServers +1的數量。
?
5)MinSpareThreads
空閑線程數最小數,這里默認是75
?
6)MaxSpareThreads
空閑線程數最大數,這里默認是250
?
7)?ThreadsPerChild
每個子進程固定產生的線程數量。
?
8)MaxRequestWorkers/MaxClients
限定服務器同一時間內客戶端最大接入的請求數量,MaxRequestWorkers/MaxClients設置了所有子進程中的線程總數。如果現有子進程中的線程總數不能滿足負載,控制進程將派生新的子進程。
Apache2.3.1版本之前這參數MaxRequestWorkers被稱為MaxClients,
?
9)MaxConnectionsPerChild/MaxRequestsPerChild
每個子進程在其生命周期內允許最大的請求數量,如果請求總數已經達到這個數值,子進程將會結束,如果設置為0,子進程將永遠不會結束。
MaxConnectionsPerChild在Apache2.3.9之前稱之為MaxRequestsPerChild,我們可以看如下解釋
?
?
?
worker的工作原理是,由主控制進程生成“StartServers”個子進程,每個子進程中包含固定的ThreadsPerChild線程數,各個線程獨立地處理請求。同樣,為了不在請求到來時再生成線程,MinSpareThreads和MaxSpareThreads設置了最少和最多的空閑線程數;而MaxClients設置了所有子進程中的線程總數。如果現有子進程中的線程總數不能滿足負載,控制進程將派生新的子進程。
MinSpareThreads和MaxSpareThreads的最大缺省值分別是75和250。這兩個參數對Apache的性能影響并不大,可以按照實際情況相應調節