Optimieren von Apache2 prefork MaxClients ServerLimit

22

Ich habe eine Maschine mit 128 GB RAM, die Apache2 als Webserver verwendet (auf dieser Maschine gibt es keinen Datenbankserver, die Datenbankmaschine ist eine 64 GB RAM-Maschine, die maximal 2000 Verbindungen verarbeiten kann). Ich sehe mit einem Überwachungstool, dass es derzeit etwa 44 beschäftigte Arbeiter und 12 nicht beschäftigte Arbeiter gibt, welche theoretischen Werte für mein Prefork-Modul am besten sind.

Ich habe leere Seiten bekommen, die manchmal Websites mit hoher Auslastung laden, und diesen Fehler in meinem Apache-Fehlerprotokoll bekommen:

[notice] child pid 13595 exit signal Segmentierungsfehler (11)

Wie kann auch dieses Problem gelöst werden?

Meine Konfiguration des Apache2 Prefork-Moduls:

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

Kostenlos -h auf der www-Maschine :

gesamt: 128 G frei: 97 GB (bei laufendem Apache2) freigegebene 0b-Puffer 1,9 G Cache 23 G

RAM verwendet von Apache2 und anderen Programmen:

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
Benutzer-N
quelle
2
Wie lautet der Anwendungscode, der auf dem Webserver ausgeführt wird? Das ist höchstwahrscheinlich der Schuldige.
Shane Madden
Bitte senden Sie ein paar Muster des apache2ctl-Status. Gibt es etwas in error_log vielleicht?
Hrvoje Špoljar

Antworten:

63

Apache-Prefork-Einstellungen gemäß den Richtlinien zur Leistungsoptimierung für Apache

Zitat:

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.

Sie sollten es folgendermaßen einrichten, basierend auf Ihren Eingaben zu:

  • Gesamtspeicher: 128 GB
  • -10% Speicher für alles außer Apache: 115 GB
  • Jetzt müssen wir herausfinden, wie viel einzelner Apache-Prozess verwendet wird.

Um dies zu berechnen, können Sie folgendes Skript verwenden:

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

Dies ist die beste Schätzung der Speicherauslastung eines einzelnen Apache-Prozesses, während versucht wird, die gemeinsame Nutzung proportional nach der Anzahl der aktiven Apache-Prozesse aufzuteilen und über Pss zu addieren (proportionale Satzgröße ).

Schließlich dividieren Sie 115 GB mit dieser Zahl und Sie erhalten MaxClients/ServerLimit. Von hier aus können Sie relativ andere Zahlen wie berechnen

  • StartServers 30% von MaxClients
  • MinSpareServers 5% von MaxClients
  • MaxSpareServers 10% von MaxClients
  • ServerLimit == MaxClients
  • MaxConnectionsPerChild 10000 (als konservative Alternative zur Behebung möglicher Probleme mit speicherverlustbehafteten Apps)
Hrvoje Špoljar
quelle
2
Ich hoffe, dass jemand mit mehr Wiederholungspunkten als ich für diese Antwort stimmen wird. Vielen Dank!
User-N
2
Ihr Berechnungsskript gibt mir 842,13 MB. Das ist ungefähr eine Größenordnung über dem, was ich würde (Apache 2.2 auf CentOS 6.7).
Quinn Comendant
1
Es ist im Prefork-Modus. Hier ist die Ausgabe von /server-info: i.imgur.com/SS2gIXI.png
Quinn Comendant 20.10.15
1
@QuinnComendant böser Trick jedoch IfModule wird wahr sein, wenn Prefork-Modul verfügbar ist (was es ist), und tatsächlich sind beide Optionen Worker und MPM verfügbar ... Ich habe identische Server- und Speicherbelegung auf meinem System für Worker ist ~ 850 MB. Prefork kann auf keinen Fall 800 MB Speicher für einen Prozess verwenden. Sie haben die Zeile im Skript geändert, in der der Prozessname apache2 auf httpd verweist, oder?
Hrvoje Špoljar
1
@ Shawn, warum würdest du das sagen? Wie sollte es Ihrer Meinung nach berechnet werden?
Hrvoje Špoljar