Apache 2.2 nutzt schließlich den gesamten Speicher (Worker-MPM)

Apache 2.2 nutzt schließlich den gesamten Speicher (Worker-MPM)

Ich optimiere einen Apache 2.2-Server (er wird gemeinsam mit MySQL + Courier + Mongo + Postgre genutzt). Der Server ist Bare Metal (keine Virtualisierung) mit 2 Quad-Core Xeon (insgesamt 16 Kerne) und 12 GB ECC RAM (Upgrade auf 24 GB in den nächsten Tagen). MySql hat innodb_buffer auf 2G eingestellt und läuft gut. Mongo und Postgre werden kaum berührt – nur für die Entwicklung.

Das Problem besteht darin, dass Apache den gesamten verfügbaren Speicher verbraucht und schließlich den gesamten Swap verwendet (und daher MySql abstürzt, da es mehr Speicher verwendet). Wir haben Apache 2.2 mit Worker MPM und mod_security. Immer wenn wir es neu starten, haben wir ungefähr 8 GB freien RAM.

Ich versuche, ein paar Dinge zu verstehen:

  • Welche Beziehung besteht zwischen den angezeigten Prozessen topund den Worker-Servern? Ich hatte erwartet, höchstens 10 Prozesse zu sehen (als ServerLimit in den Worker-Einstellungen – ohne Berücksichtigung des Hauptprozesses).
  • Wird die Menge an RES-Speicher für jeden THREAD oder für jeden PROZESS verwendet?
  • In der mod_status-Ausgabe unten gibt es viele Leseanfragen, die lange Zeit dort verbleiben. Ich habe versucht, ExtendedStatus zu aktivieren, um herauszufinden, welche Clients da sind, konnte aber keine nützlichen Informationen finden – irgendwelche Vorschläge?
  • Wie viel RAM würde ich bei der tatsächlichen Speichernutzung benötigen, um 400 gleichzeitige Verbindungen zu bedienen? (Der Mod-Status zeigt, dass 250 bereits erschöpft sind.)
  • wie wäre es, ThreadsPerChild zu erhöhen, anstatt MaxClients/ServerLimit zu erhöhen?
<IfModule worker.c>
StartServer 2
Max. Kunden 250
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxAnfragenProKind 0
ServerLimit 10
</IfModule>

TOP-Shows (nur für Apache):

oben – 16:30:21, 46 Tage, 23:12, 2 Benutzer, durchschnittliche Auslastung: 0,94, 0,97, 1,31
Aufgaben: 460 insgesamt, 1 läuft, 459 schläft, 0 gestoppt, 0 Zombie
CPU(s): 2,8 % us, 0,5 % sy, 0,0 % ni, 96,7 % id, 0,0 % wa, 0,0 % hi, 0,0 % si, 0,0 % st
Speicher: 12187448k gesamt, 10686748k genutzt, 1500700k frei, 67104k Puffer
Swap: 1048568k insgesamt, 275904k verwendet, 772664k frei, 2371208k zwischengespeichert

  PID USER PR NI VIRT RES SHR S %CPU %MEM ZEIT+ BEFEHL
24252 wwwrun 20 0 2216m 161m 7484 S 20.2 1.4 0:09.25 httpd
24750 wwwrun 20 0 1264m 51m 6196 S 9,9 0,4 0:00,93 httpd
23996 wwwrun 20 0 2136m 279m 7292 S 6.0 2.4 0:16.76 httpd
23326 wwwrun 20 0 2216m 276m 7376 S 2.7 2.3 0:16.81 httpd
23582 wwwrun 20 0 2208m 293m 7132 S 2.3 2.5 0:27.30 httpd
23688 wwwrun 20 0 1904m 208m 7304 S 1.0 1.8 0:13.62 httpd
19507 wwwrun 20 0 2182m 229m 8096 S 0,7 1,9 0:18,65 httpd
23616 wwwrun 20 0 1908m 239m 7092 S 0,7 2,0 0:18,48 httpd
18304 wwwrun 20 0 2160m 334m 11m S 0,3 2,8 0:47,38 httpd
23637 wwwrun 20 0 1830m 231m 7556 S 0,3 1,9 0:20,56 httpd
24457 wwwrun 20 0 2196m 174m 6568 S 0,3 1,5 0:04.11 httpd
15694 wwwrun 20 0 2199m 295m 7504 S 0,0 2,5 0:20,54 httpd
15783 wwwrun 20 0 2172m 244m 10m S 0,0 2,1 0:17,45 httpd
16577 wwwrun 20 0 2128m 354m 7436 S 0,0 3,0 0:28.21 httpd
18290 wwwrun 20 0 277m 9880 964 S 0,0 0,1 0:00.05 httpd
18379 wwwrun 20 0 2208m 211m 6864 S 0,0 1,8 0:08,57 httpd
18480 wwwrun 20 0 2096m 305m 7540 S 0.0 2.6 0:17.72 httpd
18791 wwwrun 20 0 1920m 251m 7244 S 0.0 2.1 0:20.24 httpd
19348 wwwrun 20 0 2060m 310m 7388 S 0.0 2.6 0:22.07 httpd
19619 wwwrun 20 0 2206m 235m 7340 S 0.0 2.0 0:15.30 httpd
19999 wwwrun 20 0 2178m 144m 7132 S 0.0 1.2 0:05.50 httpd
20697 wwwrun 20 0 2002m 193m 7276 S 0,0 1,6 0:08.12 httpd
20838 wwwrun 20 0 1890m 127m 7260 S 0.0 1.1 0:07.44 httpd
21407 wwwrun 20 0 1988m 290m 7708 S 0.0 2.4 0:39.33 httpd
22252 wwwrun 20 0 2216m 295m 7732 S 0,0 2,5 0:27.04 httpd
22723 wwwrun 20 0 2020m 187m 7444 S 0,0 1,6 0:39,80 httpd
22753 wwwrun 20 0 1850m 206m 7448 S 0.0 1.7 0:10.62 httpd
23174 wwwrun 20 0 1990m 229m 7332 S 0.0 1.9 0:07.71 httpd
23383 wwwrun 20 0 1504m 76m 6372 S 0,0 0,6 0:01,25 httpd
23720 wwwrun 20 0 1906m 225m 7080 S 0.0 1.9 0:20.12 httpd
24778 wwwrun 20 0 970m 30m 5604 S 0,0 0,3 0:00.80 httpd

Schließlich gibt mod_status Folgendes aus:

   Serverversion: Apache/2.2.23 (Unix) mod_ssl/2.2.23 OpenSSL/1.0.0-fips Domänenserver PHP/5.3.24 mit Suhosin-Patch mod_perl/2.0.5
          Perl/v5.10.1

   Server erstellt: 15. Mai 2013 10:17:30
     __________________________________________________________________________________________________________________________________

   Aktuelle Zeit: Montag, 12. Mai 2014 16:41:08 BRT
   Neustartzeit: Montag, 12. Mai 2014, 15:36:37 BRT
   Übergeordnete Servergeneration: 1
   Serververfügbarkeit: 1 Stunde 4 Minuten 31 Sekunden
   Zugriffe gesamt: 36446 - Gesamtverkehr: 1,6 GB
   CPU-Auslastung: u213.3 s13.65 cu0 cs0 – 5,86 % CPU-Auslastung
   9,42 Anfragen/Sek. – 442,8 kB/Sekunde – 47,0 kB/Anfrage
   249 Anfragen werden derzeit bearbeitet, 0 inaktive Mitarbeiter

WWRRKRKRRKRRRRWRRWWWRWCRR.......................................
RWWWRRWRRRRKKRKRWRRRRRWWR.......................................
WRWRCRRWRRWWRKRRWWRRWRWWW.......................................
WRWKKWWWRWKRRWRCRRRWWRWWW.......................................
WRWRWCRKCWWWRWWRRWWCRWRWW.......................................
WRWKRWRRKKRKRRRRCWWKWWWRW.......................................
RWWKWRRWKRRRWRRWWCRRRRRRW.......................................
WWWRRWRKWWWKRWWWWRWWWKRRW.......................................
RRRRRRRK.WKRRWRWWKRRWRRKR.......................................
KCRRRRWRWWKRWWWRRKRWRWRWRK.......................................

Aktualisierung 1:

Ich habe versucht, mod_security2 zu deaktivieren und an den Worker-Einstellungen herumgespielt, aber letztendlich verbrauchte Apache fast 20 GB RAM (ich habe eine 13 GB große Auslagerungsdatei hinzugefügt, um Serverabstürze zu verhindern).

Schließlich deaktiviere ich KeepAlive und behalte MaxRequestsPerChild auf 100 – jetzt verwendet Apache 2–3 G und die Anfragen werden bereinigt, wie die Statusausgabe unten zeigt:

   Aktuelle Uhrzeit: Dienstag, 13. Mai 2014 17:07:48 BRT
   Neustartzeit: Dienstag, 13. Mai 2014, 16:49:14 BRT
   Übergeordnete Servergeneration: 0
   Serververfügbarkeit: 18 Minuten 33 Sekunden
   Zugriffe gesamt: 6637 - Traffic gesamt: 133,2 MB
   CPU-Auslastung: u34.43 s3.05 cu0 cs0 – 3,37 % CPU-Auslastung
   5,96 Anfragen/Sek. – 122,5 kB/Sekunde – 20,5 kB/Anfrage
   14 Anfragen werden derzeit bearbeitet, 86 untätige Mitarbeiter

..................R.............................................
________________RR__R_R__RC_RWC___________________..............
R_WC__R___R_______________________________________..............
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................

Antwort1

KeepaliveTimeoutwürde dazu beitragen, die Zahl der hängenden „Leser“ zu verringern.

MPM verwendet mehrere Prozesse mit mehreren Threads, um den eingehenden Datenverkehr zu verarbeiten. Sie sehen also den normalen Apache-Betrieb.

Diese Standardeinstellung ist für Ihre Anforderungen möglicherweise besser geeignet:

ServerLimit 12
StartServers 2
MaxClients 500
MinSpareThreads 25
MaxSpareThreads 50
ThreadsPerChild 50

Dies würde dazu führen, dass insgesamt 10 Prozesse ( MaxClients/ ThreadsPerChild) gestartet werden, was den Speicherbedarf Ihres Servers erheblich reduzieren würde. Aufgrund der CPU-Verfügbarkeit können Sie sich mehr Threads über weniger Prozesse leisten.

Beachten Sie, dass zum Ändern dieser Variablen Apache vollständig gestoppt und dann neu gestartet werden muss.

Antwort2

Welche Beziehung besteht zwischen den oben angezeigten Prozessen und den Worker-Servern? Ich hatte erwartet, höchstens 10 Prozesse zu sehen (als ServerLimit in den Worker-Einstellungen – ohne Berücksichtigung des Hauptprozesses).

Das sieht nicht wie die topeines Apache-Servers aus, auf dem das Worker-MPM läuft. Ich betreibe zwei Server, einen mit dem Worker-MPM und einen anderen mit dem Prefork-MPM. Bei Worker toplistet die die Apache-Prozesse als auf httpd.worker, und die Anzahl der Prozesse entspricht der Anzahl der aktiven Server (Zeilen aus Punkten mit einigen Einträgen ohne Punkte), die über mod_status sichtbar sind. Bei Prefork werden die Prozesse als aufgelistet httpd, und die Anzahl entspricht ungefähr der Anzahl der inaktiven/aktiven Worker (jeder Eintrag ohne Punkte).

Angesichts dieser mod_status-Ausgabe:

..................R.............................................
..............._RR__R_R__RC_RWC__...............................
R_WC__R___R_....................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................

topAuf einem Server, auf dem „Prefork“ ausgeführt wird, sollten ungefähr 31 httpdProzesse angezeigt werden, und topauf einem Server, auf dem „Worker“ ausgeführt wird, sollten 3 httpd.workerProzesse angezeigt werden.

verwandte Informationen