Apache-2.2
調整 Apache2 prefork MaxClients ServerLimit
我有一台 128 GB Ram 的機器,它使用 Apache2 作為 Web 伺服器(在這台機器上沒有數據庫伺服器,數據庫機器是一個 64 GB Ram 機器,可以處理最大 2000 個連接)。我通過監控工具看到目前大約有 44 個忙碌的工作人員和 12 個空閒的工作人員,我的 prefork 模組的最佳理論值是多少?
我有時會在高負載時間載入網站時出現空白頁面,並在我的 apache 錯誤日誌中出現此錯誤:
$$ notice $$子 pid 13595 退出信號分段錯誤 (11)
如何解決這個問題呢?
我的 Apache2 Prefork 模組配置:
StartServers 3 MinSpareServers 3 MaxSpareServers 5 ServerLimit 3200 MaxClients 3100 MaxRequestsPerChild 0
www 機器上的免費 -h:
總計:128 G 免費:97GB(執行 apache2)共享 0b 緩衝區 1.9G 記憶體 23G
Apache2 和其他程序使用的 Ram:
Private + Shared = RAM used Program 96.0 KiB + 61.0 KiB = 157.0 KiB sh 176.0 KiB + 26.0 KiB = 202.0 KiB atd 176.0 KiB + 35.5 KiB = 211.5 KiB acpid 208.0 KiB + 19.5 KiB = 227.5 KiB mdadm 204.0 KiB + 30.0 KiB = 234.0 KiB init 248.0 KiB + 62.0 KiB = 310.0 KiB sendmail 376.0 KiB + 36.0 KiB = 412.0 KiB dbus-daemon 388.0 KiB + 285.5 KiB = 673.5 KiB cron (2) 820.0 KiB + 42.0 KiB = 862.0 KiB gam_server 920.0 KiB + 108.0 KiB = 1.0 MiB ntpd 968.0 KiB + 243.0 KiB = 1.2 MiB getty (6) 1.3 MiB + 351.5 KiB = 1.6 MiB udevd (3) 1.5 MiB + 343.0 KiB = 1.8 MiB sendmail-msp 2.0 MiB + 910.0 KiB = 2.9 MiB plugin-localresources2 3.4 MiB + 50.0 KiB = 3.4 MiB rsyslogd 3.6 MiB + 68.5 KiB = 3.7 MiB bash 1.9 MiB + 2.1 MiB = 4.0 MiB sendmail-mta (4) 3.8 MiB + 556.0 KiB = 4.3 MiB sshd (2) 3.7 MiB + 1.2 MiB = 4.8 MiB plugin-apache2 5.1 MiB + 1.2 MiB = 6.3 MiB agent-service 7.0 MiB + 654.0 KiB = 7.6 MiB fail2ban-server 9.6 MiB + 2.6 MiB = 12.2 MiB proftpd (8) 59.2 MiB + 70.0 KiB = 59.3 MiB miniserv.pl 96.8 MiB + 3.6 MiB = 100.4 MiB php5-cgi (2) 196.4 MiB + 35.9 MiB = 232.3 MiB apache2 (40) --------------------------------- tot 450.0 MiB
Apache prefork 設置,根據apache 性能調整指南
引用:
The single biggest hardware issue affecting webserver performance is RAM. A webserver should never ever have to swap, as swapping increases the latency of each request beyond a point that users consider "fast enough". This causes users to hit stop and reload, further increasing the load. You can, and should, control the MaxClients setting so that your server does not spawn so many children it starts swapping. This procedure for doing this is simple: determine the size of your average Apache process, by looking at your process list via a tool such as top, and divide this into your total available memory, leaving some room for other processes.
您應該根據您的輸入進行如下設置:
- 總記憶體:128 GB
- -10% 記憶體,除了 apache:115 GB
- 現在我們需要弄清楚單個 apache 程序正在使用多少。
要計算這一點,您可以使用以下腳本:
pgrep apache2 | xargs -n1 -I{} cat /proc/{}/smaps | \ awk '{if ($0 ~ /stack/) {pids+=1} else if ($0 ~/^Shared_/) {shared+=$2} else if ($0 ~ /^Pss:/) {priv+=$2}} END { printf "%.2f MB\n",(priv+shared/(pids*pids))/1024}'
這是對單個 apache 程序使用記憶體的最佳估計,同時嘗試按比例劃分每個活動 apache 程序數的共享使用量並將其添加到Pss之上(比例集大小)
最後用這個數字除以 115 GB,得到
MaxClients/ServerLimit
. 從這裡您可以相對計算其他數字,例如
StartServers
30% 的 MaxClientsMinSpareServers
5% 的 MaxClientsMaxSpareServers
10% 的 MaxClientsServerLimit
== 最大客戶數MaxConnectionsPerChild
10000(作為解決記憶體洩漏應用程序可能問題的保守替代方案)