apache的三種mpm模式
穩定的模式有prefork worker event,編譯的時候,可以用configure的引數指定 --with-mpm = prefork | worker | event , 也可以編譯為3種都支援, --enable-mpmx-shared = all
1)prefork模式: 傳統文件,就是在apache啟動的時候,就預先fork一些子程序,然後等待請求進來,這樣可以減少頻繁建立和銷燬程序的開銷,每個子程序有一個執行緒,在一個時間點只能處理一個請求
優點:成熟穩定,相容所有老的模組,同時無需擔心執行緒安全問題
缺點:一個程序佔用想多更多的系統資源,消耗更多的記憶體,不擅長處理高併發的請求,它會把請求放進佇列,一直等到有可用程序,請求才會被處理
2)worker模式:使用多程序和多執行緒混合,也是預選fork處幾個子程序,然後每個子程序建立一些執行緒,同時包括一個監聽執行緒每個請求進來,會被分配到一個執行緒來服務,高併發時有更多的執行緒可以使用
那為什麼還要多程序呢 ?如果一個縣城掛掉,會導致父程序連同其它正常的子執行緒都掛掉,為了防止這種情況出現就不能全部使用執行緒,使用多個程序加多程序,若某個執行緒出現異常,受影響的只是apache的一部分服務,而不是所有
優點:佔用更少的記憶體,該併發時表現優秀
缺點:必須考慮執行緒安全問題,因為多個子程序時共享父程序的記憶體地址的,若使用keep-alive的長連線方式,某個執行緒一直佔據,也許中間沒有情趣,也需要等到超時才會被釋放,若過多的執行緒被佔用,會導致高併發時無服務執行緒可用
3)event模式:類似worker,會有一個專門的執行緒管理這些keep-alive型別的執行緒,當有真是請求過來的時候,將請求傳遞給服務執行緒,執行完畢後又允許它釋放,增強了高併發場景下的處理能力
遇到不相容的模組時,會退回到worker模式