Tuning Apache2 prefork MaxClients ServerLimit

22

Mam maszynę z 128 GB pamięci RAM, która używa Apache2 jako serwera sieci Web (w tym komputerze nie ma serwera bazy danych, maszyna bazy danych to 64 GB pamięci RAM, która może obsłużyć 2000 połączeń maksymalnych). Widzę za pomocą narzędzia monitorującego, że w tej chwili jest około 44 zajętych pracowników i 12 nieczynnych pracowników, jakie są najlepsze wartości teoretyczne dla mojego modułu prefork?

czasami mam puste strony ładujące witryny w godzinach dużego obciążenia i mam ten błąd w moim dzienniku błędów Apache:

[powiadomienie] child pid 13595 sygnał wyjścia Błąd segmentacji (11)

jak można rozwiązać ten problem?

Konfiguracja modułu Prefork My Apache2:

StartServers          3
MinSpareServers       3
MaxSpareServers       5
ServerLimit           3200
MaxClients            3100
MaxRequestsPerChild   0

Bezpłatnie -h na maszynie www :

łącznie: 128 G bezpłatnie: 97 GB (przy uruchomionym Apache2) współdzielone bufory 0b 1,9G pamięci podręcznej 23G

Ram używany przez Apache2 i inne programy:

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
Użytkownik-N
źródło
2
Jaki kod aplikacji działa na serwerze WWW? To najprawdopodobniej winowajca.
Shane Madden
wyślij kilka próbek statusu apache2ctl; czy może jest coś w logu błędów?
Hrvoje Špoljar

Odpowiedzi:

63

Ustawienia preforków Apache, wytyczne dostrajania wydajności apache

zacytować:

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.

powinieneś ustawić to w następujący sposób na podstawie danych wejściowych, aby:

  • Całkowita pamięć: 128 GB
  • -10% pamięci na wszystko oprócz apache: 115 GB
  • Teraz musimy dowiedzieć się, ile zużywa pojedynczy proces apache.

Aby to obliczyć, możesz użyć następującego skryptu:

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}'

Jest to najlepsze oszacowanie, ile proces pojedynczego apache zużywa pamięć, próbując proporcjonalnie podzielić współużytkowane użycie na liczbę aktywnych procesów apache i dodać je na PSs (proporcjonalny rozmiar zestawu)

Wreszcie dzielisz 115 GB tą liczbą i otrzymujesz MaxClients/ServerLimit. Stąd możesz względnie obliczyć inne liczby, takie jak

  • StartServers 30% MaxClients
  • MinSpareServers 5% MaxClients
  • MaxSpareServers 10% MaxClients
  • ServerLimit == MaxClients
  • MaxConnectionsPerChild 10000 (jako konserwatywna alternatywa dla rozwiązania możliwego problemu z nieszczelnymi aplikacjami)
Hrvoje Špoljar
źródło
2
mam nadzieję, że ktoś z większą liczbą punktów rep niż ja da ci głos na tę odpowiedź, dziękuję bardzo!
Użytkownik-N
2
Twój skrypt obliczeniowy daje mi 842,13 MB. To około rząd wielkości powyżej tego, co bym (apache 2.2 na CentOS 6.7).
Quinn Comendant
1
Jest w trybie przedorkowym. Oto dane wyjściowe z /server-info: i.imgur.com/SS2gIXI.png
Quinn Comendant
1
@QuinnComendant niegodziwy trick Jednak IfModule będzie prawdą, jeśli moduł prefork jest dostępny (który jest), a tak naprawdę obie opcje są dostępne jako robotnik i MPM ... Mam identyczne użycie serwera i pamięci w systemie dla pracownika to ~ 850 MB. Nie ma możliwości wykorzystania preforków dla 1 procesu 800 MB pamięci. Zmieniłeś wiersz w skrypcie, w którym odwołuje się on do procesu apache2 do httpd, prawda?
Hrvoje Špoljar
1
@ shawn, dlaczego tak mówisz? jak według ciebie należy to obliczyć?
Hrvoje Špoljar