Apache之三种工作模式和配置性能优化
1?Apache的3種模式和版本
?Apache目前一共有三種穩(wěn)定的MPM(Multi-Processing Module,多進(jìn)程處理模塊)模式,它們分別是prefork,worker和event。
 我們可以使用httpd -V 命令查看apache的版本和模式,如果你服務(wù)端允許了apache,你先用httpd -V試下,如果提示如下
那就先找到運(yùn)行的httpd進(jìn)程,ps -ef | grep httpd,然后直接用這個(gè)進(jìn)程的全路徑進(jìn)行-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優(yōu)點(diǎn):先預(yù)派生一些子進(jìn)程,然后等待連接;可以減少頻繁創(chuàng)建和銷毀進(jìn)程的開銷,每個(gè)子進(jìn)程只有一個(gè)線程,在一個(gè)時(shí)間點(diǎn)內(nèi),只能處理一個(gè)請求不需要擔(dān)心線程安全問題
缺點(diǎn):一個(gè)進(jìn)程相對占用資源,消耗大量內(nèi)存,不擅長處理高并發(fā)
?
2)worker模式
worker使用了多進(jìn)程和多線程的混合模式,worker模式也同樣會(huì)先預(yù)派生一些子進(jìn)程,然后每個(gè)子進(jìn)程創(chuàng)建一些線程,同時(shí)包括一個(gè)監(jiān)聽線程,每個(gè)請求過來會(huì)被分配到一個(gè)線程來服務(wù)。線程比起進(jìn)程會(huì)更輕量,因?yàn)榫€程是通過共享父進(jìn)程的內(nèi)存空間,因此,內(nèi)存的占用會(huì)減少一些,在高并發(fā)的場景下會(huì)比prefork有更多可用的線程,表現(xiàn)會(huì)更優(yōu)秀一些;另外,如果一個(gè)線程出現(xiàn)了問題也會(huì)導(dǎo)致同一進(jìn)程下的線程出現(xiàn)問題,如果是多個(gè)線程出現(xiàn)問題,也只是影響Apache的一部分,而不是全部。由于用到多進(jìn)程多線程,需要考慮到線程的安全,在使用keep-alive長連接的時(shí)候,某個(gè)線程會(huì)一直被占用,即使中間沒有請求,需要等待到超時(shí)才會(huì)被釋放(該問題在prefork模式下也存在)
?
3)event模式
它和worker模式很像,不同的是在于它解決了keep-alive長連接的時(shí)候占用線程資源被浪費(fèi)的問題,在event工作模式中,會(huì)有一些專門的線程用來管理這些keep-alive類型的線程,當(dāng)有真實(shí)請求過來的時(shí)候,將請求傳遞給服務(wù)器的線程,執(zhí)行完畢后,又允許它釋放。這增強(qiáng)了在高并發(fā)場景下的請求處理。
?
4)我們看下httpd平均占用內(nèi)存的大小
ps aux|grep -v grep|awk '/httpd/{sum+=$6;n++};END{print sum/n}' 11792.7差不多11M
?
?
?
?
?
2??Apache的配置和性能優(yōu)化
Apache的配置文件httpd.conf的配置方式如下,不同的模式標(biāo)簽不一樣,但是里面的參數(shù)類似
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
服務(wù)器啟動(dòng)時(shí)建立的子進(jìn)程數(shù)量
?
?
2)ServerLimit
系統(tǒng)配置的最大進(jìn)程數(shù)量
?
3)MinSpareServers
空閑子進(jìn)程的最小數(shù)量,比如默認(rèn)5;如果當(dāng)前空閑子進(jìn)程數(shù)少于MinSpareServers ,那么Apache將以最大每秒一個(gè)的速度產(chǎn)生新的子進(jìn)程,此參數(shù)不要設(shè)的太大.
?
4)MaxSpareServers
空閑子進(jìn)程的最大數(shù)量,默認(rèn)10;如果當(dāng)前有超過MaxSpareServers數(shù)量的空閑子進(jìn)程,那么父進(jìn)程會(huì)殺死多余的子進(jìn)程。這參數(shù)也不需要設(shè)置太大,如果你將其設(shè)置比MinSpareServers 小,Apache會(huì)自動(dòng)將其修改為MinSpareServers +1的數(shù)量。
?
5)MinSpareThreads
空閑線程數(shù)最小數(shù),這里默認(rèn)是75
?
6)MaxSpareThreads
空閑線程數(shù)最大數(shù),這里默認(rèn)是250
?
7)?ThreadsPerChild
每個(gè)子進(jìn)程固定產(chǎn)生的線程數(shù)量。
?
8)MaxRequestWorkers/MaxClients
限定服務(wù)器同一時(shí)間內(nèi)客戶端最大接入的請求數(shù)量,MaxRequestWorkers/MaxClients設(shè)置了所有子進(jìn)程中的線程總數(shù)。如果現(xiàn)有子進(jìn)程中的線程總數(shù)不能滿足負(fù)載,控制進(jìn)程將派生新的子進(jìn)程。
Apache2.3.1版本之前這參數(shù)MaxRequestWorkers被稱為MaxClients,
?
9)MaxConnectionsPerChild/MaxRequestsPerChild
每個(gè)子進(jìn)程在其生命周期內(nèi)允許最大的請求數(shù)量,如果請求總數(shù)已經(jīng)達(dá)到這個(gè)數(shù)值,子進(jìn)程將會(huì)結(jié)束,如果設(shè)置為0,子進(jìn)程將永遠(yuǎn)不會(huì)結(jié)束。
MaxConnectionsPerChild在Apache2.3.9之前稱之為MaxRequestsPerChild,我們可以看如下解釋
?
?
?
worker的工作原理是,由主控制進(jìn)程生成“StartServers”個(gè)子進(jìn)程,每個(gè)子進(jìn)程中包含固定的ThreadsPerChild線程數(shù),各個(gè)線程獨(dú)立地處理請求。同樣,為了不在請求到來時(shí)再生成線程,MinSpareThreads和MaxSpareThreads設(shè)置了最少和最多的空閑線程數(shù);而MaxClients設(shè)置了所有子進(jìn)程中的線程總數(shù)。如果現(xiàn)有子進(jìn)程中的線程總數(shù)不能滿足負(fù)載,控制進(jìn)程將派生新的子進(jìn)程。
MinSpareThreads和MaxSpareThreads的最大缺省值分別是75和250。這兩個(gè)參數(shù)對Apache的性能影響并不大,可以按照實(shí)際情況相應(yīng)調(diào)節(jié)
總結(jié)
以上是生活随笔為你收集整理的Apache之三种工作模式和配置性能优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: Android之提示This versi
 - 下一篇: LeetCode之First Uniqu