apache會不停建立httpd進程,到了必定數量後會發現網站訪問很是慢,即便是本地的也會很是慢。後來查了一下有多是mpm設置的問題。php
原文地址:http://hi.baidu.com/rainchen/blog/item/095f0a551fa802c5b645ae46.htmlhtml
手 頭有一個網站在線人數增多,訪問時很慢。初步認爲是服務器資源不足了,但經反覆測試,一旦鏈接上,不斷點擊同一個頁面上不一樣的連接,都能迅速打開,這種現 象就是說明apache最大鏈接數已經滿了,新的訪客只能排隊等待有空閒的連接,而若是一旦鏈接上,在keeyalive 的存活時間內(KeepAliveTimeout,默認5秒)都不用從新打開鏈接,所以解決的方法就是加大apache的最大鏈接數。apache
1.在哪裏設置?性能優化
服務器的爲FreeBSD 6.2 ,apache 2.24,使用默認配置(FreeBSD 默認不加載自定義MPM配置),默認最大鏈接數是250服務器
在/usr/local/etc/apache22/httpd.conf中加載MPM配置(去掉前面的註釋):
# Server-pool management (MPM specific)
Include etc/apache22/extra/httpd-mpm.conf併發
可見的MPM配置在/usr/local/etc/apache22/extra/httpd-mpm.conf,但裏面根據httpd的工做模式分了不少塊,哪一部纔是當前httpd的工做模式呢?可經過執行 apachectl -l 來查看:
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c性能
看到prefork 字眼,所以可見當前httpd應該是工做在prefork模式,prefork模式的默認配置是:
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>測試
2.要加到多少?優化
鏈接數理論上固然是支持越大越好,但要在服務器的能力範圍內,這跟服務器的CPU、內存、帶寬等都有關係。網站
查看當前的鏈接數能夠用:
ps aux | grep httpd | wc -l
或:
pgrep httpd|wc -l
計算httpd佔用內存的平均數:
ps aux|grep -v grep|awk '/httpd/{sum+=$6;n++};END{print sum/n}'
因爲基本都是靜態頁面,CPU消耗很低,每進程佔用內存也不算多,大約200K。
服務器內存有2G,除去常規啓動的服務大約須要500M(保守估計),還剩1.5G可用,那麼理論上能夠支持1.5*1024*1024*1024/200000 = 8053.06368
約8K個進程,支持2W人同時訪問應該是沒有問題的(能保證其中8K的人訪問很快,其餘的可能須要等待一、2秒才能連上,而一旦連上就會很流暢)
控制最大鏈接數的MaxClients ,所以能夠嘗試配置爲:
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 5500
MaxClients 5000
MaxRequestsPerChild 100
</IfModule>
注意,MaxClients默認最大爲250,若要超過這個值就要顯式設置ServerLimit,且ServerLimit要放在MaxClients以前,值要不小於MaxClients,否則重啓httpd時會有提示。
重 啓httpd後,經過反覆執行pgrep httpd|wc -l 來觀察鏈接數,能夠看到鏈接數在達到MaxClients的設值後再也不增長,但此時訪問網站也很流暢,那就不用貪心再設置更高的值了,否則之後若是網站訪 問突增不當心就會耗光服務器內存,可根據之後訪問壓力趨勢及內存的佔用變化再逐漸調整,直到找到一個最優的設置值。
(MaxRequestsPerChild不能設置爲0,可能會因內存泄露致使服務器崩潰)
apache_max_process_with_good_perfermance < (total_hardware_memory / apache_memory_per_process ) * 2
apache_max_process = apache_max_process_with_good_perfermance * 1.5
參考:
附:
實時檢測HTTPD鏈接數:watch -n 1 -d "pgrep httpd|wc -l"