深入理解apahce的工作模式perfork、worker
更新時(shí)間:2013年06月12日 22:44:24 作者:
本文介紹下,apache的兩種工作模式perfork與worker,就它們的區(qū)別進(jìn)行深入分析,供大家學(xué)習(xí)參考
prefork模式使用多個(gè)子進(jìn)程,每個(gè)子進(jìn)程只有一個(gè)線程。每個(gè)進(jìn)程在某個(gè)確定的時(shí)間只能維持一個(gè)連接。在大多數(shù)平臺(tái)上,Prefork MPM在效率上要比Worker MPM要高,但是內(nèi)存使用大得多。prefork的無(wú)線程設(shè)計(jì)在某些情況下將比worker更有優(yōu)勢(shì):它可以使用那些沒(méi)有處理好線程安全的第三方模塊,并 且對(duì)于那些線程調(diào)試?yán)щy的平臺(tái)而言,它也更容易調(diào)試一些。
worker模式使用多個(gè)子進(jìn)程,每個(gè)子進(jìn)程有多個(gè)線程。每個(gè)線程在某個(gè)確定的時(shí)間只能維持一個(gè)連接。通常來(lái)說(shuō),在一個(gè)高流量的HTTP服務(wù)器 上,Worker MPM是個(gè)比較好的選擇,因?yàn)閃orker MPM的內(nèi)存使用比Prefork MPM要低得多。但worker MPM也由不完善的地方,如果一個(gè)線程崩潰,整個(gè)進(jìn)程就會(huì)連同其所有線程一起”死掉”.由于線程共享內(nèi)存空間,所以一個(gè)程序在運(yùn)行時(shí)必須被系統(tǒng)識(shí)別為”每 個(gè)線程都是安全的”。
prefork方式速度要稍高于worker,然而它需要的cpu和memory資源也稍多于woker。
查看現(xiàn)使用的工作模式:
apachectl -l
兩種模式配置文件+說(shuō)明:
perfork模式:
<IfModule mpm_prefork_module>
ServerLimit 2000
#連接數(shù)大于256需設(shè)置此項(xiàng)。20000是ServerLimit這個(gè)參數(shù)的最大值
StartServers 5
#初始化時(shí)建立的子進(jìn)程數(shù)。prefork默認(rèn)為5
MinSpareServers 10
#最小的空閑進(jìn)程數(shù)
MaxSpareServers 15
#最大的空閑進(jìn)程數(shù)
MaxClients 1000
#最大并發(fā)客戶端連接數(shù)上限
MaxRequestsPerChild 10000
#控制服務(wù)器殺死舊進(jìn)程產(chǎn)生新進(jìn)程的頻率
#將MaxRequestsPerChild設(shè)置成非零值有兩個(gè)好處:
#1.可以防止(偶然的)內(nèi)存泄漏無(wú)限進(jìn)行,從而耗盡內(nèi)存。
#2.給進(jìn)程一個(gè)有限壽命,從而有助于當(dāng)服務(wù)器負(fù)載減輕的時(shí)候減少活動(dòng)進(jìn)程的數(shù)量。
</IfModule>
worker模式:
<IfModule mpm_worker_module>
StartServers 3
#初始化時(shí)建立的子進(jìn)程數(shù)
MaxClients 2000
#最大并行處理數(shù)量。子進(jìn)程最大數(shù)量=MaxClients/ThreadsPerChild
ServerLimit 25
#只有在你需要將MaxClients和ThreadsPerChild設(shè)置成需要超過(guò)默認(rèn)值16個(gè)子進(jìn)程的時(shí)候才需要使用這個(gè)指令。不要將該指令的值設(shè)置的比MaxClients 和ThreadsPerChild需要的子進(jìn)程數(shù)量高。
MinSpareThreads 50
#最少空線程數(shù)
MaxSpareThreads 200
#最大空閑線程數(shù)
ThreadLimit 200
#這個(gè)指令設(shè)置了每個(gè)子進(jìn)程可配置的線程數(shù)ThreadsPerChild上限,該指令的值應(yīng)當(dāng)和ThreadsPerChild可能達(dá)到的最大值保持一致。
ThreadsPerChild 100
#子進(jìn)程建立的服務(wù)線程數(shù)
MaxRequestsPerChild 0
#設(shè)置每個(gè)子進(jìn)程在其生存期內(nèi)允許伺服的最大請(qǐng)求數(shù)量。到達(dá)MaxRequestsPerChild的限制后,子進(jìn)程將會(huì)結(jié)束。如果MaxRequestsPerChild為"0",子進(jìn)程將永遠(yuǎn)不會(huì)結(jié)束。
</IfModule>
工作模式修改方法:
重新編譯指定工作模式(默認(rèn)為prefork)
./configure --with-mpm=worker
注意:
對(duì)工作模式相關(guān)參數(shù)做出更改后,必須關(guān)閉apache服務(wù)后重新啟動(dòng)服務(wù)方可。
直接利用restart啟動(dòng)將是無(wú)效的。
worker模式使用多個(gè)子進(jìn)程,每個(gè)子進(jìn)程有多個(gè)線程。每個(gè)線程在某個(gè)確定的時(shí)間只能維持一個(gè)連接。通常來(lái)說(shuō),在一個(gè)高流量的HTTP服務(wù)器 上,Worker MPM是個(gè)比較好的選擇,因?yàn)閃orker MPM的內(nèi)存使用比Prefork MPM要低得多。但worker MPM也由不完善的地方,如果一個(gè)線程崩潰,整個(gè)進(jìn)程就會(huì)連同其所有線程一起”死掉”.由于線程共享內(nèi)存空間,所以一個(gè)程序在運(yùn)行時(shí)必須被系統(tǒng)識(shí)別為”每 個(gè)線程都是安全的”。
prefork方式速度要稍高于worker,然而它需要的cpu和memory資源也稍多于woker。
查看現(xiàn)使用的工作模式:
apachectl -l
兩種模式配置文件+說(shuō)明:
perfork模式:
復(fù)制代碼 代碼如下:
<IfModule mpm_prefork_module>
ServerLimit 2000
#連接數(shù)大于256需設(shè)置此項(xiàng)。20000是ServerLimit這個(gè)參數(shù)的最大值
StartServers 5
#初始化時(shí)建立的子進(jìn)程數(shù)。prefork默認(rèn)為5
MinSpareServers 10
#最小的空閑進(jìn)程數(shù)
MaxSpareServers 15
#最大的空閑進(jìn)程數(shù)
MaxClients 1000
#最大并發(fā)客戶端連接數(shù)上限
MaxRequestsPerChild 10000
#控制服務(wù)器殺死舊進(jìn)程產(chǎn)生新進(jìn)程的頻率
#將MaxRequestsPerChild設(shè)置成非零值有兩個(gè)好處:
#1.可以防止(偶然的)內(nèi)存泄漏無(wú)限進(jìn)行,從而耗盡內(nèi)存。
#2.給進(jìn)程一個(gè)有限壽命,從而有助于當(dāng)服務(wù)器負(fù)載減輕的時(shí)候減少活動(dòng)進(jìn)程的數(shù)量。
</IfModule>
worker模式:
復(fù)制代碼 代碼如下:
<IfModule mpm_worker_module>
StartServers 3
#初始化時(shí)建立的子進(jìn)程數(shù)
MaxClients 2000
#最大并行處理數(shù)量。子進(jìn)程最大數(shù)量=MaxClients/ThreadsPerChild
ServerLimit 25
#只有在你需要將MaxClients和ThreadsPerChild設(shè)置成需要超過(guò)默認(rèn)值16個(gè)子進(jìn)程的時(shí)候才需要使用這個(gè)指令。不要將該指令的值設(shè)置的比MaxClients 和ThreadsPerChild需要的子進(jìn)程數(shù)量高。
MinSpareThreads 50
#最少空線程數(shù)
MaxSpareThreads 200
#最大空閑線程數(shù)
ThreadLimit 200
#這個(gè)指令設(shè)置了每個(gè)子進(jìn)程可配置的線程數(shù)ThreadsPerChild上限,該指令的值應(yīng)當(dāng)和ThreadsPerChild可能達(dá)到的最大值保持一致。
ThreadsPerChild 100
#子進(jìn)程建立的服務(wù)線程數(shù)
MaxRequestsPerChild 0
#設(shè)置每個(gè)子進(jìn)程在其生存期內(nèi)允許伺服的最大請(qǐng)求數(shù)量。到達(dá)MaxRequestsPerChild的限制后,子進(jìn)程將會(huì)結(jié)束。如果MaxRequestsPerChild為"0",子進(jìn)程將永遠(yuǎn)不會(huì)結(jié)束。
</IfModule>
工作模式修改方法:
重新編譯指定工作模式(默認(rèn)為prefork)
復(fù)制代碼 代碼如下:
./configure --with-mpm=worker
注意:
對(duì)工作模式相關(guān)參數(shù)做出更改后,必須關(guān)閉apache服務(wù)后重新啟動(dòng)服務(wù)方可。
直接利用restart啟動(dòng)將是無(wú)效的。
您可能感興趣的文章:
- php pcntl_fork和pcntl_fork 的用法
- 小結(jié)Python用fork來(lái)創(chuàng)建子進(jìn)程注意事項(xiàng)
- Apache Prefork、Worker和Event三種MPM詳解
- python高并發(fā)異步服務(wù)器核心庫(kù)forkcore使用方法
- grails不能運(yùn)行fork模式解決方法
- PHP使用pcntl_fork實(shí)現(xiàn)多進(jìn)程下載圖片的方法
- Python中的進(jìn)程分支fork和exec詳解
- Linux系統(tǒng)中C語(yǔ)言編程創(chuàng)建函數(shù)fork()執(zhí)行解析
- git fork同步是什么意思?
- Linux中fork()函數(shù)實(shí)例分析
相關(guān)文章
linux操作系統(tǒng)原理 linux系統(tǒng)基礎(chǔ)教程
很多對(duì)linux操作系統(tǒng)有興趣的朋友想有一個(gè)深入的學(xué)習(xí),本篇文章給大家詳細(xì)講解了linux操作系統(tǒng)的原理,希望能夠?qū)δ阌兴鶐椭?/div> 2018-01-01Linux中如何查看文件的創(chuàng)建時(shí)間詳解
這篇文章主要給大家介紹了關(guān)于Linux中如何查看文件的創(chuàng)建時(shí)間的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Linux具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12apache documentroot指向htcdoc之外提示403錯(cuò)誤的解決方法
在windows和RH都碰到過(guò),只要把主目錄指到其他地方后就出現(xiàn)權(quán)限不夠的403提示,郁悶了好久。2010-04-04詳解Lamp環(huán)境搭建Linux CentOS6.5編譯安裝mysql5.6
這篇文章主要介紹了詳解Lamp環(huán)境搭建Linux CentOS6.5編譯安裝mysql5.6,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05Apache服務(wù)器二級(jí)域名的完美實(shí)現(xiàn)
Apache服務(wù)器二級(jí)域名的完美實(shí)現(xiàn) 首先,你的擁有一個(gè)有泛域名解析的頂級(jí)域名,例如: domain.com2008-10-10最新評(píng)論