Memory 4G
具體現象爲:
1)SVN 訪問緩慢,甚至不響應
2) uptime
[root@localhost local]# uptime
10:29:38 up 25 days, 1:38, 2 users, load average: 0.07, 0.04, 0.97
3)ss -a(或netstat命令)查看連接數較多,並且WAIT_TIME比較多;
4)apache日誌顯示prefork工作模式下的併發連接數設置有問題;[mpm_prefork:error] [pid 13848] AH00161: server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting
4)重啓apache服務後,SVN訪問恢復正常
針對上面的現象,作了以下優化操作。操作記錄如下:
1)修改apache的最大併發連接數(默認是250)
[root@wang ~]# vim /usr/local/apache/conf/extra/httpd-mpm.conf
原配置:
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 250
MaxConnectionsPerChild 0
</IfModule>
改動後:
<IfModule mpm_prefork_module>
StartServers 10
MinSpareServers 10
MaxSpareServers 20
ServerLimit 2000
MaxRequestWorkers 1500
MaxConnectionsPerChild 10000
</IfModule>
說明:
手動添加ServerLimit,這個纔是修改apache最大併發連接數的參數設置,一定要將它放在MaxRequestWorkers的前面,並且它的值也一定要大於MaxRequestWorkers的值。如上設置,apache的最大併發連接數設置爲2000個。
其他的配置:
StartServers 定服務器啓動時建立的子進程數量,prefork默認爲5
MinSpareServers 指定空閒子進程的最小數量,默認爲5。如果當前空閒子進程數少於MinSpareServers ,那麼Apache將以最大每秒一個的速度產生新的子進程。此參數不要設的太大。
MaxSpareServers 設置空閒子進程的最大數量,默認爲10。如果當前有超過MaxSpareServers數量的空閒子進程,那麼父進程將殺死多餘的子進程。此參數不要設的太大。如果你將該指令的值設置爲比MinSpareServers小,Apache將會自動將其修改成"MinSpareServers+1"。
MaxRequestWorkers 最大數量的服務器進程允許開始;這個參數是這些中最爲重要的一個,設定的是Apache可以同時處理的請求,是對Apache性能影響最大的參數。其缺省值150是遠遠不夠的,如果請求總數已達到這個值(可通過ps -ef|grep http|wc -l來確認),那麼後面的請求就要排隊,直到某個已處理請求完畢。這就是系統資源還剩下很多而HTTP訪問卻很慢的主要原因。雖然理論上這個值越大,可以處理的請求就越多,但Apache默認的限制不能大於256。
MaxConnectionsPerChild 每個子進程在其生存期內允許伺服的最大請求數量,默認爲10000.到達MaxRequestsPerChild的限制後,子進程將會結束。如果MaxRequestsPerChild爲"0",子進程將永遠不會結束。
將MaxRequestsPerChild設置成非零值有兩個好處:
1.可以防止(偶然的)內存泄漏無限進行,從而耗盡內存。
2.給進程一個有限壽命,從而有助於當服務器負載減輕的時候減少活動進程的數量。
重啓apache服務(最好是先stop,然後再start)
在/usr/local/apache/conf/httpd.conf文件中添加ServerName localhost,去掉apache服務啓動中的告警信息。
# /usr/local/apache/bin/apachectl stop
# /usr/local/apache/bin/apachectlstart
2)修改內核參數,解決WAIT_TIME過多的問題
添加下面四行內容
# vim /etc/sysctl.conf
......
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
#sysctl -p
調大系統最大打開的文件數
#ulimit -n 65535