Alexanders: Vor Überlastung schützen

Hallo,

ich benutze folgendes Script (PHP) um den Server vor Überlastung zu schützen:

$loadavg_array = explode(" ", exec("cat /proc/loadavg"));
$loadavg = (isset($loadavg_array[0]) && $loadavg_array[0]) ? $loadavg_array[0] : 0;
if( $loadavg > 12 ) {
    die('Überlastet!');
}

Das ist aber leider nicht immer so sicher (der Server wird trotzdem ab und zu überlastet). Gibt es (kennt jemand) einen anderen Tool? Wünschenswert in PHP.

Gruss Alexander.

  1. Moin!

    Das ist aber leider nicht immer so sicher (der Server wird trotzdem ab und zu überlastet).

    Definiere "überlastet". Wenn der Serverload über 12 steigt (das ist ein Wert, den ein Server eigentlich im normalen Betrieb niemals erreichen sollte), steigt dein Skript aus dem Programm aus.

    Allerdings muß der Server, um aus dem Skript aussteigen zu können, das PHP-Skript erstmal aufwendig geparst haben etc., was natürlich wieder Last verursacht.

    Gibt es (kennt jemand) einen anderen Tool?

    Christian Kruse hat mod_loadavg geschrieben, ein Apachemodul, welches konfigurierbar bei Erreichen einer gewissen Lastgrenze den Request abfängt und lastarm mit einem Fehlerstatus beantwortet.

    Siehe </archiv/2005/1/t98243/>

    - Sven Rautenberg

    --
    My sssignature, my preciousssss!
    1. Definiere "überlastet". Wenn der Serverload über 12 steigt (das ist ein Wert, den ein Server eigentlich im normalen Betrieb niemals erreichen sollte), steigt dein Skript aus dem Programm aus.

      Soweit ich das entdecken konnte fährt der Googlebot und noch ein Paar andere Bots über die Seiten und scannen (allein Google ca. 1.000 Seiten pro 10 Minuten). In diesen Momenten bleibt alles hängen und der Server kann zwar noch Pings erhalten reagiert aber weder im Shell noch über http.

      Gruss Alex.

      1. Moin!

        Definiere "überlastet". Wenn der Serverload über 12 steigt (das ist ein Wert, den ein Server eigentlich im normalen Betrieb niemals erreichen sollte), steigt dein Skript aus dem Programm aus.

        Soweit ich das entdecken konnte fährt der Googlebot und noch ein Paar andere Bots über die Seiten und scannen (allein Google ca. 1.000 Seiten pro 10 Minuten). In diesen Momenten bleibt alles hängen und der Server kann zwar noch Pings erhalten reagiert aber weder im Shell noch über http.

        Wenn dein Server mit 2 Seiten pro Sekunde nicht klarkommt, hast du ein ganz anderes Problem, und vermutlich liegt es auch ganz woanders.

        Was ist das überhaupt für ein Server? Eine echte Maschine, oder ein VServer? Ganz allein für dich, oder shared hosting? Datenbankanbindung? Wo liegt die? Gleiche Maschine, oder extern?

        Was passiert alles, wenn eine Seite ausgegeben werden muß? Skripte? Datenbankabfragen? Benutzen die den Index?

        Es gibt extrem viele Punkte, die man auf einem Server optimieren kann. Dazu muß man allerdings wissen, wie man erkennt, wo das Problem liegt. Wenn dein Server durch 2 Seitenanfragen pro Sekunde aus der Verfassung zu bringen ist, dann läuft da irgendwas falsch. Soviele Requests kann ja ein einziger DSL-angebundener Client verursachen.

        - Sven Rautenberg

        --
        My sssignature, my preciousssss!
        1. Moin!

          Wenn dein Server mit 2 Seiten pro Sekunde nicht klarkommt, hast du ein ganz anderes Problem, und vermutlich liegt es auch ganz woanders.

          Das ist ein ganz guter Server mit 64 Bit Technik (opteron 148) und 2GB Ram. Da läuft wiki-Software auf dem Server und weiter nichts.

          Was passiert alles, wenn eine Seite ausgegeben werden muß? Skripte? Datenbankabfragen? Benutzen die den Index?

          Die Daten werden mit PHP aus einer MySQL Datenbank genommen.

          Du hast Recht - es liegt irgendwo anderes. Das kann nicht sein, dass der Server keine 2 Anfragen pro Sekunde aushält...

          Wo soll ich nur anfangen?

          Gruss Alex.

          1. Moin!

            Wenn dein Server mit 2 Seiten pro Sekunde nicht klarkommt, hast du ein ganz anderes Problem, und vermutlich liegt es auch ganz woanders.

            Das ist ein ganz guter Server mit 64 Bit Technik (opteron 148) und 2GB Ram. Da läuft wiki-Software auf dem Server und weiter nichts.

            Nun ja, die Wikipedia hat mittlerweile ja ein riesiges Serverarray hingestellt und trotzdem Performanceprobleme.

            Was passiert alles, wenn eine Seite ausgegeben werden muß? Skripte? Datenbankabfragen? Benutzen die den Index?

            Die Daten werden mit PHP aus einer MySQL Datenbank genommen.

            Du hast Recht - es liegt irgendwo anderes. Das kann nicht sein, dass der Server keine 2 Anfragen pro Sekunde aushält...

            Wo soll ich nur anfangen?

            Zunächst solltest du deine Softwaredoku konsultieren und hinsichtlich eventueller Performancesteigerungen durchsehen. Kann man ein Caching aktivieren? Kann man die Datenbank optimieren? Hat die überhaupt die richtigen Indices verpaßt bekommen?

            Auch der Apache könnte hinsichtlich der Performance hilfreiche Zusatzinformationen an die Clients senden, also beispielsweise explizit Caching (für eine kürzere Zeit) erlauben - das spart dann Requests ein. Dazu gibts von Christian Kruse auch einen Artikel.

            Wenn das alles noch nicht fruchtet, hast du leider das Problem, dass du in die interne Programmierung deines Wikis einsteigen mußt, um analysieren zu können, welche Programmteile viel Zeit verbrauchen, und wie man diese Teile optimieren könnte.

            Eventuell ist bei deiner Leistungsanforderung PHP einfach nicht die richtige Sprache, und es wird Programmierung in C erforderlich. Oder die Datenbank ist dem Ansturm nicht gewachsen, weil extrem viele recht unnötige Querys gemacht werden, nur um inhaltlich unbedeutende Statistikinformationen zu gewinnen.

            - Sven Rautenberg

            --
            My sssignature, my preciousssss!