《Apache 里的 MPM 調(diào)優(yōu)比較》要點(diǎn):
本文介紹了Apache 里的 MPM 調(diào)優(yōu)比較,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
MPM 是 Apache 2 引入的一個(gè)概念,就是結(jié)構(gòu)模塊化.把核心任務(wù)處理作為一個(gè)可插拔的模塊,即多路處理模塊(MPM),使其能針對(duì)不同的環(huán)境進(jìn)行優(yōu)化.在編譯apache時(shí)必須選擇也只能選擇一個(gè) MPM,對(duì)類(lèi) UNIX 系統(tǒng),有幾個(gè)不同的 MPM 可供選擇,它們會(huì)影響到 apache 的速度和可伸縮性.
那么有多少種MPM呢?
大致有:prefork MPM、worker MPM、BeOS MPM、NetWare MPM、OS/2 MPM、WinNT MPM.
怎么知道apache當(dāng)前用的是哪個(gè)MPM?
linux及windows下都可以使用命令:“httpd -l ” 進(jìn)行查詢.
各個(gè)MPM是怎么工作的?
Prefork MPM
這個(gè)多路處理模塊(MPM)實(shí)現(xiàn)了一個(gè)非線程型的、預(yù)派生的 web 服務(wù)器,它的工作方式類(lèi)似于 Apache 1.3.它適合沒(méi)有線程安全庫(kù),需要避免線程兼容性問(wèn)題的系統(tǒng).它是要求每個(gè)哀求相互獨(dú)立的情況下最好的 MPM,這樣若是一個(gè)哀求出現(xiàn)問(wèn)題就不會(huì)影響到其它哀求.
這個(gè)MPM具有很強(qiáng)的自我調(diào)節(jié)能力,只需要很少的配置指令調(diào)整.最重要的是將 MaxClients 設(shè)置為一個(gè)足夠大的數(shù)值以處理潛在的哀求高峰,同時(shí)又不能太大,以致需要使用的內(nèi)存超出物理內(nèi)存的大小.
Worker MPM
此多路處理模塊(MPM)使網(wǎng)絡(luò)服務(wù)器支持混合的多線程多進(jìn)程.由于使用線程來(lái)處理哀求,所以可以處理海量哀求,而系統(tǒng)資源的開(kāi)銷(xiāo)小于基于進(jìn)程的 MPM .但是,它也使用了多進(jìn)程,每個(gè)進(jìn)程有多個(gè)線程,以獲得基于進(jìn)程的 MPM 的穩(wěn)定性.
每個(gè)進(jìn)程可以擁有的線程數(shù)量是固定的.服務(wù)器會(huì)根據(jù)負(fù)載情況增加或減少進(jìn)程數(shù)量.一個(gè)單獨(dú)的控制進(jìn)程(父進(jìn)程)負(fù)責(zé)子進(jìn)程的建立.每個(gè)子進(jìn)程可以建立 ThreadsPerChild 數(shù)量的服務(wù)線程和一個(gè)監(jiān)聽(tīng)線程,該監(jiān)聽(tīng)線程監(jiān)聽(tīng)接入哀求并將其傳遞給服務(wù)線程處理和應(yīng)答.
不管是 Worker 模式或是 Prefork 模式,Apache 總是試圖保持一些備用的(spare)或者空閑的子進(jìn)程(空閑的服務(wù)線程池)用于迎接即將到來(lái)的哀求.這樣客戶端就不需要在得到服務(wù)前等候子進(jìn)程的產(chǎn)生.
Event MPM
以上兩種穩(wěn)定的 MPM 方式在非常繁忙的服務(wù)器引用下都有些不足.盡管 HTTP 的 keepalive 方式能減少 TCP 連接數(shù)和網(wǎng)絡(luò)負(fù)載,但是 keepalive 需要和服務(wù)進(jìn)程或者線程綁定,這就導(dǎo)致一個(gè)繁忙的服務(wù)器會(huì)耗光所有線程.Event MPM 是解決這個(gè)問(wèn)題的一種新模型,它把服務(wù)進(jìn)程從連接中分離出來(lái).在服務(wù)器處理速度很快,同時(shí)具有非常高的點(diǎn)擊率時(shí),可用的線程數(shù)量就是關(guān)鍵的資源限制,此時(shí) Event MPM 方式是最有效的.一個(gè)以 Worker MPM 方式工作的繁忙服務(wù)器能夠承受每秒好幾萬(wàn)次的訪問(wèn)量,而 Event MPM 可以用來(lái)處理更高負(fù)載.值得注意的是,Event MPM 不能在安全HTTP(HTTPS)訪問(wèn)下工作.
對(duì)于 Event 模式,apache 給予了以下警告:
This MPM is experimental,so it may or may not work as expected.
這種 MPM 目前處于實(shí)驗(yàn)階段,它可能不能按照預(yù)期的那樣工作.
各個(gè)MPM是應(yīng)該如何優(yōu)化?
prefork MPM
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
1.prefork 控制進(jìn)程在最初建立 StartServers 個(gè)子進(jìn)程
2.為了滿足 MinSpareServers 設(shè)置的需要?jiǎng)?chuàng)建一個(gè)進(jìn)程,等待一秒,繼續(xù)創(chuàng)建兩個(gè),再等待一秒,繼續(xù)創(chuàng)建四個(gè)……如此按指數(shù)級(jí)增加創(chuàng)建的進(jìn)程數(shù)直到滿足 MinSpareServers 設(shè)置的值為止
3.MaxSpareServers 設(shè)置了最大的空閑進(jìn)程數(shù),如果空閑進(jìn)程數(shù)大于這個(gè)值,Apache 會(huì)自動(dòng) kill 掉一些多余進(jìn)程.這個(gè)值不要設(shè)置過(guò)大,如果設(shè)置比 MinSpareServers 小,Apache 會(huì)自動(dòng)將其調(diào)整為 MinApareServers+1.如果站點(diǎn)負(fù)載較大,可考慮同時(shí)加大 MinSpareServers 和 MaxSpareServers.
4.Apache 2.3.13 后MaxClients被稱(chēng)為 MaxRequestsWorkers.MaxClients是這些指令中最為重要的一個(gè),設(shè)定的是 Apache 可以同時(shí)處理的哀求,是對(duì) Apache 性能影響最大的參數(shù).如果哀求總數(shù)已達(dá)到這個(gè)值,那么后面的哀求就要排隊(duì),直到某個(gè)已處理哀求完畢.這就是系統(tǒng)資源剩下很多而 HTTP 訪問(wèn)卻很慢的原因.雖然理論上這個(gè)值越大,可以處理的哀求就越多,但 Apache 默認(rèn)的限制不能大于256.
5.MaxRequestsPerChild 設(shè)置的是每個(gè)子進(jìn)程可以處理的哀求數(shù).每個(gè)子進(jìn)程在處理了 MaxRequestsPerChild 個(gè)哀求后將自動(dòng)銷(xiāo)毀.0意味著無(wú)限,即永不銷(xiāo)毀.雖然缺省設(shè)為0可以使每個(gè)子進(jìn)程處理更多的哀求,但如果設(shè)置為非0也有兩點(diǎn)重要的好處:
1.可防止意外的內(nèi)存泄漏
2.在服務(wù)器負(fù)載下降的時(shí)候會(huì)自動(dòng)減少子進(jìn)程數(shù)
因此,可根據(jù)服務(wù)器的負(fù)載來(lái)調(diào)整這個(gè)值.
worker MPM
<IfModule mpm_worker_module>
StartServers 2
MaxClients 150
MinSpareThreads 50
MaxSpareThreads 200
ThreadsPerChild 100
MaxRequestsPerChild 0
</IfModule>
1.啟動(dòng)時(shí)建立 StartServers 個(gè)子進(jìn)程,每個(gè)子進(jìn)程包含ThreadsPerChild個(gè)線程,缺省最大64.ThreadsPerChild 是 worker MPM 中與性能相關(guān)最密切的指令,如果負(fù)載較大,64也是不夠的,這時(shí)要顯示使用ThreadLimit 指令,它的最大缺省值是20000.
2.為了不在哀求到來(lái)時(shí)再產(chǎn)生線程,MinSpareThreads 和 MaxSpareThreads 設(shè)置了最小和最大的空閑線程數(shù),缺省值分別是75和250.這兩個(gè)參數(shù)對(duì)Apache的性能影響并不大,可以按照實(shí)際情況相應(yīng)調(diào)節(jié).
3.MaxClients 設(shè)置了同時(shí)連入的 clients 最大總數(shù),如果現(xiàn)有子進(jìn)程中的線程總數(shù)不能滿足負(fù)載,控制進(jìn)程將派生新的子進(jìn)程.
work 模式下所能同時(shí)處理的哀求總數(shù)是由子進(jìn)程總數(shù)乘以 ThreadsPerChild 值決定的,應(yīng)該大于等于 MaxClients.如果負(fù)載很大,現(xiàn)有的子進(jìn)程數(shù)不能滿足時(shí),控制進(jìn)程會(huì)派生新的子進(jìn)程.默認(rèn)最大的子進(jìn)程總數(shù)是16,加大時(shí)也需要顯式使用 ThreadLimit 指令,它的最大缺省值是20000.需要注意的是,如果顯式聲明了 ServerLimit,那么它乘以 ThreadsPerChild 的值必須大于等于 MaxClients,而且 MaxClients 必須是 ThreadsPerChild 的整數(shù)倍,否則 Apache 將會(huì)自動(dòng)調(diào)節(jié)到一個(gè)相應(yīng)值.
維易PHP培訓(xùn)學(xué)院每天發(fā)布《Apache 里的 MPM 調(diào)優(yōu)比較》等實(shí)戰(zhàn)技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養(yǎng)人才。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/13463.html