Apache MPM Prefork模式參數調優方法

Apache配置文件中有非常多的參數,絕大多數Apache都是運行於mpm_prefork模式下,而對prefork參數的調試至關重要。prefork模式對每個不同的請求使用不同的進程,因此能夠避免非常多的安全問題。它具有強大的自我調節能力,能夠比較智能的適應不同壓力的訪問。

調整性能參數並非紙上談兵,需要在調整的每一步都對服務器進行負載壓力測試,以確保在服務器穩定的基礎下實現最高的性能。

參數解釋

Apache的MPM配置文件主要有如下幾段:

<IfModule mpm_prefork_module>
StartServers 10
MinSpareServers 5
MaxSpareServers 15
MaxClients 200
MaxRequestsPerChild 5000
</IfModule>

其中MaxClients、MinSpareServers與MaxSpareServers是關鍵。

MaxClients決定了Apache最多創建多少個子進程用來處理請求。進一步舉例解釋,如果這個參數設置為200(如圖),則當Apache主進程收到大量請求時,會創建最多200個進程。而這200個進程用於處理這些請求。因此,無論有多少個請求,也只會有200個進程并行處理。

MaxSpareServers顧名思義是“最多空閑進程”,注意“空閑”二字。接上一個例子,當這200個進程處理完了所有的請求后,這些進程便都“空閑”了。此時Apache便會殺死一些進程以釋放資源。那麼,如上圖設置,Apache會保留最多15個空閑的進程;

MinSpareServers是“最少空閑進程”。當Apache啟動時,如果空閑的進程少於5個,則會以一定頻率創建新的進程,直到滿足這個數值(5)。這樣設計的目的是為了讓Apache更迅速的應付潛在的訪問高峰。

StartServers表示Apache在啟動的時候創建的進程數量。如果訪問壓力很大,那麼進程數會逐步增加,直到達到MaxClients設置的數量。

MaxRequestPerChild表示每個進程處理的最大請求數。當任何一個子進程處理的請求數達到MaxRequestPerChild后,便會自殺。如果MaxRequestPerChild設置為0,表示不限(即永遠不自殺)。這種機制的作用是防止潛在的內存泄露。如果Apache的某個模塊,或者某段php腳本可能導致內存泄露,而處理進程卻又永遠不退出,則很可能造成服務器內存劇增最終崩潰。當開啟這個機制后,無論是否存在內存泄露,都會讓進程在處理一定數量的請求後退出,同時釋放所有內存。

調優約束條件

MaxClients參數的最佳值在很大程度上取決於內存大小。此參數調優的目標即當Apache處在最多子進程數狀態時,服務器不會使用swap。如果此數值的設置過大,則Apache在訪問高峰期會創建過多的子進程,導致Linux使用swap來作為內存。而swap的效率非常低,並且會導致磁盤壓力增大,形成惡性循環。

如果希望Apache能在訪問非高峰期過後能夠迅速的釋放資源,則MaxSpareServers應該設置得略低,讓Apache迅速殺死過多的子進程;

如果希望Apache能夠迅速應對突如其來的訪問高峰,則應將MinSpareServers設置高一點,讓Apache創建較多的空閑(備用)進程。

而MaxRequestPerChild對性能的影響則沒有那麼明顯。如果MaxRequestPerChild設置偏小,則Apache可能會在訪問高峰期時,把大量的CPU消耗在創建/殺死進程上,造成不必要的CPU損耗。

Prefork機制

prefork 控制進程在最初建立“StartServers”個子進程后,為了滿足MinSpareServers設置的需要創建一個進程,等待一秒鐘,繼續創建兩個,再等待一秒鐘,繼續創建四個……如此按指數級增加創建的進程數,最多達到每秒32個,直到滿足MinSpareServers設置的值為止。

這種模式可以不必在請求到來時再產生新的進程,從而減小了系統開銷以增加性能。MaxSpareServers設置了最大的空閑進程數,如果空閑進程數大於這個值,Apache會自動kill掉一些多餘進程。這個值不要設得過大,但如果設的值比MinSpareServers小,Apache會自動把其調整為 MinSpareServers+1。

如果站點負載較大,可考慮同時加大MinSpareServers和MaxSpareServers。 MaxRequestsPerChild設置的是每個子進程可處理的請求數。每個子進程在處理了“MaxRequestsPerChild”個請求后將自動銷毀。

如果想查看VPS管理百科對這些參數實際VPS中設置的建議,請參考《VPS中的Apache性能調優建議

发表评论