Apache-2.2

調整 Apache2 prefork MaxClients ServerLimit

  • August 31, 2018

我有一台 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% 的 MaxClients
  • MinSpareServers 5% 的 MaxClients
  • MaxSpareServers 10% 的 MaxClients
  • ServerLimit== 最大客戶數
  • MaxConnectionsPerChild 10000(作為解決記憶體洩漏應用程序可能問題的保守替代方案)

引用自:https://serverfault.com/questions/644622