PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Automatischer Wartungsmodus bei hoher Serverauslastung



hankfromhelvete
15.09.2010, 00:22
Mit der folgenden Änderung wird der User bei einer hohen Serverlast automatisch auf die Wartungsseite umgeleitet. Dadurch verringert sich die Last und der User sollte, nachdem wieder genügend Ressourcen frei sind, die Seite aufrufen können. Der Admin kann die Seite wie bei dem 'normalen' Wartungsmodus weiterhin nutzen.

Vorwort
Zunächst solltet ihr euren load average beobachten. Wichtig dabei ist, dass Ihr einen Grenzwert feststellt, ab wann der Server in die Knie geht. Den Wert kann man sich z.b. mit folgendem Code ausgeben lassen:



$load = sys_getloadavg();
echo $load[0];

Wenn ihr einen 'Grenzwert' herausgefunden habt, müssen folgende Änderungen in der /lib/sessions.lib.php vorgenommen werden.

1. In ca. Zeile 23 unter


$pageconfig = mysql_fetch_array(db_query("SELECT * FROM ".$db_prefix."_seitenkonfig LIMIT 1"));folgenden Code einfügen


$load = sys_getloadavg();

2. Die if-Abfrage in ca. Zeile 24


if ($pageconfig['wartung'] == 1 && $_SESSION['uid'] != $admin_id) {ersetzen mit


if ($pageconfig['wartung'] == 1 && $_SESSION['uid'] != $admin_id || $load[0] > 90 && $_SESSION['uid'] != $admin_id) {Das wars :wink:


Hinweis
90 dient lediglich als Beispiel und sollte auf euren ermittelten 'Grenzwert' geändert werden.

Gremlin
15.09.2010, 00:27
Die 90 steht nicht für die prozentuale Auslastung, sondern für die durchschnittliche Anzahl der Prozesse in der Warteschlange.

Wenn du sowas machst würde ich $load[2] nutzen denn das ist innerhalb der letzten 15 Minuten, es kann nämlich mal schnell passieren, dass es viele sind, aber über einen kurzen Zeitruam macht das nichts aus.

Mal so ein kleiner Auszug hier vom Server aktuell:
[0] => 0.44 [1] => 0.69 [2] => 0.92 Damit wäre bei dir schon Wartungsmodus (bei 15 Minuten). Dabei ist der Server aktuell nicht mal 20% ausgelastet :-)

hankfromhelvete
15.09.2010, 01:09
Danke fürs Feedback. Das mit den % werde ich ändern.

Hmm, wenn ich [2] nehme, könnte die Wartung unnötig eingeschaltet werden, wie man bei deinen Werten z.B. sehen kann. Dann müsste ich den Wert auf 99 oder 100 setzen. [0] wäre eigentlich 'aktueller'.

Kraemer84
15.09.2010, 19:06
das ist genial kannste den fertigen code nochmal posten bitte ?

weil is nur ein gedanke aber bringt das nicht auch was bei bruteforceattacken ?

brute force überlastet ja den server mit befehlen und wenn dann noch so ein wartungsmodus reinkommt ist der ja auch für den der die bruteforce attacke startet ergo vllt sogar ein abbruch der brute force attacke ??

weil ich so ein mist überhaupt nicht gut heiße :knueppel:


oder


if ($pageconfig['wartung'] == 1 && $_SESSION['uid'] != $admin_id || $load[0] > 90 && $_SESSION['uid'] != $admin_id) {einfach ändern in


if ($pageconfig['wartung'] == 1 && $_SESSION['uid'] != $admin_id || $load[0] > 90% && $_SESSION['uid'] != $admin_id) { ?

hankfromhelvete
15.09.2010, 19:33
das ist genial kannste den fertigen code nochmal posten bitte ?

Der Code ist unverändert. Hatte nur die Beschreibung geändert.


bringt das nicht auch was bei bruteforceattacken ?

Wenn die Serverlast dadurch zu hoch wird ja.


if ($pageconfig['wartung'] == 1 && $_SESSION['uid'] != $admin_id || $load[0] > 90% && $_SESSION['uid'] != $admin_id) {Das wird nicht funktionieren, da der $load[0] keine % darstellt, wie Gremlin schon geschrieben hat. Man kann den Wert aber auch auf z.B. 95 stellen. Nur man sollte beachten, dass man nach oben hin noch etwas Performance braucht.

Wenn man keine direkte Möglichkeit hat $load[0] zu kontrollieren, kann man den per echo ausgeben um so einen angemessenen Wert zu ermitteln. Muss man eigentlich nur zu Spitzenzeiten mal beobachten :wink:

Gremlin
16.09.2010, 06:20
Falls aktuell jemand online ist. Nun fängt es hier langsam an zu laggen, weil nun komplettbackups laufen. Dennoch erreichbar und Speed okay. Aktuelle serverload:

Array ( [0] => 44.41 [1] => 28.87 [2] => 20.15 )

Also ich finde man sollte Wartung machen wenn > 10 hatte

Bei einem Projekt sowas auch mal drin ab >= 15 (bei [2] )

Es kommt jedoch auch auf den Server drauf an. Muss man individuell beobachten wie es bei einem selbst aussieht. Ich könnte hier bis 40 locker laufen lassen.

Prozentuale Werte wären da schon viel besser, aber da kommt man glaube ich irgendwie mit exec dran *grübel*

DeDiHo
16.09.2010, 09:08
ein load-wert von über 90? da wird jeder server vermutlich vorher schon ausgestiegen sein. bzw wieso hast du da ein % im code? wie schon gesagt ist der load absolut keine prozentuale angabe.

mal ein paar zeilen aus wikipedia



Load bezeichnet die momentan laufenden oder auf bestimmte Ereignisse wartenden Prozesse (http://de.wikipedia.org/wiki/Prozess_%28Informatik%29) auf einem Computersystem. Man spricht dabei davon, dass „der Rechner einen Load von X hat“ (wobei X eine natürliche Zahl größer gleich null ist). Sie wird landläufig mit der Auslastung (http://de.wikipedia.org/wiki/Auslastung) eines Computersystems (http://de.wikipedia.org/wiki/Computersystem) gleichgesetzt. In der Unix (http://de.wikipedia.org/wiki/Unix)-Welt, aus der der Begriff kommt, spricht man meistens von Load Average, dem Durchschnitt der Load-Werte über einen Zeitraum.
und



Die Load ist nicht die Auslastung des Computersystems, im speziellen nicht die Auslastung der CPU, sondern ein Maß dafür, wieviele gleichartige Systeme in einem Computer arbeiten müssten, um einen möglichen Engpass beseitigen zu können. Beispielsweise hat ein Computersystem einen Prozessor. Gleichzeitig benötigen zwei Prozesse die volle Rechenleistung (andere Ressourcen werden im Beispiel nicht beachtet). Das Betriebssystem (http://de.wikipedia.org/wiki/Betriebssystem) verteilt (http://de.wikipedia.org/wiki/Lastverteilung) nun die beiden Prozesse gleichmäßig so, dass Prozess 1 und Prozess 2 gleichmäßig viel Rechenleistung erhalten (Load Balancing). Die Load des Systems ist 2, die Auslastung der CPU liegt bei 100%. Man erweitert das Computersystem auf vier CPUs (http://de.wikipedia.org/wiki/Hauptprozessor). Das Betriebssystem verteilt diese Last nun auf die zwei Prozesse, so dass also immer zwei CPUs voll arbeiten können, die beiden anderen liegen brach. Trotzdem rechnen die Prozesse nun doppelt so schnell und der Rechner hat dabei immer noch eine Load von 2, die Auslastung der CPUs ist jedoch nur 50%. Durch eine Programmverbesserung ist es nun möglich, die Last der zwei Prozesse auf alle vier CPUs zu verteilen. Die Load ist dann immer noch 2, die CPUs werden dabei aber zu 100% ausgelastet, das heißt, die beiden Programme rechnen nochmal doppelt so schnell.
und weiter



Ein Load Average von 0 sagt zum Beispiel aus, dass sämtliche Betriebsmittel zur Verfügung stehen und das System die Aufgaben eines Benutzers mit maximaler Geschwindigkeit bearbeiten kann. Eine einheitliche obere Grenze für den Load-Wert gibt es nicht. Je nach Anzahl der CPUs und anderen Betriebsmittel (http://de.wikipedia.org/wiki/Betriebsmittel_%28Informatik%29) wie zum Beispiel vorhandener RAM (http://de.wikipedia.org/wiki/Random_Access_Memory) gibt es jedoch in der Regel stets einen Wert, ab dem das System unbenutzbar wird, denn ein hoher Load Average-Wert wird durch viele gleichzeitig laufende Prozesse hervorgerufen, die Rechenzeit (http://de.wikipedia.org/wiki/Rechenzeit) benötigen.
und je nachdem was man selbst für einen vserver / root-server besitzt, kann es sein, dass die maschine bei einem load von 2-4 am ende angekommen ist. andererseits kann es je nach anwendung oder verwendetem kernel zu einem ganz anderen verhalten kommen, obwohl der load sogar höher ist. (1000fps kernel hat generell höheren load)

und wenn das system von einem bruteforce angriff so dermaßen ausgelastet wird, sollte man sich gedanken machen, den ssh-port nur per port-knocking erreichbar zu machen und die logs von fail2ban oder denyhosts überwachen lassen, kostet zwar auch wieder leistung, aber ich hab lieber einen daemon der logs kontrolliert und suspekte IPs direkt aussperrt.



//edit

man könnte per top den idle wert auslesen und wenn dieser kleiner ist wie 10% die seite blocken



top -b -n 1 | grep Cpu | tr -s ' ' | cut -d" " -f 5 | cut -d"%" -f 1

hankfromhelvete
16.09.2010, 10:35
Hab den ersten Post mal aktualisiert. Am besten ist es wenn man erstmal einen Wert ermittelt, weil pauschal kann man es dann doch nicht sagen.

Prozentuale Werte wären wirklich nicht schlecht. Müsste man nur gucken wie man das machen könnte.

jpwfour
16.09.2010, 13:14
Aber doch nicht in der PHP Anwendung bei jedem Aufruf die Prozessorauslatung auslesen. Wenn dann sollte sich der Apache oder das PHP Modul/CGI direkt darum kümmern, wobei ich mich eh frage, wie man es mit Webanwendungen schafft, die CPU auszulasten :wink: Normalerweise ist ja eher zu wenig RAM vorhanden.

Mein Tipp: mit sar mitloggen lassen, und sollte die CPU mal ausgelastet sein, besseren Server holen :biggrin1:

DeDiHo
16.09.2010, 14:06
über den sinn kann man sich natürlich streiten und "top -b" brauch auch recht lange bis die ausgabe kommt, je nach länge der prozessliste. das vbulletin hat auch so eine option drin, wenn der loadavg über X steigt, wird das forum geschlossen. ich halt davon net viel, wie du schon sagtest: wenns eng wird aufrüsten :thumb:

hankfromhelvete
16.09.2010, 15:04
wenns eng wird aufrüsten

Wenns dauerhaft ist ja. Aber selbst dann kann es immer mal passieren, dass der Server mal kurzzeitig stark ausgelastet ist. Das lässt sich leider nicht verhindern :wink:

Bei klamm ist es ähnlich. Wenns eng wird = Wartung. Die aktiviert Lukas auch nicht immer manuell :biggrin1:

DJschatz27
16.10.2010, 16:48
moin

eine frage ist das so noch aktuell und wo frage ich diesen code ab:

$load = sys_getloadavg();echo $load[0];

hankfromhelvete
16.10.2010, 19:38
Ich habs bei mir in der wartung.php (http://www.losebene.de/wartung.php) (ganz unten rechts). So kann man den Wert jederzeit Prüfen ohne sich auf dem Server einloggen zu müssen.

Du kannst den Code aber auch im Footer einfügen und nachdem du den Wert ermittelt hast, wieder entfernen.

cr00sy
20.12.2010, 00:48
Also verstehe ich das nun richtig:

Wenn bei $load die zahl 40.36 steht müsste ich diese Zahl bei der Sessions.lib ebenfalls eintragen?

Gruß

hankfromhelvete
20.12.2010, 14:36
Wenn bei $load die zahl 40.36 steht müsste ich diese Zahl bei der Sessions.lib ebenfalls eintragen?

Wenn du ab 40.36 in Wartung gehen willst, ja.