今天自己的網(wǎng)站突然發(fā)現(xiàn)apache httpd.exe占高cpu并且,內(nèi)存也增加了不少,引起apache假死無法正常訪問網(wǎng)站,下面來看我的解決辦法吧。
一般來說,WinNT系統(tǒng)下使用IIS,而Apache在Linux下應(yīng)用的比較多,但是依然有很多人在WinNT系統(tǒng)下使用Apache而非IIS,可能是基于對Windows系統(tǒng)的熟悉吧。今天就來說一下在Windows系統(tǒng)下如果優(yōu)化Apache的性能。
mpm_winnt.c 是專門針對Windows NT優(yōu)化的MPM(多路處理模塊),它使用一個單獨的父進(jìn)程產(chǎn)生一個單獨的子進(jìn)程,在這個子進(jìn)程中輪流產(chǎn)生多個線程來處理請求。也就是說mpm_winnt只能啟動父子兩個進(jìn)程, 不能像Linux下那樣同時啟動多個進(jìn)程。
mpm_winnt主要通過ThreadsPerChild和MaxRequestsPerChild兩個參數(shù)來優(yōu)化Apache,下面詳細(xì)來說明一下。
ThreadsPerChild
這個參數(shù)用于設(shè)置每個進(jìn)程的線程數(shù), 子進(jìn)程在啟動時建立這些線程后就不再建立新的線程了. 一方面因為mpm_winnt不能啟動多個進(jìn)程, 所以這個數(shù)值要足夠大,以便可以處理可能的請求高峰; 另一方面該參數(shù)以服務(wù)器的響應(yīng)速度為準(zhǔn)的, 數(shù)目太大的反而會變慢。因此需要綜合均衡一個合理的數(shù)值。
mpm_winnt上的默認(rèn)值是64, 最大值是1920. 這里建議設(shè)置為100-500之間,服務(wù)器性能高的話值大一些,反之值小一些。
MaxRequestsPerChild
該參數(shù)表示每個子進(jìn)程能夠處理的最大請求數(shù), 即同時間內(nèi)子進(jìn)程數(shù)目.設(shè)置為零表示不限制, mpm_winnt上的默認(rèn)值就是0.
官方參考手冊中不建議設(shè)置為0, 主要基于兩點考慮: (1) 可以防止(偶然的)內(nèi)存泄漏無限進(jìn)行,從而耗盡內(nèi)存; (2) 給進(jìn)程一個有限壽命,從而有助于當(dāng)服務(wù)器負(fù)載減輕的時候減少活動進(jìn)程的數(shù)量。
因此這個參數(shù)的值更大程度上取決于服務(wù)器的內(nèi)存,如果內(nèi)存比較大的話可以設(shè)置為0或很大的數(shù)字,否則設(shè)置一個小的數(shù)值。需要說明的是,如果這個值設(shè)置的太小的話會造成Apache頻繁重啟,在日志文件中會看到如下的文字:
- Process exiting because it reached MaxRequestsPerChild. Signaling the parent
這樣一來降低了Apache的總體性能。另外,可以通過查看Apache提供的server-status(狀態(tài)報告)來驗證當(dāng)前所設(shè)置數(shù)值是否合理,在httpd.conf文件中做如下設(shè)置來打開它:
# 首先需要加載mod_status模塊
LoadModule status_module modules/mod_status.so
# 然后設(shè)置訪問的地址
- <Location /server-status>
- SetHandler server-status
- Order deny,allow
- Deny from all
- # 如果限制某個IP訪問則設(shè)置為 Allow from 192.168.1.1
- Allow from all
- </Location>
綜合來說,因為Windows NT下Apache只能啟動父子兩個進(jìn)程,因此只能通過增大單個進(jìn)程的線程數(shù)以及單個進(jìn)程能夠處理的最大請求數(shù)來進(jìn)行優(yōu)化。其他優(yōu)化的參數(shù)同Linux系統(tǒng)下是一樣的,大家可以加以參考。下面針對上述兩個參數(shù)給出一個建議的設(shè)置:
- <IfModule mpm_winnt.c>
- ThreadsPerChild 250
- MaxRequestsPerChild 5000
- </IfModule>
新聞熱點
疑難解答