摘要:的三種工作模式服務(wù)器目前一共有三種穩(wěn)定的,多進(jìn)程處理模塊模式。模式下所能同時(shí)處理的請(qǐng)求總數(shù)是由子進(jìn)程總數(shù)乘以值決定的,應(yīng)該大于等于。默認(rèn)最大的子進(jìn)程總數(shù)是,加大時(shí)也需要顯式聲明最大值是。
Apache 的三種工作模式(Prefork、Worker、Event)
Web服務(wù)器Apache目前一共有三種穩(wěn)定的MPM(Multi-Processing Module,多進(jìn)程處理模塊)模式。
它們分別是prefork,worker、event,它們同時(shí)也代表這Apache的演變和發(fā)展。
本文原文轉(zhuǎn)自米撲博客:Apache 工作的三種模式:Prefork、Worker、Event
如何查看我們的Apache的工作模式呢?可以使用httpd -V 命令查看,如我安裝的Apache 2.4版本。
# httpd -V Server version: Apache/2.4.34 (Unix) Server built: Aug 2 2018 19:44:29 Server"s Module Magic Number: 20120211:79 Server loaded: APR 1.6.3, APR-UTIL 1.6.1 Compiled using: APR 1.6.3, APR-UTIL 1.6.1 Architecture: 64-bit Server MPM: event threaded: yes (fixed thread count) forked: yes (variable process count)
或者,更直接的命令 httpd -l 或 apachectl -V | grep -i mpm
# httpd -l Compiled in modules: core.c mod_so.c http_core.c event.c # apachectl -V | grep -i mpm Server MPM: event
這里使用的是event模式,在apache的早期版本2.0默認(rèn)prefork,2.2版本是worker,2.4版本是event,詳見米撲博客:Apache 服務(wù)器負(fù)載低訪問(wèn)慢的原因分析和優(yōu)化方案
在configure配置編譯參數(shù)的時(shí)候,可以使用--with-mpm=prefork|worker|event 來(lái)指定編譯為那一種MPM,當(dāng)然也可以用編譯為三種都支持:--enable-mpms-shared=all,這樣在編譯的時(shí)候會(huì)在modules目錄下自動(dòng)編譯出三個(gè)MPM文件的so,然后通過(guò)修改httpd.conf配置文件更改MPM
1、Prefork MPM
Prefork MPM實(shí)現(xiàn)了一個(gè)非線程的、預(yù)派生的web服務(wù)器。它在Apache啟動(dòng)之初,就先預(yù)派生一些子進(jìn)程,然后等待連接;可以減少頻繁創(chuàng)建和銷毀進(jìn)程的開銷,每個(gè)子進(jìn)程只有一個(gè)線程,在一個(gè)時(shí)間點(diǎn)內(nèi),只能處理一個(gè)請(qǐng)求。這是一個(gè)成熟穩(wěn)定,可以兼容新老模塊,也不需要擔(dān)心線程安全問(wèn)題,但是一個(gè)進(jìn)程相對(duì)占用資源,消耗大量?jī)?nèi)存,不擅長(zhǎng)處理高并發(fā)的場(chǎng)景。
圖片描述
如何配置在Apache的配置文件httpd.conf的配置方式:
StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxRequestWorkers 250 MaxConnectionsPerChild 1000
StartServers 服務(wù)器啟動(dòng)時(shí)建立的子進(jìn)程數(shù)量,prefork默認(rèn)是5,
MinSpareServers 空閑子進(jìn)程的最小數(shù)量,默認(rèn)5;如果當(dāng)前空閑子進(jìn)程數(shù)少于MinSpareServers ,那么Apache將以最大每秒一個(gè)的速度產(chǎn)生新的子進(jìn)程。此參數(shù)不要設(shè)的太大。
MaxSpareServers 空閑子進(jìn)程的最大數(shù)量,默認(rèn)10;如果當(dāng)前有超過(guò)MaxSpareServers數(shù)量的空閑子進(jìn)程,那么父進(jìn)程會(huì)殺死多余的子進(jìn)程。次參數(shù)也不需要設(shè)置太大,如果你將其設(shè)置比MinSpareServers 小,Apache會(huì)自動(dòng)將其修改為MinSpareServers +1的數(shù)量。
MaxRequestWorkers 限定服務(wù)器同一時(shí)間內(nèi)客戶端最大接入的請(qǐng)求數(shù)量,默認(rèn)是256;任何超過(guò)了MaxRequestWorkers限制的請(qǐng)求都要進(jìn)入等待隊(duì)列,一旦一個(gè)個(gè)連接被釋放,隊(duì)列中的請(qǐng)求才將得到服務(wù),如果要增大這個(gè)數(shù)值,必須先增大ServerLimit。在Apache2.3.1版本之前這參數(shù)MaxRequestWorkers被稱為MaxClients。
MaxConnectionsPerChild 每個(gè)子進(jìn)程在其生命周期內(nèi)允許最大的請(qǐng)求數(shù)量,如果請(qǐng)求總數(shù)已經(jīng)達(dá)到這個(gè)數(shù)值,子進(jìn)程將會(huì)結(jié)束,如果設(shè)置為0,子進(jìn)程將永遠(yuǎn)不會(huì)結(jié)束。在Apache2.3.9之前稱之為MaxRequestsPerChild。
這里建議設(shè)置為非零,注意原因:
1)能夠防止(偶然的)內(nèi)存泄漏無(wú)限進(jìn)行,從而耗盡內(nèi)存。
2)給進(jìn)程一個(gè)有限壽命,從而有助于當(dāng)服務(wù)器負(fù)載減輕的時(shí)候減少活動(dòng)進(jìn)程的數(shù)量(重生的機(jī)會(huì))。
2、Worker MPM
和prefork模式相比,worker使用了多進(jìn)程和多線程的混合模式,worker模式也同樣會(huì)先預(yù)派生一些子進(jìn)程,然后每個(gè)子進(jìn)程創(chuàng)建一些線程,同時(shí)包括一個(gè)監(jiān)聽線程,每個(gè)請(qǐng)求過(guò)來(lái)會(huì)被分配到一個(gè)線程來(lái)服務(wù)。線程比起進(jìn)程會(huì)更輕量,因?yàn)榫€程是通過(guò)共享父進(jìn)程的內(nèi)存空間,因此,內(nèi)存的占用會(huì)減少一些,在高并發(fā)的場(chǎng)景下會(huì)比prefork有更多可用的線程,表現(xiàn)會(huì)更優(yōu)秀一些;另外,如果一個(gè)線程出現(xiàn)了問(wèn)題也會(huì)導(dǎo)致同一進(jìn)程下的線程出現(xiàn)問(wèn)題,如果是多個(gè)線程出現(xiàn)問(wèn)題,也只是影響Apache的一部分,而不是全部。由于用到多進(jìn)程多線程,需要考慮到線程的安全了,在使用keep-alive長(zhǎng)連接的時(shí)候,某個(gè)線程會(huì)一直被占用,即使中間沒(méi)有請(qǐng)求,需要等待到超時(shí)才會(huì)被釋放(該問(wèn)題在prefork模式下也存在)。
圖片描述
如何配置在Apache的配置文件httpd.conf的配置方式:
StartServers 3 ServerLimit 16 MinSpareThreads 75 MaxSpareThreads 250 ThreadsPerChild 25 MaxRequestWorkers 400 MaxConnectionsPerChild 1000
配置參數(shù)解釋:
StartServers 服務(wù)器啟動(dòng)時(shí)建立的子進(jìn)程數(shù)量,在workers模式下默認(rèn)是3.
ServerLimit 系統(tǒng)配置的最大進(jìn)程數(shù)量,默認(rèn)不顯示,自己添加上
MinSpareThreads 空閑子進(jìn)程的最小數(shù)量,默認(rèn)75
MaxSpareThreads 空閑子進(jìn)程的最大數(shù)量,默認(rèn)250
ThreadsPerChild 每個(gè)子進(jìn)程產(chǎn)生的線程數(shù)量,默認(rèn)是64
MaxRequestWorkers / MaxClients 限定服務(wù)器同一時(shí)間內(nèi)客戶端最大接入的請(qǐng)求數(shù)量.
MaxConnectionsPerChild 每個(gè)子進(jìn)程在其生命周期內(nèi)允許最大的請(qǐng)求數(shù)量,如果請(qǐng)求總數(shù)已經(jīng)達(dá)到這個(gè)數(shù)值,子進(jìn)程將會(huì)結(jié)束,如果設(shè)置為0,子進(jìn)程將永遠(yuǎn)不會(huì)結(jié)束。在Apache2.3.9之前稱之為MaxRequestsPerChild。
這里建議設(shè)置為非零,注意原因:
1)能夠防止(偶然的)內(nèi)存泄漏無(wú)限進(jìn)行,從而耗盡內(nèi)存;
2)給進(jìn)程一個(gè)有限壽命,從而有助于當(dāng)服務(wù)器負(fù)載減輕的時(shí)候減少活動(dòng)進(jìn)程的數(shù)量(重生的機(jī)會(huì))。
Worker模式下所能同時(shí)處理的請(qǐng)求總數(shù)是由子進(jìn)程總數(shù)乘以ThreadsPerChild值決定的,應(yīng)該大于等于MaxRequestWorkers。
如果負(fù)載很大,現(xiàn)有的子進(jìn)程數(shù)不能滿足時(shí),控制進(jìn)程會(huì)派生新的子進(jìn)程。默認(rèn)ServerLimit 最大的子進(jìn)程總數(shù)是16,加大時(shí)也需要顯式聲明ServerLimit(最大值是20000)。
需要注意的是,如果顯式聲明了ServerLimit,那么它乘以 MaxRequestWorkers必須是hreadsPerChild的整數(shù)倍,否則 Apache將會(huì)自動(dòng)調(diào)節(jié)到一個(gè)相應(yīng)值。
3、Event MPM
這是Apache最新的工作模式,它和worker模式很像,不同的是在于它解決了keep-alive長(zhǎng)連接的時(shí)候占用線程資源被浪費(fèi)的問(wèn)題,在event工作模式中,會(huì)有一些專門的線程用來(lái)管理這些keep-alive類型的線程,當(dāng)有真實(shí)請(qǐng)求過(guò)來(lái)的時(shí)候,將請(qǐng)求傳遞給服務(wù)器的線程,執(zhí)行完畢后,又允許它釋放。這增強(qiáng)了在高并發(fā)場(chǎng)景下的請(qǐng)求處理。
圖片描述
如何配置在Apache的配置文件httpd.conf的配置方式:
StartServers 3 ServerLimit 16 MinSpareThreads 75 MaxSpareThreads 250 ThreadsPerChild 25 MaxRequestWorkers 400 MaxConnectionsPerChild 1000
event 模式與 worker 模式完全一樣,參考 worker 模式參數(shù)即可,這里不再重復(fù)。
Apache httpd 能更好的為有特殊要求的站點(diǎn)定制。
例如,要求更高伸縮性的站點(diǎn)可以選擇使用線程的 MPM,即 worker 或 event; 需要可靠性或者與舊軟件兼容的站點(diǎn)可以使用 prefork。
常見問(wèn)題
查看apache的error日志,可以發(fā)現(xiàn)許多系統(tǒng)運(yùn)行中的問(wèn)題。
server reached MaxRequestWorkers setting
[mpm_prefork:error] [pid 1134] AH00161: server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting
進(jìn)程或者線程數(shù)目達(dá)到了MaxRequestWorkers,可以考慮增加這個(gè)值,當(dāng)然先考慮增加硬件,如內(nèi)存大小、CPU、SSD硬盤等。
scoreboard is full
[mpm_event:error] [pid 7555:tid 140058436118400] AH00485: scoreboard is full, not at MaxRequestWorkers
這個(gè)問(wèn)題好像是apache2自帶的bug,我們無(wú)力解決。好在這個(gè)問(wèn)題一般只會(huì)影響單個(gè)線程,所以暫時(shí)可以忍。
StackOverflow: Scoreboard is full,not at MaxRequestWorkers
1、I had this same problem. I tried different Apache versions and MPMs. I seem to get this alot with MPM Worker. Also error does not reoccur using Apache 2.2.2,Are you using cPanel? IF so try /upcp --force and increase StartServers to a higher amount like 50 as that"s all I did to get this error away.
2、Try EnableMMAP Off in 00_default_settings.conf
apache 主要版本有:
Version 2.4 (Current)
Version 2.2 (Historical)
Version 2.0 (Historical)
Version 1.3 (Historical)
參考:https://httpd.apache.org/docs/
關(guān)于 Apache 配置優(yōu)化,請(qǐng)參見米撲博客:Apache 服務(wù)器負(fù)載低訪問(wèn)慢的原因分析和優(yōu)化方案
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/40269.html
摘要:的三種工作模式服務(wù)器目前一共有三種穩(wěn)定的,多進(jìn)程處理模塊模式。模式下所能同時(shí)處理的請(qǐng)求總數(shù)是由子進(jìn)程總數(shù)乘以值決定的,應(yīng)該大于等于。默認(rèn)最大的子進(jìn)程總數(shù)是,加大時(shí)也需要顯式聲明最大值是。 Apache 的三種工作模式(Prefork、Worker、Event) Web服務(wù)器Apache目前一共有三種穩(wěn)定的MPM(Multi-Processing Module,多進(jìn)程處理模塊)模式。 它...
1.Apache prefork模型:apache的默認(rèn)的模型預(yù)派 生模式,有 一個(gè)主控制進(jìn)程,然后 生成多個(gè) 子進(jìn)程,使 用select模型,最 大并發(fā)1024,每個(gè) 子進(jìn)程有 一個(gè)獨(dú) 立的線程響應(yīng) 用戶請(qǐng)求,相對(duì) 比較占 用內(nèi)存,但是 比較穩(wěn)定,可以設(shè)置最 大和最 小進(jìn)程數(shù),是最古 老 的 一種模式,也是最穩(wěn)定的模式,適 用于訪問(wèn)量 不 是很 大的場(chǎng)景。優(yōu)點(diǎn):穩(wěn)定缺點(diǎn): 大量 用戶訪問(wèn)慢,占...
摘要:全稱是多道處理模塊我們都知道是以模塊化方式設(shè)計(jì)的那么用來(lái)決定如何處理用戶請(qǐng)求的是通過(guò)一個(gè)進(jìn)程處理一個(gè)請(qǐng)求還是一個(gè)線程處理一個(gè)請(qǐng)求當(dāng)前有三種可以選擇的方式雖然有以上三種方式但是要注意在任何時(shí)間必須有一個(gè)而且只能有一個(gè)被使用那么下面就介紹一下這 MPM全稱是多道處理模塊,我們都知道apache是以模塊化方式設(shè)計(jì)的.那么MPM用來(lái)決定apache如何處理用戶請(qǐng)求的.是通過(guò)一個(gè)進(jìn)程處理一個(gè)請(qǐng)...
摘要:全稱是多道處理模塊我們都知道是以模塊化方式設(shè)計(jì)的那么用來(lái)決定如何處理用戶請(qǐng)求的是通過(guò)一個(gè)進(jìn)程處理一個(gè)請(qǐng)求還是一個(gè)線程處理一個(gè)請(qǐng)求當(dāng)前有三種可以選擇的方式雖然有以上三種方式但是要注意在任何時(shí)間必須有一個(gè)而且只能有一個(gè)被使用那么下面就介紹一下這 MPM全稱是多道處理模塊,我們都知道apache是以模塊化方式設(shè)計(jì)的.那么MPM用來(lái)決定apache如何處理用戶請(qǐng)求的.是通過(guò)一個(gè)進(jìn)程處理一個(gè)請(qǐng)...
閱讀 1961·2021-11-15 17:58
閱讀 2141·2021-10-19 11:45
閱讀 3511·2021-09-02 15:40
閱讀 2606·2021-07-25 10:50
閱讀 3758·2019-08-30 15:56
閱讀 3158·2019-08-30 12:44
閱讀 1040·2019-08-26 13:38
閱讀 1883·2019-08-23 18:29