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