Apache并发处理模块
apache 2.x版本目前有好幾種并發處理模塊, 需要在編譯的時候通過–with-mpm=xxx指定,常用的并發處理模式是prefork和worker。prefork這種模式比較古老,純進程并發,沒有線程,處理方式跟apache1.x是一樣的,適用于那些沒有線程庫或者不想使用線程的服務器;worker是多進程多線程的模式,在worker模式下,有一個唯一的父進程(控制進程),這個父進程會根據需要生成若干子進程,每個子進程會有一個監聽線程和若干個服務線程(每個子進程的服務線程數目都是固定的,由ThreadsPerChild指定),監聽線程負責監聽客戶端請求并把它們交給服務線程處理。理論上worker模式的性能會比prefork模式優秀,處理同樣多的請求的時候占用的資源會比prefork少。
按照官方文檔說法:
The server can be better customized for the needs of the particular site. For example, sites that need a great deal of scalability can choose to use a threaded MPM like?worker?or?event, while sites requiring stability or compatibility with older software can use a?prefork.
worker
This Multi-Processing Module (MPM) implements a hybrid multi-process multi-threaded server. By using threads to serve requests, it is able to serve a large number of requests with fewer system resources than a process-based server. However, it retains much of the stability of a process-based server by keeping multiple processes available, each with many threads.
prefork
This Multi-Processing Module (MPM) implements a non-threaded, pre-forking web server that handles requests in a manner similar to Apache 1.3. It is appropriate for sites that need to avoid threading for compatibility with non-thread-safe libraries. It is also the best MPM for isolating each request, so that a problem with a single request will not affect any other.
worker模塊的配置參數:
| ThreadsPerChild | 每個子進程的服務線程數目 | 默認值25 |
| StartServers | apache啟動的時候就開啟的子進程數 | 默認值3 |
| MinSpareThreads | 最小空閑線程數 | 默認值75 |
| MaxSpareThreads | 最大空閑線程數,apache在運行的時候會讓總的空閑線程數保持在MinSpareThreads和MaxSpareThreads之間,這兩個參數用默認值就可以了,一般情況下沒必要去調整它們 | 默認值250 |
| MaxClients | 最大客戶端并發處理數(最大線程數),MaxClients除以ThreadsPerChild得到的值的就是最大可能達到的子進程數,如果服務器的并發請求數超過了MaxClients,那么apache會報這樣的錯誤:server reached MaxClients setting, consider raising the MaxClients setting | 默認值16*25 = 400 |
| ServerLimit | 最大進程數限制,這個參數值必須大于或等于MaxClients除以ThreadsPerChild得到的值。這個參數是硬限制,直接重啟apache(apache restart)不會生效,必須先停止apache(apache stop)再啟動apache(apache start)才生效 | worker模式下默認值是16,prefork模式則是256 |
| ThreadLimit | 每個進程的最大線程數限制,也就是說這個參數決定了ThreadsPerChild的最大值。如果這個參數設得比ThreadsPerChild大很多的話,那么會浪費掉很多共享內存。設置過大還可能會導致apache無法啟動或者系統不穩定。這個參數也是硬限制。如果要設置的話,ServerLimit和ThreadLimit必須放在其它設置的前面 | 默認值64 |
| MaxRequestsPerChild | 單個子進程在其生命周期內處理的總請求數限制,當某個子進程處理過的總請求數到達這個限制后這個進程就會被回收,如果設為0,那么這個進程永遠不會過期(這樣如果有內存泄露的話就會一直泄露下去……) |
--------------------------------------------------------
apache有三種運行模式:
1, prefork MPM;
2, worker MPM;
3, perchild MPM.
prefork MPM
管理員應選擇prefork MPM來實施基于進程的Web服務器。雖然基于進程的服務器有一些速度較慢的性能,它們通過模塊來提供穩定性和兼容性,這些模塊不支持線程。為了改進性能,服務器的父進程fork多個子進程并使它們能夠用于應答請求。當接收到請求時,服務器把其分配給子進程。如果沒有子進程可用,服務器創建新的子進程并把它添加到庫中。但是,子進程的創建會導致延遲。當配置這一MPM時,管理員可以限制啟動時可以創建的子進程數、最大的子進程數等。這一MPM有利于形成一個穩定的Apache服務器,但同時會影響性能和占用內存,因為單個進程的大小會占很大一部分。
The worker MPM
為了實施混合服務器,管理員可以選擇worker MPM,它提供比prefork MPM更卓越的可靠性、故障恢復能力和可擴展性。啟動時父進程創建規定數量的子進程,反過來每個子進程包含多個線程。每個子進程中只有一個線程聆聽網絡,它簡化了程序代碼,減少了進程之間的協作,從而提高性能。雖然這一MPM穩定且性能優于prefork,由于它是基于線程,與其一同使用的所有模塊都必須是完全的線程-安全。大多數Apache 1.3模塊不是線程安全,并且由于worker MPM不向后兼容,因此,使用這一MPM的管理員也不能一同使用Apache 1.3模塊和Apache 2.0。但是使用prefork MPM來編譯服務器允許管理員使用Apache 1.3模塊。
The perchild MPM
如果遇到這樣一種情況,考慮到安全性和性能,需要Apache進程基于不同的用戶ID來運行,管理員可以使用perchild MPM 來編譯混合服務器。互聯網服務供應商(ISP)通常使用這一MPM來實現虛擬托管。當perchild啟動時,它創建規定數量的進程,每個進程有規定數量的線程和專用的用戶ID。如果服務器上的負載增加,它使用現有進程之一來創建新線程,而不是創建新進程。這種MPM是最可擴展,但也最不可靠。
轉載于:https://www.cnblogs.com/preftest/archive/2011/06/26/2090637.html
總結
以上是生活随笔為你收集整理的Apache并发处理模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Buzz.Today]2011.06.
- 下一篇: Oracle B-Tree Index