Grinsebert: (QUASI ~) Serverauslastung

Hi!
Gerade hab ich gesehen, dass beispielsweise das Suchskript auf diesem Server sich verweigert, wenn der Server ausgelastet ist. Wie geht sowas (die Serverlast im Skript zu erkennen)?
Viele Grüße
Grinsebert

  1. Joho,

    Gerade hab ich gesehen, dass beispielsweise das Suchskript auf diesem Server sich
    verweigert, wenn der Server ausgelastet ist. Wie geht sowas (die Serverlast im Skript zu
    erkennen)?

    Man parst einfach uptime oder vmstat ;-) Bei nem Load ueber 2 sollte man dann sich
    Gedanken machen.

    Gruss,
     CK
     http://wwwtech.de

    1. Gleichfalls joho,

      Gerade hab ich gesehen, dass beispielsweise das Suchskript auf diesem Server sich
      verweigert, wenn der Server ausgelastet ist. Wie geht sowas (die Serverlast im Skript zu
      erkennen)?
      Man parst einfach uptime oder vmstat ;-)

      Ähh... und was heißt das jetzt genau bzw. wo kann ich darüber noch was (möglichst auf deutsch) finden?
      Filet Grüße
      Grinesbert

      1. Hallo Grinesbert,

        Ähh... und was heißt das jetzt genau bzw. wo kann ich darüber noch was (möglichst auf deutsch) finden?

        "uptime" und "vmstat" sind einfach Kommandos, die man unter einer Unix-Shell eingeben kann, um entsprechende Befehle aufzurufen. Wie man diese Befehle aufruft, was sie an Parametern erwarten und welche Daten sie zurueckgeben, kannst du in den zugehoerigen Man-Pages nachlesen, die zu jedem Unix-System gehoeren und zigtausendfach im Web rumliegen. Hier zwei direkte Links:
        http://www-iiuf.unifr.ch/cgi-bin/man-cgi?uptime
        http://www-iiuf.unifr.ch/cgi-bin/man-cgi?vmstat

        In Perl kann man solche Kommandos mit der Funktion system() aus einem Script heraus ausfuehren. Beispiel:
        my $Ergebnis = system("vmstat");
        Und dann musst dein Script halt $Ergebnis z.B. mit Hilfe regulaerer Ausdruecke auseinanderdroeseln und aus den ermittelten Werten seine Reaktionen ableiten.

        Christian moege mich korrigieren, wenn man es anders macht ;-)

        viele Gruesse
          Stefan Muenz

        1. Hallo Stefan, hallo Christian,

          In Perl kann man solche Kommandos mit der Funktion system() aus einem Script heraus ausfuehren. Beispiel:
          my $Ergebnis = system("vmstat");
          Und dann musst dein Script halt $Ergebnis z.B. mit Hilfe regulaerer Ausdruecke auseinanderdroeseln und aus den ermittelten Werten seine Reaktionen ableiten.

          Kann mir jemand bitte nocheinmal etwas genauer erläutern, welche Rückgabewerte mir in diesem Fall nützlich sind und ab welchen Werten ich meinen Server als ausgelastet betrachten kann?

          Vielen Dank im Voraus

          • Thomas
          1. Hallo Thomas,

            Kann mir jemand bitte nocheinmal etwas genauer erläutern, welche Rückgabewerte mir in diesem Fall nützlich sind und ab welchen Werten ich meinen Server als ausgelastet betrachten kann?

            Also ich hab jetzt noch mal im Suchscript nachgeguckt. Dort steht einfach:

            use CGI qw/redirect/;

            zuerst schauen: wieviele Prozesse laufen?

            my $prozesses = ps -e | grep such.pl | grep -v grep | wc -l;
            if($prozesses > 3) {
             print redirect(-status => 301, -uri => 'http://www.teamone.de/selfaktuell/src/suche_max.htm');
             exit 0;
            }

            Waere natuerlich auch eine Antwort gewesen ... :-)

            viele Gruesse vom Allesoffenleger
              Stefan Muenz

            1. Hallo Stefan,

              vielen Dank für die schnelle Antwort, ich werde mal sehen, wie ich das bei mir einbauen kann :-).

              Viele Grüße

              • Thomas
            2. Joho Stefan,

              Kann mir jemand bitte nocheinmal etwas genauer erläutern, welche Rückgabewerte mir in
              diesem Fall nützlich sind und ab welchen Werten ich meinen Server als ausgelastet
              betrachten kann?

              Von uptime die Ausgabe sieht ungefaehr wie folgt aus:

              5:13PM  up 12 mins, 1 user, load averages: 0.58, 0.44, 0.25

              Die relevanten Angaben sind "load avarages: 0.58, 0.44, 0.25". Das ist der Load in den letzten
              5 Minuten, 10 Minuten und 15 Minuten. Bei einem Load zwischen 2 und 1 hat der Prozessor gut
              zu tun, bei einem hoeheren Load sollte man anfangen, sich Gedanken ueber Optimierungen
              machen ;-)

              Also ich hab jetzt noch mal im Suchscript nachgeguckt. Dort steht einfach:

              *schaem* Das ist eine relativ billige Loesung, weil die Suche so viel CPU-Zeit frisst.

              Gruss,
               CK
               http://wwwtech.de

              1. Hi,

                Die relevanten Angaben sind "load avarages: 0.58, 0.44, 0.25". Das ist der Load in den letzten
                5 Minuten, 10 Minuten und 15 Minuten.

                Zitat:
                     The uptime command prints the current time,  the  length  of
                     time  the system has been up, and the average number of jobs
                     in the run queue over the last 1, 5 and 15 minutes.  It  is,
                     essentially,  the first line of a w(1) command.

                Nobody's perfect, oder?
                Grinsebert

                1. Joho,

                  Nobody's perfect, oder?

                  Und schon gar nicht ich.

                  Gruss,
                   CK

            3. Moin!

              print redirect(-status => 301, -uri => 'http://www.teamone.de/selfaktuell/src/suche_max.htm');

              301 bedeutet eine permanente Umleitung, was natuerlich nicht gewuenscht ist. 302 waere der richtige Statuscode. Ideal waere allerdings, die Datei selber einzulesen und an den Browser durchzuleiten, dann koennte der Benutzer naemlich zu gegebener Zeit einfach Reload druecken, um zu sehen, ob er jetzt suchen darf.

              So long

              1. Joho Calo,

                301 bedeutet eine permanente Umleitung, was natuerlich nicht gewuenscht ist.

                Richtig, da habe ich mich in der RFC verlesen wohl.

                302 waere der richtige Statuscode.

                print redirect(-status => 302, -uri => 'http://www.teamone.de/selfaktuell/src/suche_max.htm');
                ;-)

                Ideal waere allerdings, die Datei selber einzulesen und an den Browser durchzuleiten, dann
                koennte der Benutzer naemlich zu gegebener Zeit einfach Reload druecken, um zu sehen, ob
                er jetzt suchen darf.

                Das habe ich absichtlich nicht gemacht, weil ja dann mit Sicherheit Leute relativ dauernd
                Reload druecken ;-)

                Gruss,
                 CK
                 http://wwwtech.de

        2. hi!

          In Perl kann man solche Kommandos mit der Funktion system() aus
          einem Script heraus ausfuehren. Beispiel:
          my $Ergebnis = system("vmstat");
          Und dann musst dein Script halt $Ergebnis z.B. mit Hilfe
          regulaerer Ausdruecke auseinanderdroeseln und aus den ermittelten
          Werten seine Reaktionen ableiten.

          perldoc -f system:
             [...]
             The return value is the exit status of the program as returned
             by the "wait" call. To get the actual exit value divide by 256.
             See also the exec entry elsewhere in this document. This is
             *not* what you want to use to capture the output from a command,
             for that you should use merely backticks or "qx//", as described
             in the section on "STRING" in the perlop manpage. Return value
             of -1 indicates a failure to start the program (inspect $! for
             the reason).
             [...]

          Besonders wichtig in diesem Zusammenhang erscheint mit die fett-
          gedruckte Stellte mit dem *not*... ;)

          Also, wie es dort schon steht: Backticks oder qx// verwenden!

          bye, Frank!

          1. Hallo Frank

            danke fuer den Hinweis!
            Ich hatte das mit dem Return-Code zwar auch gelesen (sogar bei mir selber *g*), aber irrtuemlich doch falsch beschrieben hier ...

            viele Gruesse
              Stefan Muenz

          2. Hi,
            danke erstmal für eure Hilfe.

            hi!

            In Perl kann man solche Kommandos mit der Funktion system() aus
            einem Script heraus ausfuehren. Beispiel:
            my $Ergebnis = system("vmstat");
            Und dann musst dein Script halt $Ergebnis z.B. mit Hilfe
            regulaerer Ausdruecke auseinanderdroeseln und aus den ermittelten
            Werten seine Reaktionen ableiten.

            perldoc -f system:
               [...]
               The return value is the exit status of the program as returned
               by the "wait" call. To get the actual exit value divide by 256.
               See also the exec entry elsewhere in this document. This is
               *not* what you want to use to capture the output from a command,
               for that you should use merely backticks or "qx//", as described
               in the section on "STRING" in the perlop manpage. Return value
               of -1 indicates a failure to start the program (inspect $! for
               the reason).
               [...]

            Besonders wichtig in diesem Zusammenhang erscheint mit die fett-
            gedruckte Stellte mit dem *not*... ;)

            Also, wie es dort schon steht: Backticks oder qx// verwenden!

            nur um sicher zu gehen:
            $var=´uptime´;
            oder
            $var=qx/uptime/;
            ist das korrekt?
            MfG
            Grinsebert

            1. nur um sicher zu gehen:
              $var=´uptime´;

              Nein,
                $var = uptime;
              waere richtig. (Backticks sind die von links oben nach rechts unten, vgl. Backslash.)

              oder
              $var=qx/uptime/;
              ist das korrekt?

              Das hier ja. Wenn Du aber den / als Teil der Befehlszeile haben willst, musst Du Dir einen anderen Delimiter suchen:
                $var = qx|/home/me/myprog|;

              So long