關于Apache的三種工作模式
1、第一種Prefork MPM
多進程模式,prefork模式可以算是很古老但是非常穩(wěn)定的模式。每個子進程中只有一個線程,在一個時間點內,只能處理一個請求。
優(yōu)點:很成熟,兼容所有新老模塊。進程之間完全獨立,使得它非常穩(wěn)定。同時,不需要擔心線程安全的問題。
缺點:一個進程相對占用更多的系統(tǒng)資源,消耗更多的內存。且它不擅長處理高并發(fā)請求,在這種場景下,它會將請求放進隊列中,一直等到有可用進程,請求才會被處理。
2、第二種Worker MPM 
多進程+多線程模式。每個子進程能夠生成一些服務線程和一個監(jiān)聽線程,該監(jiān)聽線程監(jiān)聽接入請求并將其傳遞給服務線程處理和應答。線程比起進程會更輕量,因為線程通常會共享父進程的內存空間,因此,內存的占用會減少一些,在高并發(fā)的場景下,表現得比 prefork模式好。
考慮到穩(wěn)定性,若掛了一個線程,會導致父進程連同其他正常的子線程都掛了。在多進程+多線程模式中,各個進程之間都是獨立的,如果某個線程出現異常,受影響的只是Apache的一部分服務,而不是整個服務。其他進程仍然可以工作。
優(yōu)點:占據更少的內存,高并發(fā)下表現更優(yōu)秀。
缺點:必須考慮線程安全的問題,因為多個子線程是共享父進程的內存地址的。如果使用keep-alive的長連接方式,也許中間幾乎沒有請求,這時就會發(fā)生阻塞,線程被掛起,需要一直等待到超時才會被釋放。如果過多的線程,被這樣占據,也會導致在高并發(fā)場景下的無服務線程可用。
3、第三種Event MPM 
多進程+多線程+epoll。現已成為穩(wěn)定可用的模式,它和 worker模式很像,最大的區(qū)別在于,它解決了 keep-alive 場景下 ,長期被占用的線程的資源浪費問題。