原文出處: Windows NT系統下的Apache性能優化
聲明: 可以非商業性任意轉載, 轉載時請務必以超鏈接形式標明文章原始出處、作者信息及此聲明!
一般來說,WinNT系統下使用IIS,而Apache在Linux下應用的比較多,但是依然有很多人在WinNT系統下使用Apache而非IIS,可能是基於對Windows系統的熟悉吧。今天就來說一下在Windows系統下如果優化Apache的性能。
mpm_winnt.c是專門針對Windows NT優化的MPM(多路處理模塊),它使用一個單獨的父進程產生一個單獨的子進程,在這個子進程中輪流產生多個線程來處理請求。也就是說mpm_winnt只能啓動父子兩個進程, 不能像Linux下那樣同時啓動多個進程。
mpm_winnt主要通過ThreadsPerChild和MaxRequestsPerChild兩個參數來優化Apache,下面詳細來說明一下。
ThreadsPerChild
這個參數用於設置每個進程的線程數, 子進程在啓動時建立這些線程後就不再建立新的線程了. 一方面因爲mpm_winnt不能啓動多個進程, 所以這個數值要足夠大,以便可以處理可能的請求高峯; 另一方面該參數以服務器的響應速度爲準的, 數目太大的反而會變慢。因此需要綜合均衡一個合理的數值。
mpm_winnt上的默認值是64, 最大值是1920. 這裏建議設置爲100-500之間,服務器性能高的話值大一些,反之值小一些。
MaxRequestsPerChild
該參數表示每個子進程能夠處理的最大請求數, 即同時間內子進程數目.設置爲零表示不限制, mpm_winnt上的默認值就是0.
官方參考手冊中不建議設置爲0, 主要基於兩點考慮: (1) 可以防止(偶然的)內存泄漏無限進行,從而耗盡內存; (2) 給進程一個有限壽命,從而有助於當服務器負載減輕的時候減少活動進程的數量。
因此這個參數的值更大程度上取決於服務器的內存,如果內存比較大的話可以設置爲0或很大的數字,否則設置一個小的數值。需要說明的是,如果這個值設置的太小的話會造成Apache頻繁重啓,在日誌文件中會看到如下的文字:
Process exiting because it reached MaxRequestsPerChild. Signaling the parent
這樣一來降低了Apache的總體性能。
另外,可以通過查看Apache提供的server-status(狀態報告)來驗證當前所設置數值是否合理,在httpd.conf文件中做如下設置來打開它:
- # 首先需要加載mod_status模塊
- LoadModule status_module modules/mod_status.so
- # 然後設置訪問的地址
- <Location /server-status>
- SetHandler server-status
- Order deny,allow
- Deny from all
- # 如果限制某個IP訪問則設置爲 Allow from 192.168.1.1
- Allow from all
- </Location>
綜合來說,因爲Windows NT下Apache只能啓動父子兩個進程,因此只能通過增大單個進程的線程數以及單個進程能夠處理的最大請求數來進行優化。其他優化的參數同Linux系統下是一樣的,大家可以加以參考。下面針對上述兩個參數給出一個建議的設置:
- <IfModule mpm_winnt.c>
- ThreadsPerChild 250
- MaxRequestsPerChild 5000
- </IfModule>
參考資料:
Apache參考手冊
Apache模塊 mod_status