.png)
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
top
und 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
KeepaliveTimeout
wü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 top
eines 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 top
listet 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_....................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................
top
Auf einem Server, auf dem „Prefork“ ausgeführt wird, sollten ungefähr 31 httpd
Prozesse angezeigt werden, und top
auf einem Server, auf dem „Worker“ ausgeführt wird, sollten 3 httpd.worker
Prozesse angezeigt werden.