ServerCrash bei vielen Besuchern

checkmeck

New Member
Hallo erstmal,
Ich bin ganz frisch hier im Forum also entschuldigt bitte wenn die Frage schonmal irgendwo gestellt wurde.
Ich habe derzeit einen Rootserver mit 4GB Ram wobei hier nur ~2Gb verfügbar sind (wegen anderen Servern etc.) und einer recht schwachen DualCore CPU.

Bei vielen Besuchern um die Stoßzeiten ist auf meiner Homepage recht viel los und das führte in letzter Zeit leider dazu das mein kompletter Server crasht ich kann mich kaum noch über SSH verbinden und wenn ich vorher htop geöffnet habe sind Arbeitsspeicher und CPU jeweils voll ausgelastet. Ich muss dann immer den kompletten Root resetten und da hier auchnoch andere Dienste drauf laufen wie zum Beispiel ein Teamspeak Server wirkt sich so ein Ausfall natürlich negativ aus.

Nun bin ich relativ ratlos was ich tun kann, dass der Apache die Verbindungen einfach fallen lässt sodass wenigstens der Teamspeak weiter laufen kann und vorallem der SSH Server...

Wenn noch jemanden Fragen hat nur her damit :D
Vielen Dank für eure Hilfe schonmal im Voraus
 

d4f

Müder Benutzer
Definier "viele Besucher". Mit 2GB kann Apache, abhängig von der Software und Konfiguration, eigentlich recht viel tun. Ich tippe mal in meiner Glaskugel auf keep-alive in Kombination mit mod_php.
Hier sammeln sich dann viele Apache-Prozesse an, und weil jeder Prozess seinen RAM nicht mehr hergibt wird der Server gefüllt bis es zum OOM kommt und knallt.

Zum Einen solltest du in dem Fall keep-alive entweder abschalten(!) oder auf einen Wert von 1-2 Sekunden reduzieren. Zum Anderen solltest du den MPM des Apache einstellen. Ich nehme mal an dass du mpm_prefork hast (typisch für ein mod_php Setup), also wären die relevanten Einstellungen:
- MaxClients
- MinSpareServers
- MaxSpareServers
Siehe:
http://httpd.apache.org/docs/2.0/mod/prefork.html
http://httpd.apache.org/docs/2.0/mod/mpm_common.html
Ausserdem wäre, bei mpm_prefork, auch das Reduzieren der Anfragen pro Child-Prozess zum regelmäßigen Ram-Abtreten sinnvoll. Bspw könnte für MaxRequestsPerChild ein Wert von 10 gewählt werden; das "forken" ist unter Linux eigentlich sehr effizient und somit keine hohe Belastung für den Server.

Zu Beachten ist dass du gerne die Werte niedriger setzen darfst als du gleichzeitige Benutzerstöße erwartest. Sollten alle Prozesse belegt sein, so stauen sich neue Anfragen und werden nacheinander abgefertigt.
 

Joe User

Zentrum der Macht
wenn ich vorher htop geöffnet habe sind Arbeitsspeicher und CPU jeweils voll ausgelastet.
Womit denn?

Teamspeak gegen die jüngsten Angriffe abgesichert?

Sämtliche Software und WebApps auf dem aktuellsten Stand?

Überflüssige Software entsorgt?

Alle Dienste vernünftig konfiguriert?
 

checkmeck

New Member
Also ich habe meine Konfiguation jetzt angepasst. Habe KeepAlive gleich ausgeschaltet und dem SSH-Server eine höhere Priorität zugewiesen.
Ich weiß aber leider nicht was gute Werte sind kann das leider echt schlecht abschätzen kannst du vllt mal eine Beispielkonfiguration schreiben?
Außerdem finde ich mehrere mpm Module welches muss ich bearbeiten und welches Modul macht was?

zB <IfModule mpm_prefork_module>
 

checkmeck

New Member
Womit denn?

Teamspeak gegen die jüngsten Angriffe abgesichert?

Sämtliche Software und WebApps auf dem aktuellsten Stand?

Überflüssige Software entsorgt?

Alle Dienste vernünftig konfiguriert?
Ehm also ich glaube du hast das falsch verstanden, ich habe vor der Stoßzeit mal htop geöffnet und dort dann gesehen das durch den Webserver so viel Auslastung erzeugt wird

Inwiefern sollte ich meinen Teamspeak vor Angriffen schützen?
Software alles uptodate
Überflüssig sollte nichts laufen auf dem Server
Ich habe mit keinem Dienst Probleme außer eben mit Apache2 und da blick ich noch nicht so ganz durch...
 

d4f

Müder Benutzer
Habe KeepAlive gleich ausgeschaltet und dem SSH-Server eine höhere Priorität zugewiesen.
Eine höhere Priorität hilft nur bei CPU-intensiven Aktionen. Sobald der Server anfängt zu swappen oder OOM-killen, bringt dir das nichts.

Außerdem finde ich mehrere mpm Module welches muss ich bearbeiten und welches Modul macht was?
Es ist immer nur 1 MPM gleichzeitig installiert und aktiv. Bei Verwendung von mod_php wäre das mpm_prefork. Wie die MPM's funktionieren ist hier gelistet:
http://httpd.apache.org/docs/2.2/mod/ (einfach auf die MPM's klicken, Sektion "How it works"). Es gibt übrigens neben den gelisteten MPM's noch andere wie ITK welche nicht von Apache selber bereitgestellt werden, generell sind aber unter Linux-Systemen prefork oder worker je nach Einsatzgebiet.

Ich weiß aber leider nicht was gute Werte sind
Wenn es generisch gute Werte geben würde, wären die voreingestellt.
Als Fausregel: MaxClients = verfügbarer RAM / Durchschnittsverbrauch deiner Skripte.
MinSpareServers und MaxSpareServers können recht niedrig liegen, bspw 1 und 5.
Beachte aber dass bspw unter Wordpress deine 2 GB Ram ganz schnell schmelzen können; 200MB pro Abfrage ist da, je nach Plugins, keine Besonderheit was dann 10 gleichzeitige Verbindungen wären. Auch nicht vergessen sollte hierbei dass Mysql auch unter Last erhöhten RAM-Verbrauch hat, aber darum ging die Frage nicht.
 

Joe User

Zentrum der Macht
Sollte ausreichend sein:
Code:
<IfModule mpm_prefork_module>
    StartServers              4
    MinSpareServers           4
    MaxSpareServers           4
    MaxRequestWorkers        16
    MaxConnectionsPerChild 5000
</IfModule>
 

d4f

Müder Benutzer
MaxConnectionsPerChild würde ich bei mod_php aus den genannten Problemen dass Apache-Prozesse belegten Ram nicht mehr freigeben deutlich niedriger setzen als die gesetzten 5000.
 

Joe User

Zentrum der Macht
Ich kann mit den 5000 bei meinem Apache+mod_php Systemen keine zu fetten Apache-Prozesse beobachten (starten mit ~30MB RES und sterben mit ~80MB RES). Und darin sind auch andere fette Apache-Module wie etwa mod_geoip2 und mod_ssl, sowie etliche PHP-Extensions enthalten. Da ist nginx+PHP-FPM deutlich fetter...

Vielleicht solltest Du Dich langsam mal von Deiner veralteten Apache+mod_php-Kombie verabschieden und aktuelle Zahlen mit Apache-2.4+mod_php-5.6 sammeln? Es hat sich einiges getan in den letzten Jahren (zumindest ausserhalb der Debian-Welt)...
 

marce

Well-Known Member
Der TE kann ja mit den Werten sein System mal beobachten. Wie immer gilt - was bei einem super passt kann beim anderen schief gehen, ich denke mal, was den Speicherverbraucht angeht kommt es sehr auf die gehostete Applikation an.
 

checkmeck

New Member
Ich betreibe 2 Seiten mit dem Server. Das erste ist eine Webseite auf der Basis von Wordpress und die zweite dürfte keine Belastung verursachen, da dort nur eine einzelne index.html mit einer Meldung für den Umbau der Seite steht.
Da diese Seite bald aber wieder online gehen soll muss ich mich drum kümmern das der Webserver dann auch noch die zweite übernehmen kann.


Ich habe die Werte mal den letzten Tag beobachtet und eine Verbesserung gesehen, trotzdem habe ich das Gefühl, dass ein wenig Ram nichtmehr freigegeben wird und bis zum neustart von dem Apache Dienst in Benutzung ist.
Zur Erinnerung KeepAlive ist aus.
Was kann ich noch tun?
(P.S: Es geht zwar nicht in den kritischen Bereich aber der Ram könnte ja anderweitig als Puffer benutzt werden)
 

checkmeck

New Member
Vielleicht solltest Du Dich langsam mal von Deiner veralteten Apache+mod_php-Kombie verabschieden und aktuelle Zahlen mit Apache-2.4+mod_php-5.6 sammeln? Es hat sich einiges getan in den letzten Jahren (zumindest ausserhalb der Debian-Welt)...
Geht das an mich, oder an deinen Beitragschreiber vorher?
Also falls es an mich geht und ich nicht die aktuellsten Versionen benutze frage ich mich wie ich diese updaten sollte :confused:
 

checkmeck

New Member
Sollte ausreichend sein:
Code:
<IfModule mpm_prefork_module>
    StartServers              4
    MinSpareServers           4
    MaxSpareServers           4
    MaxRequestWorkers        16
    MaxConnectionsPerChild 5000
</IfModule>
Also wenn ich mal deine Konfiguation anwende sehe ich das es bei mir den Parameter MaxRequestWorkers nicht gibt. Trage ich ihn nachträglich ein kommt folgender Fehler:
Code:
Invalid command 'MaxRequestWorkers', perhaps misspelled or defined by a module not included in the server configuration
Action 'configtest' failed.
 

d4f

Müder Benutzer
Vielleicht solltest Du Dich langsam mal von Deiner veralteten Apache+mod_php-Kombie verabschieden
Seit wann bitte ist mod_php veraltet?
Aber ja, ich würde ja gerne alternative Lösungen zu Apache 2.2 mit mod_php einsetzen. Geht aber nicht.
Zum einen ändert Apache 2.4 nichts am fundamentalen Problem. mpm_event ist schlicht keine Universallösungen und die anderen (Detail)verbesserungen sind zwar nützlich aber tragen zu diesem Problem nichts bei. Ausserdem benimmt sich Apache 2.4 trotz verfügbaren Kompatibilitätmodulen/-patches anders als 2.2 was in hosting-Umgebungen eine einfache Umstellung verhindert und somit über Monate wenn nicht noch Jahre Apache 2.2-Umgebungen verlangt. Dann gäbe es natürlich auch noch die Sache mit den eigenentwickelten Apache-Modulen welche nach ersten Tests nicht ohne Umänderung mit 2.4 kompatibel zu sein scheinen.
Keine andere Apache-Kombination ausser mpm_itk und mod_php schafft es 5-stellig viele vHosts zu laden und gleichzeitig 5 Millionen Requests pro Tag ab zu arbeiten; zumindest nicht ohne enormen Ram-Bedarf oder gigantischem CPU-Overhead. Wir haben wohl hier unterschiedliche Anforderungen und Vorgaben was die Hostsysteme angeht.

starten mit ~30MB RES und sterben mit ~80MB RES
Freu dich darüber! Ich bin aktuell bei 688MB beim Start. Der Wert ist aber gott sei Dank ohne jegliche Aussage wegen (gelobt sei) COW Ram-Verwaltung. Kann es sein dass auf keinem deiner Hosts Wordpress zum Einsatz kommt? Der belegt locker und ohne zu Zögern gerne mal 100-200MB RAM...
(Ich hoffe aber den Start-Wert demnächst bei Produktiv-Setzung unserer nächsten Container-Generation deutlich drücken zu können)

und aktuelle Zahlen mit Apache-2.4+mod_php-5.6 sammeln? Es hat sich einiges getan in den letzten Jahren (zumindest ausserhalb der Debian-Welt)...
Was die PHP-Version mit dem Ram-Verbrauch zu tun haben soll ist mir schleierhaft. Ich sehe keine signifikanten Unterschiede im RAM-Bedarf der unterschiedlichen Apache-Container, ob nun mod_php Version 5.3, 5.4, 5.5 oder 5.6
 
Last edited by a moderator:

Joe User

Zentrum der Macht
Seit wann bitte ist mod_php veraltet?
Ich meinte die Kombi aus Apache <=2.2 und mod_php <=5.4

Zum einen ändert Apache 2.4 nichts am fundamentalen Problem.
Apache 2.4 geht sparsamer mit den Ressourcen um und gibt auch früher und mehr Speicher wieder frei als <=2.2.
Gleiches gilt für PHP 5.6 im Vergleich zu <=5.4

Ausserdem benimmt sich Apache 2.4 trotz verfügbaren Kompatibilitätmodulen/-patches anders als 2.2
Inwiefern?
Abgesehen von geringen Syntaxänderungen weniger Optionen, welche leicht per sed aktualisiert sind, hat sich an den Configs nichts geändert.
Die Änderungen unter der Haube sind zwar recht umfangreich, unterm Strich aber längst überfällig und auch noch besser umgesetzt als bei 2.2.

Dann gäbe es natürlich auch noch die Sache mit den eigenentwickelten Apache-Modulen welche nach ersten Tests nicht ohne Umänderung mit 2.4 kompatibel zu sein scheinen.
Sorry, aber Apache 2.3 wurde vor sechs Jahren (Apache 2.4 auch schon vor zwei Jahren) freigegeben und wer seine eigenen Module nicht ordentlich pflegt, der hat selbst Schuld. Sechs Jahre sind mehr als genug Zeit, selbst für Hobby-Devs.

Wir haben wohl hier unterschiedliche Anforderungen und Vorgaben was die Hostsysteme angeht.
Der OP hat andere Anforderungen und ihm helfen Deine veralteten Werte nicht.
(Ich auch, aber das ist hier tatsächlich mal irrelevant)

Ich bin aktuell bei 688MB beim Start. Der Wert ist aber gott sei Dank ohne jegliche Aussage wegen (gelobt sei) COW Ram-Verwaltung.
Ich schrieb extra RES dazu und 688MB RES hast auch Du nicht. Du meinst SIZE und der liegt bei mir auch zwischen 470MB und 550MB.
Von meinem Testsystem mit identischer Hardware/Software/Konfiguration des Livesystems:
Code:
[root@devint78:~] # top -atCUwww
last pid: 33373;  load averages:  0.10,  0.05,  0.05                                                                                    up 2+03:49:01  23:42:01
48 processes:  48 sleeping
CPU:  0.0% user,  0.0% nice,  0.1% system,  0.0% interrupt, 99.9% idle
Mem: 298M Active, 2490M Inact, 1205M Wired, 480K Cache, 1660M Buf, 27G Free
Swap: 64G Total, 64G Free

  PID USERNAME     THR PRI NICE   SIZE    RES STATE   C   TIME     CPU COMMAND
49293 www            1  20    0   482M 53540K lockf   2   0:00   0.00% /usr/local/sbin/httpd
56791 www            1  20    0   482M 48132K lockf   7   0:00   0.00% /usr/local/sbin/httpd
56012 www            1  20    0   482M 47848K lockf   4   0:00   0.00% /usr/local/sbin/httpd
50126 www            1  20    0   482M 47092K lockf   6   0:00   0.00% /usr/local/sbin/httpd
55406 www            1  20    0   482M 47444K kqread  5   0:00   0.00% /usr/local/sbin/httpd
73101 www            1  20    0   482M 46980K lockf   4   0:00   0.00% /usr/local/sbin/httpd
51083 www            1  20    0   482M 47756K lockf   6   0:00   0.00% /usr/local/sbin/httpd
71742 www            1  20    0   482M 48464K lockf   5   0:00   0.00% /usr/local/sbin/httpd
76143 www            1  20    0   482M 47148K lockf   1   0:00   0.00% /usr/local/sbin/httpd
73879 www            1  20    0   482M 48160K lockf   7   0:00   0.00% /usr/local/sbin/httpd
73787 www            1  20    0   482M 53280K lockf   7   0:00   0.00% /usr/local/sbin/httpd
75869 www            1  20    0   482M 47900K lockf   3   0:00   0.00% /usr/local/sbin/httpd
77091 www            1  20    0   482M 46268K lockf   3   0:00   0.00% /usr/local/sbin/httpd
 1661 www            1  20    0   482M 46476K lockf   2   0:00   0.00% /usr/local/sbin/httpd
 2583 www            1  20    0   482M 53804K lockf   7   0:00   0.00% /usr/local/sbin/httpd
 9313 www            1  20    0   478M 32160K lockf   3   0:00   0.00% /usr/local/sbin/httpd
27417 www            1  20    0   474M 31680K lockf   2   0:00   0.00% /usr/local/sbin/httpd
Kann es sein dass auf keinem deiner Hosts Wordpress zum Einsatz kommt? Der belegt locker und ohne zu Zögern gerne mal 100-200MB RAM...
Meine WebApps verschlingen zur Runtime auch gerne 150MB und mehr, dafür brauchts kein Wordpress ;)
Dieser RAM ist aber nicht dauerhaft futsch, sondern wird nach der Abarbeitung des Scripts (bis auf 8-16kb) wieder freigegeben.

Was die PHP-Version mit dem Ram-Verbrauch zu tun haben soll ist mir schleierhaft.
Die GC ist in 5.6 erheblich verbessert, wenn auch leider immernoch weit weg von optimal. Damit ist Dein Einwand aus Deinen ersten drei Posts, Apache+mod_php würde keinen RAM mehr freigeben hinfällig.
 

d4f

Müder Benutzer
Apache 2.4 geht sparsamer mit den Ressourcen um und gibt auch früher und mehr Speicher wieder frei als <=2.2.
Gleiches gilt für PHP 5.6 im Vergleich zu <=5.4
Zumindest für PHP kann ich das im Schnitt nicht bestätigen. PHP 5.5 / 5.6 sind effizienter aber wenn das darauf liegende Programm gelinde gesagt Mist macht dann ist das Resultat noch immer Mist - die mögliche Einsparung von paar MB Ram fallen da statistisch gar nicht erst auf. Leider kann (soll) man den Kunden aber nicht vorschreiben was sie verwenden sollen :D

Abgesehen von geringen Syntaxänderungen weniger Optionen, welche leicht per sed aktualisiert sind, hat sich an den Configs nichts geändert.
Genau hier ist einer der Schmerzenspunkte. Ich könnte vermutlich automatisiert alle .htaccess Dateien aller Kunden aktualisieren. Allerdings werden diese die Dateien im Rahmen von Synchronisierung, Updates oder automatisierten Anpassung (siehe Wordpress) wieder brav rückgängig machen und somit in ein gigantisches Chaos stürzen.

Die Änderungen unter der Haube sind zwar recht umfangreich, unterm Strich aber längst überfällig und auch noch besser umgesetzt als bei 2.2.
Da stimme ich voll zu aber leider ist und bleibt das nicht das einzige Argument für die Verwendung. Der Kunde ist schließlich König - im Rahmen dessen was sicherheitstechnisch und leistungsmäßig realisierbar bleibt.

Apache 2.3 wurde vor sechs Jahren
Apache 2.3 ist eine Entwicklungsversion (ungerade Minor-Version) und als solche für den durchschnittlichen Betreiber nicht sonderlich relevant.

wer seine eigenen Module nicht ordentlich pflegt, der hat selbst Schuld.
Es gibt einen deutlichen Unterschied zwischen "ordentlicher Pflege" und Notwendigkeit einer Aktualisierung. Klar, wenn man sich langweilt und nichts zu tun ist... generell gibt es aber wichtigere Arbeiten als ein Modul an eine möglicherweise in 2 Jahren eingesetzte Webserver Version zu optimieren - ganz unabhängig davon ob das Modul in 2 Jahren überhaupt noch relevant sein wird.

Der OP hat andere Anforderungen und ihm helfen Deine veralteten Werte nicht.
Mein lieber Joe, die Werte waren ganz allein für dich. Nicht für den OP.
Der braucht die bereits oben von mir vorgeschlagenen Werte-Bereiche in der Apache-Konfiguration, welche übrigens nicht auf solchen Systemen wie ich sie betreibe sinnvoll sind. Zumindest habe ich im Gegensatz zu dir zusäzlich noch seine Apache-Version korrekt erraten :cool:

Ich schrieb extra RES dazu und 688MB RES hast auch Du nicht.
Ob du es glaubst oder nicht, doch. Wie bereits gesagt; meine Systemanforderungen sind wohl deutlich höher als in deinem Umfeld üblich. SIZE/VSZ wären wir für einen neuen Prozess bei leicht über 1.19GB, hier mal ein kleiner Auszug aus ps;
(Beachte dass wie beschrieben mpm_itk zum Einsatz kommt, also die Apache-Prozesse vor vhost-Zuordnung dem Benutzer root gehören)
Code:
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root     28065  0.5  2.1 1610704 705636 ?      S    00:20   0:03

Damit ist Dein Einwand aus Deinen ersten drei Posts, Apache+mod_php würde keinen RAM mehr freigeben hinfällig.
Ich habe nicht überprüft ob die neue(re)n PHP-Versionen und Apache 2.4 eventuell in der Lage sind, durch mod_php vom Apache-Prozess angeforderten RAM wieder frei zu geben. Für mich ist es allerdings generell eh irrelevant da dieses Problem sich bei mpm_itk gar nicht erst stellt.
Diese Problematik bestand generell unabhängig von Apache's MaxMemFree und PHP's garbage collector. Letzterer war generell immer schon recht zuverlässig, wenngleich manchmal sehr spät aktiv.
 

Joe User

Zentrum der Macht
Ahh, OK, dann habe ich Dich teilweise Missverstanden und wir sind eigentlich in allen Punkten gleicher Meinung abgesehen vom Wert für MaxRequestsPerChild.
Einigen wir uns auf folgende Werte für 0815-RootServer?
Apache 2.2: 500
Apache 2.4: 5000



<OT>
Weisst Du zufällig wie fett die Apache-Prozesse bei Euch ohne PHP/Perl/Python/etc in etwa wären? Und kannst Du eventuell so gar abschätzen wieviel davon aufs Konto der Grösse der Konfiguration geht (ich hatte bisher nur zu Systemen mit <500 VHosts root-Zugang)?
Danke.
</OT>
 

d4f

Müder Benutzer
Einigen wir uns auf folgende Werte für 0815-RootServer?
Apache 2.2: 500
Apache 2.4: 5000
:D Ich kann damit leben :D

Weisst Du zufällig wie fett die Apache-Prozesse bei Euch ohne PHP/Perl/Python/etc in etwa wären?
Habe es mal schnell auf einem Dev-Host nachgestellt:
Von den 688MB kommen:
- 512MB für nur die Konfiguration (Das Ding braucht echt ewig für Reloads...)
- 127.5 MB für mod-php (hier PHP5.6 mit aktuell 26 zusätzlichen Modulen)
- 15.3 MB für mod-geoip
- 33.2 MB für den Rest (paar kleine Module und Core)

Und ja, so traurig es klingt aber der RAM-Verbrauch ist auf einem Apache der _nur_ PHP als serverseitige Sprache anbietet.
Der effektive RAM-Verbrauch pro Prozess ist aber, von Wordpress und Co mal abgesehen, recht niedrig. Generell ist die CPU eher am Anschlag als die RAM.
 
Last edited by a moderator:
Top