apache mpm模式優化

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

參考:

apache的參數設置

Apache 2.0性能優化—MPM的選擇與配置

如何避免apache的httpd進程佔用比較多的內存

對apache中併發控制參數prefork理解和調優

附:

實時檢測HTTPD鏈接數:watch -n 1 -d "pgrep httpd|wc -l"

相關文章
相關標籤/搜索