Unbekannte Ursache Absturz, MaxClients woher?

webass

New Member
Hallo,
ich habe auf dem kleinsten VPS- Angebot von webtropia einige Webseiten am Laufen.
Einige, weil drei oder vier Kunden Webseiten darauf mit Joomla betreiben und ich habe meinen Kram, worunter eine Seite ist die recht viel Besuchertraffic erhält, zwischen 1000 und 3500 Besuchern täglich.
Der VPS hat garantierten RAM von 1024. Virtuell 2048 MB.

Nun habe ich munin installiert, um zu sehen was das Probkem ist, dass der Server öfter regelmässig abstürzt.
Daran und am apache2 error.log kann man etwas erkennen, wenn man sich genügend auskennt.
Ich blicke leider nicht genügend durch.
Die meldung im apache2 ist wie folgt:
Code:
[Wed Apr 20 12:24:08 2011] [error] server reached MaxClients setting, consider raising the MaxClients setting
[Wed Apr 20 14:52:54 2011] [notice] caught SIGTERM, shutting down
[Wed Apr 20 14:52:55 2011] [notice] suEXEC mechanism enabled (wrapper: /usr/lib/apache2/suexec)
PHP Warning:  Module 'imap' already loaded in Unknown on line 0
PHP Warning:  Module 'mysql' already loaded in Unknown on line 0
Die Maxclients mit mpmprefork sehen so aus:
Code:
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_prefork_module>
StartServers       1
MinSpareServers    1
MaxSpareServers    5
MaxClients        90
MaxRequestsPerChild  10000
</IfModule>
Memory Belastung hier:
localhost.localdomain-memory-day.png
Und die entsprechenden Belastungen der Apache Prozesse in munin hier:
localhost.localdomain-apache_processes-day.png
Wie finde ich jetzt heraus was das Ding abkrachen läßt?

Danke im Voraus für jede Anregung.

MfG
Andre
 
Code:
<IfModule mpm_prefork_module>
StartServers       1
MinSpareServers    1
MaxSpareServers    5
MaxClients        90
MaxRequestsPerChild  10000
</IfModule>

Hast du das so gesetzt?

Die Fehlermeldung die du erhälst ist eindeutig und a) bei den Einstellungen b) bei der von dir genannten Besucherzahl absolut legitim. Wenn ich Server wäre würde ich auch die Grätsche machen.

Code:
[Wed Apr 20 12:24:08 2011] [error] server reached MaxClients setting, consider raising the MaxClients setting
 
Hallo,
erste Frage: Ja, nach einiger Recherche hier und so, im weltweiten netz habe ich das selber gemacht und ausgerechnet (ca 10-15 MB pro Thread des Apache*MaxClients= Höchstens Garantierte RAM).
Kommt also so Pi mal Daumen hin.
Allerdings hab ich nur die MaXClients geändert und die childrequests von unendlich auf 10.000 gesetzt.

Bin eines Nicht- Wissers linke und rechte Hand. :cool:
Äh, und Kopf.

Und das zweite erschreckt mich gerade etwas.
Weil der Server das zu dem Moment ja gar nicht wegstecken musste. Bis zum Serverabsturz waren laut Piwik gerade mal 90 eindeutige Besucher da.

Es entstehen Spitzen bei der Seite, das heisst als Google News Source, kommt es halt dazu, dass dann in kurzer Zeit viele Leute drauf kommen. Aber als der Absturz passierte wurde bereits länger, seit dem Tage zuvor, nichts gelistet...
Von daher. Ne Idee?

Max Clients= Maximale Clients (also Browser von Besuchern) pro Sekunde, oder pro tag, oder was ist da gemeint?

Allerdings habe ich das error.log voll mit so einem Kram hier:
Code:
[Sun Apr 17 07:52:26 2011] [error] [client 66.249.72.74] File does not exist: /var/www/confixx/html/gesperrt/susanwooten
[Sun Apr 17 07:52:57 2011] [error] [client 66.249.72.74] File does not exist: /var/www/confixx/html/gesperrt/makennaramsey
[Sun Apr 17 07:53:35 2011] [error] [client 66.249.72.74] File does not exist: /var/www/confixx/html/gesperrt/susanwooten
[Sun Apr 17 07:53:49 2011] [error] [client 66.249.72.74] File does not exist: /var/www/confixx/html/gesperrt/xavierlott
Das /blablablubbs hinten dran kommt von einer Blog-Farm, die ich einmal gehostet hatte und sauber gelöscht habe (in confixx, mysql und alles per Befehlszeile nachgeprüft und gelöscht, sowie die Domains und subdomains und das webXX allgemein) Also, glaube ich mal, dass ich sauber gelöscht habe.
Das war eine Wordpress MU installation mit über 1.500 Blogs und lauter content mit Backlinks, zu Artikelverzeichnissen, anderen Blogs und so weiter.
Wie ich das sehe und der Server- Hoster auch, versucht da jemand auf die Inhalte zu zugreifen. Kurz, bereits bei Suchmaschinen bekannte Links, werden abgeklopft von den Robots und da landen die im Nichts (/gesperrt) auf meinem Server.

Wie könnte man denn diese mögliche Fehlerquelle ausschalten?

danke dir.
andre
 
Max Clients= Maximale Clients (also Browser von Besuchern) pro Sekunde, oder pro tag, oder was ist da gemeint?

MaxClients sind die gleichzeitigen Requests, die Apache bearbeitet.

Verainfacht ausgedrückt: Greifen zum Zeitpunkt n 90 Besucher gleichzeitig auf die vHosts zu, werden 90 Prozesse (Childs) geforkt, von denen jeder einen Besucher versorgt, bis die MaxRequestsPerChild erreicht ist - dann stirbt der Prozess und MinSpareServers bzw. MaxSpareServers regulieren alles weitere.

Greifen zum Zeitpunkt n 100 Besucher gleichzeitig auf die vHosts zu, werden 90 sofort versorgt und 10 müssen warten, bis wieder 10 Prozesse frei sind.

Normalerweise sollte also der Apache keine Spagat machen, sondern mit etwas Verzögerung die Seiten ausliefern.

Allerdings ist es so, dass die 90 Prozesse Speicher brauchen. Neben dem OS und der anderen laufenden Software ist das insgesamt schon eine Ansage.

Da ich davon ausgehe, dass Dein Apache als Prefork läuft, wird PHP sicherlich als Modul eingebunden sein. Ich habe mit der Prefork/PHP als Modul keine Erfahrungen (nutze selbst FastCGI), aber PHP braucht mit aktueller Software leider oft mehr, als die 10-15 MB, die man im Netz immer findet.

Ich habe eine Wordpress-Instanz, die mit 65 MB (!!!) pro Request läuft - da macht jeder Rechner irgendwann schlapp. Nehmen wir mal an, Deine PHP-Request benutzen 25 MB:

Lt. Deiner Munin-Grafik werden mindestens 75 Prozesse geforkt worden. Die teilen sich auf in die Abarbeitung von statischen Infos (Bilder etc.) mit besagten ca. 10-15 MB und der Abarbeitung von Requests auf PHP-Seiten.

Wenn Du nur 40 PHP-Requests gleichzeitig bei ca. 25 MB hast und nochmal 35 statische Requests a 12 MB dazukommen, bist Du insgesamt nur für den Apachen bei 1420 MB Payload. Dazu kommt das ganze Geraffel vom OS und anderer Software (MySQL).

Deine Kiste hat 1024 garantiert und kann auf das doppelte "bursten" (aber nur, wenn der auf dem Host was frei ist!).

Du bist also deutlich im roten Bereich.

Du musst also erstmal herausfinden, wieviel Speicher deine Apache-Childs real benutzen. Dann musst Du die MaxClients auf einen Wert reduzieren, der dem Rest noch Luft zum Atmen gibt.

Ziel wäre, dass trotz Zugriffen im Überlastbereich der Server mit Verzögerung normal arbeitet. Dann kannst Du darüber nachdenken, auf eine grössere Kiste zu wechseln.
 
Danke-
das muss ich erst acht mal durchlesen.
Ich komm dann morgen mit der einen oder anderen Frage.

Danke. Danke. Danke. :cool:
Bis später!
 
keep-alive auf 2 Sekunden runtersetzen hilft zumindest kurzfristig, langfristig brauchst Du deutlich mehr echten RAM. Auch die MaxRequestsPerChild sind für potentiell memleakende Webapps wie Joomla und WP viel zu hoch angesetzt.
 
Hi,

auch für Deine Antwort vielen Dank. Alles sehr wichtig, was ihr schreibt, da muss ich grundsätzlich hinterher sein.
Also, mit ein wenige Justage müsste dass ja generell besser laufen.

Aber der Sachverhalt um ca. 12:00 Uhr ist aus keiner besonders serverbelastenden Situation entstanden.
Das was ich ja hier meinte:
Und das zweite erschreckt mich gerade etwas.
Weil der Server das zu dem Moment ja gar nicht wegstecken musste.

Wie gesagt, eine solche Lastspitze entsteht, wenn gerade frische Nachrichten von einem Autor ausgeschmissen werden. Zum Beispiel macht der Server nicht dicht, wenn die Seite gerade am Sonntag passiert ca. 2.800 Besucher am Nachmittag einlädt.
Da passiert nichts...

Dieser Absturz kam bei einem sehr schwachen Mittwoch Vormittag. Keine Knaller News kaum Traffic, trotzdem laden sich die Prozesse rein, und alles das was ihr beschreibt (mit Lösungsansatz) passiert.
Aber es war gar kein TRraffic da.
Da schwör ich drauf.
Kann ja nicht sein, dass am einen Abend in ein paar Stunden tausende Besucher drüber huschen und der Server nicht mal hustet und dann plötzlich kracht er bei 98 Besuchern ein.

Auch wichtig dabei ist, dass er das zirka immer nach ungefähr einer Woche macht.
Egal, ob da jetzt ein Besucherandrang ist oder nicht, offensichtlich.

Mmh.
Was hat es denn mit diesen Meldungen auf sich?
Code:
[Sun Apr 17 07:52:26 2011] [error] [client 66.249.72.74] File does not exist: /var/www/confixx/html/gesperrt/susanwooten
die ja unaufhörlich im Log stehen??

Ne Idee dazu?
Oder warum der Absturz ohne den dazugehörigen Traffiansturm passiert?

Danke allen die mitlesen ...
Ciao.
Andre
 
Code:
Hast du das so gesetzt?

[CODE]
[/QUOTE]
Hab das jetzt mal so eingesetzt:
[CODE]<IfModule mpm_prefork_module>
StartServers       3
MinSpareServers    3
MaxSpareServers    10
MaxClients        45
MaxRequestsPerChild  3000
</IfModule>
nachdem ich mir das hier genauer durchgelesen habe, weil ich "max requestes per child" in bezug auf Wordpress gegooglet hab.
Hoffe, das ist jetzt ein enig besser für die kleene VPS- Box von webtropia (wo ich bisher wirklch guten support bekommen habe.

Allerdings sehen die ab- tests
Code:
ab -n 500 -c 5 http://meineseite.de/
nicht mehr so schön aus jetzt.
Bis später.
Andre
 
Was hat es denn mit diesen Meldungen auf sich?
Code:
[Sun Apr 17 07:52:26 2011] [error] [client 66.249.72.74] File does not exist: /var/www/confixx/html/gesperrt/susanwooten
die ja unaufhörlich im Log stehen??

Nichts. Es wird irgendwo die angegebene Datei referenziert und nicht gefunden. Das kann im CSS sein, im HTML oder via PHP. Steht das so wortwörtlich im Log? Oder hast Du da was für das Forum geändert?

Wegen den 2800 Besuchern: Sagen wir mal, Du hast 3000 Besucher in 3 Stunden. Das macht 1000 Besucher/Stunde = 16.6 Besucher/s.

Diese 16.6 Besucher müssen nun noch in Requests umgewandelt werde, da Deine Seiten ja aus HTML, JS, CSS und Grafikdateien bestehen (jedes Element ist 1 Request). Wenn also jeder Besucher mit 4 Requests versorgt wird, bist Du mit 66 Requests gleichzeitig dabei.

Hier kann es also noch geradeso passen.

Allerdings sind das nur Mutmaßungen, man müsste konkret sehen, wie sich der Speicherverbraucht verhält. Wie sehen denn die Munin-Graphen zu der Zeit aus, wenn Nachrichten veröffentlicht werden?
 
Hi,
erste Frage: nichts dran verändert, da stehen etliche der Art drinne. Alles was sich ändert sind die "Ordndernamen" hinter dem letzten Slash.

Wegen der Requests, ist mir seit diesem Thread klar, dass da mehrere Dinger pro Besucher reinkommen.
Mein denken war immer beschränkt auf: Max Clients = Ein Besucher mit seinem Browser = Ein Request. Die Anderen Werte hatte ich auch nicht verstanden, zum Beispiel SpareServer.
SpareServer? Ich hab doch nur einen, den apache2.
So hab ich gedacht bisher.

Naja, und die Muningrafiken sehen die ganze Woche so aus, wie auf dem Image hier im Thread vor zwölf Uhr.
Keine derartigen Ausbrüche. Es werden jeden Tag Nachrichten veröffentlicht. Nur eben gestern vor dem Absturz keine und Piwik hatte nur 98 Besucher auf dem Schirm bis zu dem Moment.
Ich hänge hier mal die Woche rein:
 

Attachments

  • localhost.localdomain-apache_processes-week.png
    localhost.localdomain-apache_processes-week.png
    18.4 KB · Views: 232
Das verschafft Dir ausreichend Luft für die Requests:
Code:
KeepAlive On
KeepAliveTimeout 2
MaxKeepAliveRequests 100
<IfModule mpm_prefork_module>
    ServerLimit           128
    StartServers           32
    MinSpareServers         2
    MaxSpareServers         4
    MaxClients            128
    MaxRequestsPerChild  5000
</IfModule>
Keep-Alive zu deaktivieren halte ich für keine gute Idee, da Deine Seiten mehr als einen Request pro regulärem Client erfordern und dann künstlich ausgebremst würden.

Der Incoming Traffik kann ein kleiner Angriff gewesen sein, oder auch nur das Ausnutzen eines vergessenen und/oder fehlkonfigurierten mod_proxy.
Code:
httpd -M

Langfristig kommst Du aber um mehr RAM nicht rum, insbesondere die Datenbank wird es Dir danken.
 
Danke dir.
Ich habe die Werte jetzt mal so eingetragen.
Auch das Server Limit. (apache grundsätzlich 256 höchstens, richtig?)

Muss ich für das Server Limit noch woanders eine Eintragung vornehmen, als nur in der /etc/apache2/apache2.conf ?

Mit dem was Du überr mod_proxy schreibst kann ich gerade leide rnichts anfangen.
Die Eingabe der Zeile httpd -M hat auch nur bash- command not found erbracht.
 
Ach ja, ich würde gerne auch nicht verwendete Module abstellen, da das zum einen dem VPS und dem webserver arbeitet erspart und zum anderen (dem Link in deiner Sig folgend, Joe User) auch die Sicherheit erhöht.

Hat da jemand einen Tip, wie ich das erledigen kann und sicher bin, dass der ganze Dreck der drauf laufen muss, noch läuft, wenn ich fertig bin mit module auskommentieren?
Piwik, Joomla, Wordpresse, ein zwei Scripte mit curl, confixx, blabla...

Gibts ne Möglichkeit eine Übersicht zu bekommen, was wo gerade gebraucht wird?

danke vorab
 
Last edited by a moderator:
Gibts ne Möglichkeit eine Übersicht zu bekommen, was wo gerade gebraucht wird?
Fuer PHP gibt es 2 mir bekannte Methoden:

a) mit PECL::apd alle Funktionen eines Modules in einem prepend_file Skript overriden und mit dieser einen Log-Eintrag abspeichern welcher Ursprung des Aufrufs und aufgerufene Funktion dokumentiert. Danach die Funktion an die overriden Funktion weiterleiten.

b) Modul deaktivieren und mit Funktionen welche nur loggen ersetzten.
(Die PHP-interne Logfunktion wird von einigen CMS ausser Kraft gesetzt dadurch wuerde ich nicht darauf vertrauen)

Apache ist Trial & Error sowie Dokumentation lesen.

Da Apache und PHP die benoetigten Module erst wissen wenn die Anfrage abgearbeitet wird ist es somit sehr schwer zu schaetzen, wobei ein "grep -R funktions_name /KUNDEN/ORDNER" zumindest bei PHP eine erste Eeinschaetung liefern kann.
 
Auch das Server Limit. (apache grundsätzlich 256 höchstens, richtig?)
Richtig, ohne Patch sind es 256.

Muss ich für das Server Limit noch woanders eine Eintragung vornehmen, als nur in der /etc/apache2/apache2.conf ?
Nein.

Mit dem was Du überr mod_proxy schreibst kann ich gerade leide rnichts anfangen.
Wenn mod_proxy falsch konfiguriert ist, fungiert es als öffentlicher Proxy und kann bei "Misbrauch" (es ist rechtlich kein Misbrauch, nur technisch) hohen eingehenden Traffik verursachen. Für die technischen Details ist dieses Forum aber nicht der geeignete Ort, zumal das Problem seit Jahren existiert und nicht an der Wurzel gefixt wird...

Die Eingabe der Zeile httpd -M hat auch nur bash- command not found erbracht.
Je nach Distribution heisst das Binary anders, versuche mal die anderen gebräuchlichen Namen:
Code:
httpd2 -M
apache -M
apache2 -M

Nachtrag: Bezüglich der PHP-Module wäre ein URL zu phpinfo hilfreich.
 
Danke d4f udn Joe User!

Ahhh, okay.
Kümmer mich drum. Ich lade aber lieber eine PDF hier mit info.php hoch.

Wegen mod_proxy fang ich dannmal an zu surfen.
Auf jeden Fall habe ich dank dir wegen dem mpm prefork schon mal ein bessers Gefühl.

Es ist ja bereits soweit, dass ich jede Nacht den Server reboote mit einem cron so um 4:30, da mit der Kram einfach neu anfängt.
Das ist ja keine Lösung sondern nur eine Umwanderung des Problems.


Kann man ein script implementieren, das, nach dem der Server wegen maxclients abgeschmiert ist, den ganzen Kram postwendend rebootet?

So wäre eine Ausfallzeit minimiert und dass ohne das ich erst reagieren muss.
 
Kann man ein script implementieren, das, nach dem der Server wegen maxclients abgeschmiert ist, den ganzen Kram postwendend rebootet?
Das ist ja nur eine Automatisierung deiner Problemumgehung, und wieder kein praktikabler Fix.
Davon ausgehend dass es ein Angriff ist kann der Angreifer somit problemlos weitermachen...

Liste mal die Anzahl an offenen Verbindungen mit "lsof -i :80" (ggf 'lsof' nachinstallieren oder Alternativen wie netstat benutzen) wenn das Problem aufgetreten ist.
Versuche ausserdem ob mod_antiloris respektiv eine iptables-seitige Begrenzung der Anzahl an gleichzeitigen Verbindungen je IP sowie mod_evasive dein Problem in den Griff zu bringen schaffen.
 
Hi,
letzte Nacht gab es das Problem erneut.
Er hat diesmal wesentlich mehr ausgehalten also die Empfehlung das prefork modul einzustellen von Joe User hat auf jeden fall deutlich etwas gebracht.

Ich habe auch mal an den Ports gehorcht, sieht so aus:
Code:
# lsof -i :80
COMMAND   PID     USER   FD   TYPE     DEVICE SIZE NODE NAME
apache2 26398     root    4u  IPv6 1114649424       TCP *:www (LISTEN)
apache2 46589 www-data    4u  IPv6 1114649424       TCP *:www (LISTEN)
apache2 58543 www-data    4u  IPv6 1114649424       TCP *:www (LISTEN)
apache2 62502 www-data    4u  IPv6 1114649424       TCP *:www (LISTEN)
Kann daraus nur deuten, dass es mir seltsam erscheinen sollte, dass www-data drei mal offen ist.

Das mit dem mod_proxy aufruf ergab dies:
Code:
# apache2 -M
apache2: bad user name ${APACHE_RUN_USER}
Komm da gerade auch nicht weiter.
Ich werde nun mal antiloris installieren, wenn noch nicht vorhanden und je IP auf zehn Verbindungen begrenzen.

Ich alter Noob schau mal hinter den Kamin...
:D

Zum Vergleich noch mal die munin graphs:
Day:
localhost.localdomain-apache_processes-day-2.png

und week, dort, wo ein weisser abstand letzte Woche entstanden war, das war der Angriff vor den Änderungen an mpm prefork:
localhost.localdomain-apache_processes-week-2.png

Auf jeden fall war wieder kaum nennenswerter (verhältnismässig gesehen natürlich, paar hundert) Traffi zu dem Zeitpunkt auf dem Serrver.
Ich gehe wirklich von Angriffen aus.
 
Last edited by a moderator:
Back
Top