最近有博友發現我的博客經常http 503,博客負載不大,應該不會出現負載問題,很有可能就是Apache最大連接數原因,Apache默認支持150個連接。
1.先要修改最大連接數,必須了解Apache的MPM(Multi -Processing Modules,多道處理模塊)
Apache2.0 中MPM分為3種(perfork、worker、event)。perfork從Apache1.3中繼承下來的,它采用的是進程管 理方式,所以它可以提供更可靠的性能和更好的兼容性;worker是Apache2.0中新增加的方式,它采用了線程控制方法,可以比perfork更節 約系統開銷、處理更多的數據量,但同時兼容性並不是很好,很多舊的程序無法工作在worker下;event仍處於試驗階段,它為每個任務分配不同的進程 池。
查看方法:通過http -l查看你的apache采用的MPM
可以看到我的apache采用的就是prefork工作方法。
2.配置prefork參數
默認參數如下:
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
MaxClients 150
MaxRequestsPerChild 1000
</IfModule>
當Apache被啟動時,Apache會自動創建StartServers個進程,並且盡力將空閑進程數保持在MinSpareServers和MaxSpareServers之間。
如果空閑進程小於MinSpareServers,Apache將會以大約每秒1個的速度新建進程。
如果空閑進程小於MaxSpareServers,Apache將會刪除多余的空閑進程,釋放服務器資源。
進程數的最大值由MaxClients控制,在Apache1.3中最大只能設置為256,但在Apache2.0中,可以通過在配置開頭增加ServerLimit項目來突破256的限制,此時必須MaxClients ≤ ServerLimit ≤ 20000
MaxRequestsPerChild用來控制每個進程在處理了多少次請求之后自動銷毀,這個參數可以設置為0表示無限(即不銷毀進程)。
我個人的配置如下:
<IfModule prefork.c>
StartServers 10
MinSpareServers 10
MaxSpareServers 15
ServerLimit 4000
MaxClients 2056
MaxRequestsPerChild 10000
</IfModule>
重啟Apache后生效
3.關於apache最大連接數設置
查看當前的連接數可以用:
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秒才能連上,而一旦連上就會很流暢)