無論是Worker模式或是Prefork 模式,Apache老是試圖保持一些備用的(spare)或者是空閒的子進程(空閒的服務線程池)用於迎接即將到來的請求。這樣客戶端就不須要在獲得服務前等候子進程的產生。服務器
event MPM 模式:併發
這個是Apache中最新的模式,在如今版本里的已是穩定可用的模式。它和worker模式很像,最大的區別在於,它解決了keep-alive場景下,長期被佔用的線程的資源浪費問題(某些線程由於被keep-alive,空掛在哪裏等待,中間幾乎沒有請求過來,甚至等到超時)。event MPM中,會有一個專門的線程來管理這些keep-alive類型的線程,當有真實請求過來的時候,將請求傳遞給服務線程,執行完畢後,又容許它釋放。這樣加強了高併發場景下的請求處理能力。高併發
Apache的httpd.conf中的配置方式:spa
<IfModule mpm_event_module>線程
StartServers 3繼承
MinSpareThreads 75進程
MaxSpareThreads 250內存
ThreadsPerChild 25資源
MaxRequestWorkers 400it
MaxConnectionsPerChild 0
</IfModule>
tartServers:初始數量的服務器進程開始
# MinSpareThreads: 最小數量的工做線程,保存備用
# MaxSpareThreads: 最大數量的工做線程,保存備用
# ThreadsPerChild: 固定數量的工做線程在每一個服務器進程
# MaxRequestWorkers: 最大數量的工做線程
# MaxConnectionsPerChild: 最大鏈接數的一個服務器進程服務
對於KeepAlive連接,只有第一個請求會被計數。事實上,他改變了每一個子進程限制最大連接數量的行爲(這個你們能理解嗎??)。
工做方式:
每一個進程可以擁有的線程數量是固定的。服務器會根據負載狀況增長或減小進程數量。一個單獨的控制進程(父進程)負責子進程的建 立。每一個子進程可以創建 ThreadsPerChild數量的服務線程和一個監聽線程,該監聽線程監聽接入請求並將其傳遞給服務線程處理和應答。Apache老是試圖維持一個備 用(spare)或是空閒的服務線程池。這樣,客戶端無須等待新線程或新進程的創建便可獲得處理。在Unix中,爲了可以綁定80端口,父進程通常都是以 root身份啓動,隨後,Apache以較低權限的用戶創建子進程和線程。User和Group指令用於配置Apache子進程的權限。雖然子進程必須對 其提供的內容擁有讀權限,但應該儘量給予他較少的特權。另外,除非使用了suexec ,不然,這些指令配置的權限將被CGI腳本所繼承。
硬限制:
ServerLimi和ThreadLimit這兩個指令決定了活動子進程數量和每一個子進程中線程數量的硬限制。要想改變這個硬限制必須徹底中止服務器而後再啓動服務器(直接重啓是不行的)。
Apache在編譯ServerLimit時內部有一個硬性的限制,您不能超越這個限制。
prefork MPM最大爲"ServerLimit 200000"
其餘MPM(包括work MPM)最大爲"ServerLimit 20000
Apache在編譯ThreadLimit時內部有一個硬性的限制,您不能超越這個限制。
mpm_winnt是"ThreadLimit 15000"
其餘MPM(包括work prefork)爲"ThreadLimit 20000
注意:
使用ServerLimit和ThreadLimit時要特別小心。假如將ServerLimit和ThreadLimit配置成一個高出實際須要許多的值,將會有過多的共享內存被分配。當配置成超過系統的處理能力,Apache可能沒法啓動,或系統將變得不穩定。