Apache多路復(fù)用模塊(MPMs)介紹
當(dāng)整個(gè)世界都慢慢傾向于nginx的時(shí)候,如果你還在使用apache,那么你可能會(huì)用盡一切辦法來(lái)保證速度。你也許會(huì)調(diào)整要加載的模塊,使用Keepalive、擺弄內(nèi)容協(xié)商模塊(mod_negotiation,譯注:從幾個(gè)文檔中選擇一個(gè)最匹配客戶端要求的文檔)、FollowSymLinks指令(譯注:允許在此目錄中使用軟鏈接)以及重寫功能;你甚至可能還會(huì)投入更多硬件,并假裝自己沒有。然而,如果你運(yùn)營(yíng)的網(wǎng)站非常繁忙而不想因?yàn)閮?nèi)存的原因而導(dǎo)致網(wǎng)站崩潰,那么你就應(yīng)該關(guān)注你所使用的MPM。
MPM,也叫多道處理模塊(Multi Processing Module),關(guān)系到真?zhèn)€HTTP會(huì)話。從網(wǎng)絡(luò)上的監(jiān)聽、請(qǐng)求進(jìn)入到最重要的--如何處理子請(qǐng)求,這里我們討論的是子進(jìn)程及子線程。對(duì)于unix系統(tǒng)的機(jī)器來(lái)說(shuō)Apache提供了3種MPM以供選擇:; Prefork, Worker, and Event。同時(shí),只對(duì)其他系統(tǒng)Apache也提供了許多其他種類的MPM,但是我們這里主要關(guān)注最常見的,可能也是你最想看到的(也是我最擅長(zhǎng)的)。這些MPM處理Apache服務(wù)器用來(lái)接受、處理以及服務(wù)器HTTP請(qǐng)求過(guò)程中的進(jìn)程和潛在線程。
從不嚴(yán)格的角度來(lái)看,進(jìn)程是一個(gè)程序的實(shí)例。每個(gè)進(jìn)程是完全自包含的,并且在地址空間、變量、內(nèi)存等方面和其他進(jìn)程是完全獨(dú)立、隔離開來(lái)執(zhí)行的。為了理解本文目的和內(nèi)容,你可以思考一下下面這句話:5個(gè)Apache進(jìn)程表示運(yùn)行著5個(gè)不同的Apache實(shí)例。雖然這是相當(dāng)值得警告的做法,但是這足以安全的記住本文的目的。
換句話說(shuō),一個(gè)線程被一個(gè)進(jìn)程創(chuàng)建并擁有。一個(gè)進(jìn)程可以有多個(gè)線程,這些線程并不是完全獨(dú)立的。它們共享進(jìn)程為它們分配的同一個(gè)狀態(tài)以及地址空間。
總之,進(jìn)程是程序的一個(gè)實(shí)例,它被用來(lái)告訴整個(gè)系統(tǒng)它的存在以及需要資源并且可以執(zhí)行他自己的資源;線程只有被進(jìn)程創(chuàng)建以后才能真正執(zhí)行一些東西。因此,線程不需要發(fā)布自己而是由整個(gè)應(yīng)用如進(jìn)程來(lái)做,而且線程本質(zhì)上使用更少的系統(tǒng)資源如內(nèi)存。
Apache Prefork MPM
Prefork多處理模塊是非線程的。它完全不使用線程,使用整個(gè)進(jìn)程用來(lái)處理每個(gè)HTTP請(qǐng)求。當(dāng)一個(gè)HTTP請(qǐng)求傳入,假設(shè)是用來(lái)請(qǐng)求你加貓咪的圖片,那么整個(gè)進(jìn)程都會(huì)去該請(qǐng)求捆綁而且為這個(gè)人的請(qǐng)求負(fù)責(zé)。如果在同一時(shí)間有其他人來(lái)瀏覽你家貓咪的圖片,那么另一個(gè)完全不同的進(jìn)程會(huì)被使用。
Prefork在快速和穩(wěn)定性方面很好。Prefork只有輕微的邊緣響應(yīng)時(shí)間,這是因?yàn)樗恍枰幚碓谒M(jìn)程中的不同線程;同時(shí)在一個(gè)特定的請(qǐng)求發(fā)生錯(cuò)誤的情況下它也是穩(wěn)定的,因?yàn)檎麄€(gè)進(jìn)程只是由一個(gè)請(qǐng)求決定,而其他請(qǐng)求是由另外的進(jìn)程來(lái)處理,所以其他請(qǐng)求不受影響。
Prefork也適用于如果你所使用的apache模塊不能處理線程的情況。最常見的是mod_php模塊(盡管它的最新努力方向是ZTS)。你可能在使用PHP以及/或者一些不能被Apache所處理的腳本時(shí)會(huì)遇到這個(gè)問(wèn)題,但是有一些腳本除外如php-fpm。
但是,如果你需要處理大量的并發(fā)請(qǐng)求,這種方式會(huì)瘋狂"吃掉"系統(tǒng)資源。請(qǐng)注意,每個(gè)進(jìn)程都會(huì)作為一個(gè)完整的Apache實(shí)例來(lái)發(fā)布自己。這意味著它會(huì)加載所有模塊,而且對(duì)每個(gè)請(qǐng)求來(lái)說(shuō)都是一個(gè)完整的web服務(wù)器。如果請(qǐng)求數(shù)非常大,而由于協(xié)調(diào)器需要發(fā)布與請(qǐng)求數(shù)相同的進(jìn)程來(lái)處理這些請(qǐng)求,這會(huì)很快迫使內(nèi)存使用率達(dá)到極限。
Apache Worker MPM
Work多路復(fù)用模塊會(huì)使用線程,它在高并發(fā)時(shí)在內(nèi)存使用方面處理的很好。在多路復(fù)用模塊中,需要的進(jìn)程數(shù)較少,因?yàn)樗幌隤refork那樣需要為每個(gè)請(qǐng)求創(chuàng)建一個(gè)進(jìn)程,Worker模式會(huì)在進(jìn)程中創(chuàng)建線程,請(qǐng)求進(jìn)入的連接通過(guò)一個(gè)進(jìn)程中的不同線程來(lái)處理。Worker模式中,新的連接只需要等待空閑的線程即可,而不是像Prefork中那樣需要等待空閑進(jìn)程。
Apache Event MPM
Event模式是非常新的。事實(shí)上,它只在Apache2.4版本中被作為穩(wěn)定版發(fā)布。Event模式和Worker模式工作原理相同,它也是使用進(jìn)程和線程。它們最大的區(qū)別在與Event模式會(huì)為每個(gè)請(qǐng)求創(chuàng)建一個(gè)線程,而不是為一個(gè)HTTP連接創(chuàng)建一個(gè)線程。
有一種情況那就是當(dāng)你喜歡使用線程但是有一個(gè)應(yīng)用程序,這個(gè)應(yīng)用程序使用了較長(zhǎng)的keepalive超時(shí)時(shí)間時(shí)這種模式很適用。在Worker MPM中,線程是和連接綁定的,并且無(wú)論http請(qǐng)求是否被處理都保持被占用狀態(tài)。
在Event MPM中,如果處理連接的線程只是用來(lái)處理當(dāng)前請(qǐng)求并且會(huì)在請(qǐng)求處理完成后立即釋放,不管被父進(jìn)程處理的HTTP連接的情況。同時(shí),當(dāng)線程在請(qǐng)求被處理完成立即釋放后可以被用來(lái)處理其他請(qǐng)求。這意味著需要更少的線程!
我怎么處理這些信息?
既然如此,你該使用哪一種?在我看來(lái),以我最忠誠(chéng)的忠告,每個(gè)人都應(yīng)該使用Worker MPM,因?yàn)樗诓l(fā)方面相當(dāng)出色而且對(duì)RAM內(nèi)存的使用較少,雖然如果在兼容性上有問(wèn)題,你可能需要切換回Prefork。
如果你使用的是最新版本的Apache,你可以嘗試使用Event MPM。
如果是用的是PHP,那么使用Worker MPM或者Event MPM時(shí)必須使用php-fpm。如果你在Worker模式下使用了mod_php那么你的應(yīng)用可能會(huì)在這樣或那樣的表單中出錯(cuò)。實(shí)際上,這時(shí)你也許應(yīng)該使用的php-fpm,不論apache在何種MPM模式下。
相關(guān)文章
Centos下升級(jí)Python及Mongodb驅(qū)動(dòng)安裝問(wèn)題
查看python的版本 python -V 如果是2.7以下版本就需要升級(jí)了。這篇文章主要介紹了Centos下升級(jí)Python及Mongodb驅(qū)動(dòng)安裝,需要的朋友可以參考下2019-11-11Wampserver2.5配置虛擬主機(jī)出現(xiàn)403 Forbidden的處理方案
WampServer是一款由法國(guó)人開發(fā)的Apache Web服務(wù)器、PHP解釋器以 及MySQL數(shù)據(jù)庫(kù)的整合軟件包。免去了開發(fā)人員將時(shí)間花費(fèi)在繁瑣的配置環(huán)境過(guò)程,從而騰出更多精力去做開發(fā)。在windows下將Apache+PHP+Mysql 集成環(huán)境,擁有簡(jiǎn)單的圖形和菜單安裝和配置環(huán)境。2014-09-09linux獲取進(jìn)程執(zhí)行時(shí)間方法示例
linux獲取進(jìn)程執(zhí)行時(shí)間有兩種方法可以獲取,第一種是用time命令,time 進(jìn)程。第二種是通過(guò)在程序中進(jìn)行記錄,首先利用sysconf函數(shù)獲取時(shí)鐘滴答數(shù),再用times獲取tms結(jié)構(gòu),詳細(xì)看下面的示例代碼2013-12-12Ubuntu16.04 ext4格式硬盤掛載普通用戶權(quán)限控制的操作方法
這篇文章主要介紹了Ubuntu16.04 ext4格式硬盤掛載普通用戶權(quán)限控制的操作方法,需要的朋友可以參考下2018-06-06linux VPS主機(jī)上備份網(wǎng)站和數(shù)據(jù)庫(kù)的方法
現(xiàn)在看到越來(lái)越多的VPSer開始使用VPS,在使用VPS的時(shí)候一個(gè)很重要的任務(wù)就是VPS提供備份,雖然一些IDC也提供VPS的備份服務(wù),但要不就是收費(fèi),都不太適合我們這些VPSer們使用。2010-12-12淺析centos 7 自帶的 php 5.4升級(jí)為 5.6的方法
這篇文章主要介紹了centos 7 自帶的 php 5.4升級(jí)為 5.6的方法,需要的朋友可以參考下2018-12-12Ubuntu系統(tǒng)下擴(kuò)展LVM根目錄的方法
這篇文章主要給大家介紹了關(guān)于Ubuntu系統(tǒng)下擴(kuò)展LVM根目錄的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05