Frage Tuning von Apache2 prefork MaxClients ServerLimit


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 2000 maximale Verbindungen verarbeiten kann). Ich sehe mit einem Überwachungstool, dass es im Moment etwa 44 beschäftigte Arbeiter und 12 untätige Arbeiter gibt, was sind die besten theoretischen Werte für mein Prefork-Modul?

Ich habe manchmal leere Seiten geladen, die Webseiten bei hohen Ladezeiten laden und habe diesen Fehler in meinem Apache-Fehlerprotokoll:

[Mitteilung] Kind pid 13595 Ausgangssignal Segmentierungsfehler (11)

Wie kann dieses Problem auch gelöst werden?

Meine Apache2 Prefork Modul Konfiguration:

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

Kostenlos -h auf der www Maschine :

Gesamt: 128 G frei: 97 GB (mit Apache2 läuft) gemeinsame 0b Puffer 1.9G Cache 23G

Ram von Apache2 und anderen Programmen verwendet: 

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

20
2017-11-15 17:45


Ursprung


Wie lautet der Anwendungscode, der auf dem Webserver ausgeführt wird? Das ist höchstwahrscheinlich der Schuldige. - Shane Madden♦
Bitte senden Sie einige Beispiele von apache2ctl Status; Gibt es irgendetwas in error_log vielleicht? - Hrvoje Špoljar


Antworten:


Apache-Prefork-Einstellungen, per Apache Performance Tuning Richtlinien

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 wie folgt einrichten:

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

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, wie viel einzelner Apache-Prozess Speicher verwendet, während versucht wird, die gemeinsame Nutzung pro Anzahl aktiver Apache-Prozesse proportional zu teilen und sie zusätzlich hinzuzufügen Pss (proportionale Satzgröße)

Schließlich teilst du 115 GB mit dieser Figur und du bekommst MaxClients/ServerLimit. Von hier aus können Sie relativ andere Zahlen berechnen wie

  • StartServers          30% der MaxClients
  • MinSpareServers        5% der MaxClients
  • MaxSpareServers       10% der MaxClients
  • ServerLimit == MaxClients
  • MaxConnectionsPerChild  10000 (als konservative Alternative, um mögliche Probleme mit Speicherleck-Apps zu beheben)

60
2017-11-15 19:41



Ich hoffe, jemand mit mehr rep Punkte als ich Ihnen geben Abstimmung für diese Antwort, vielen Dank! - User-N
Dein 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
Es ist im Prefork-Modus. Hier ist Ausgabe von /server-info: i.imgur.com/SS2gIXI.png - Quinn Comendant
@QuinnComendant bösen Trick jedoch IfModule wird wahr sein, wenn Prefork-Modul verfügbar ist (was es ist), und tatsächlich beide Optionen verfügbar sind Worker und MPM ... Ich habe identische Server-und Speichernutzung auf meinem System für Worker ist ~ 850 MB. Es gibt keine Möglichkeit, Prefork kann für 1 Prozess 800 MB Speicher verwenden. Sie haben die Zeile im Skript geändert, wo sie den Prozessnamen apache2 auf httpd referenziert? - Hrvoje Špoljar
@shawn warum würdest du das sagen? Wie glaubst du, sollte es berechnet werden? - Hrvoje Špoljar