新配置的服務器,帶寬 是2M ,apache httpd上傳的速度比下載速度大很多,一直不解原因。
而且,apache httpd 鏈接數一旦超過200以上,網頁打開速度就超級慢。特別郁悶。難道自己買了服務器還不如虛擬空間的!折磨中,於是上網搜索了一下,結果如下:雖然經過修改,好像有一些變化了,但是好像apache httpd鏈接數一超過200網頁打開速度依然很慢,難道真的是帶寬太低嗎?設置了
apache 緩存
也按下面的設置了 apache httpd 最大鏈接數。郁悶中!
新買了服務器,有一個網站在線人數增多,訪問時很慢。初步認為是服務器帶寬太低,但經反復測試,一旦連接上,不斷點擊同一個頁面上不同的鏈接,都能迅速打開,這種現象就是說明apache最大連接數已經滿了,新的訪客只能排隊等待有空閑的鏈接,而如果一旦連接上,在keeyalive 的存活時間內(KeepAliveTimeout,默認5秒)都不用重新打開連接,因此解決的方法就是加大apache的最大連接數。
1.在哪里設置?
apache 2.24,使用默認配置,默認最大連接數是150
首先在httpd.conf中加載httpd-mpm.conf配置(去掉前面的注釋):
# Server-pool management (MPM specific)
Include conf/extra/httpd-mpm.conf
可見的MPM配置在Apache2.2/conf/extra/httpd-mpm.conf,但里面根據httpd的工作模式分了很多塊,哪一部才是當前httpd的工作模式呢?可通過執行 apachectl -l 來查看:
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c
所以修改連接數就在Apache2.2/conf/extra/httpd-mpm.conf這個文件了,打開它就找到prefork模式的默認配置是:
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
prefork 控制進程在最初建立“StartServers”個子進程后,為了滿足MinSpareServers設置的需要創建一個進程,等待一秒鍾,繼續創建兩個,再等待一秒鍾,繼續創建四個……如此按指數級增加創建的進程數,最多達到每秒32個,直到滿足MinSpareServers設置的值為止。
這種模式可以不必在請求到來時再產生新的進程,從而減小了系統開銷以增加性能。MaxSpareServers設置了最大的空閑進程數,如果空閑進程數大於這個值,Apache會自動kill掉一些多余進程。這個值不要設得過大,但如果設的值比MinSpareServers小,Apache會自動把其調整為 MinSpareServers+1。如果站點負載較大,可考慮同時加大MinSpareServers和MaxSpareServers。
MaxRequestsPerChild設置的是每個子進程可處理的請求數。每個子進程在處理了“MaxRequestsPerChild”個請求后將自動銷毀。0意味着無限,即子進程永不銷毀。
雖然缺省設為0可以使每個子進程處理更多的請求,但如果設成非零值也有兩點重要的好處:
1、可防止意外的內存泄漏。
2、在服務器負載下降的時侯會自動減少子進程數。因此,可根據服務器的負載來調整這個值。MaxClients是這些指令中最為重要的一個,設定的是 Apache可以同時處理的請求,是對Apache性能影響最大的參數。其缺省值150是遠遠不夠的,如果請求總數已達到這個值(可通過ps -ef|grep httpd|wc -l來確認),那么后面的請求就要排隊,直到某個已處理請求完畢。這就是系統資源還剩下很多而HTTP訪問卻很慢的主要原因。雖然理論上這個值越大,可以處理的請求就越多,但Apache默認的限制不能大於256。ServerLimit指令無須重編譯Apache就可以加大MaxClients。
注意,雖然通過設置ServerLimit,我們可以把MaxClients加得很大,但是往往會適得其反,系統耗光所有內存。以我手頭的一台服務器為例:內存2G,每個apache進程消耗大約0.5%(可通過ps aux來確認)的內存,也就是10M,這樣,理論上這台服務器最多跑200個apache進程就會耗光系統所有內存,所以,設置MaxClients要慎重。
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的人訪問很快,其他的可能需要等待1、2秒才能連上,而一旦連上就會很流暢)
控制最大連接數的MaxClients ,因此可以嘗試配置為:
StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 5500
MaxClients 5000
MaxRequestsPerChild 100
注意,MaxClients默認最大為250,若要超過這個值就要顯式設置ServerLimit,且ServerLimit要放在MaxClients之前,值要不小於MaxClients,不然重啟httpd時會有提示。
重啟httpd后,通過反復執行pgrep httpd|wc -l 來觀察連接數,可以看到連接數在達到MaxClients的設值后不再增加,但此時訪問網站也很流暢,那就不用貪心再設置更高的值了,不然以后如果網站訪問突增不小心就會耗光服務器內存,可根據以后訪問壓力趨勢及內存的占用變化再逐漸調整,直到找到一個最優的設置值。
(MaxRequestsPerChild不能設置為0,可能會因內存泄露導致服