Startseite » wie man » Diagnose von Linux Server-Ladeproblemen mit einem einfachen Skript

    Diagnose von Linux Server-Ladeproblemen mit einem einfachen Skript

    Wenn Sie längere Zeit Administrator waren, haben Sie sicherlich Situationen entdeckt, in denen ein Server die CPU-Auslastung, die Speicherauslastung und / oder die Auslastung stark belastet. Wenn Sie "top" ausführen, erhalten Sie auch nicht immer die Antwort. Wie finden Sie also diese hinterlistigen Prozesse, die Ihre Systemressourcen auffressen, um sie zu töten??

    Das folgende Skript kann möglicherweise helfen. Es wurde für einen Webserver geschrieben, daher gibt es einige Teile, die speziell nach httpd-Prozessen suchen, und einige, die sich mit MySQL beschäftigen. Kommentieren / löschen Sie diese Abschnitte je nach Server-Bereitstellung und fügen Sie weitere hinzu. Es sollte als Ausgangspunkt verwendet werden.

    Voraussetzung für diese Version des Skripts ist eine Freeware, die unter der GNU General Public License namens mytop (verfügbar unter http://jeremy.zawodny.com/mysql/mytop/) veröffentlicht wird. Dies ist ein hervorragendes Werkzeug zur Überprüfung der Leistung von MySQL. Es wird alt, funktioniert aber immer noch gut für unsere Zwecke hier.
    Außerdem verwende ich mutt als Mailer. Möglicherweise möchten Sie das Skript so ändern, dass es einfach das in Mail gebaute Hilfsprogramm "mail" verwendet. Ich lasse es jede Stunde per cron laufen; anpassen, wie Sie es für richtig halten. Oh, und dieses Skript muss als root ausgeführt werden, da es aus einigen geschützten Bereichen des Servers liest.

    Also lass uns anfangen, sollen wir?

    Legen Sie zunächst Ihre Skriptvariablen fest:

    #! / bin / bash
    #
    # Skript zur Überprüfung der durchschnittlichen Systemlast der Last, um zu ermitteln, ob dies der Fall ist
    # welche Prozesse es zu hoch machen ...
    #
    # 07Jul2010 tjones
    #
    # Umgebung einstellen
    dt = "Datum +% d% b% Y-% X"
    # Ändern Sie selbstverständlich die folgenden Verzeichnisse dahin, wo Ihre Protokolldateien tatsächlich gespeichert werden
    tmpfile = "/ tmp / checkSystemLoad.tmp"
    logfile = "/ tmp / checkSystemLoad.log"
    msgLog = "/ var / log / messages"
    mysqlLog = "/ var / log / mysqld.log"
    # Der erste Mailstop ist eine Standard-E-Mail für Berichte. Zweite ist für Handy (mit einem reduzierten Bericht)
    mailstop = "[email protected]"
    mailstop1 = "[email protected]"
    machine = "hostname"
    # Die folgenden drei sind für die Verwendung von mytop - verwenden Sie einen Datenbankbenutzer mit anständigen Rechten
    dbusr = "Benutzername"
    dbpw = "Passwort"
    db = "yourdatabasename"
    # Das Folgende ist das Lastniveau, auf das Sie prüfen sollten - 10 ist wirklich hoch, Sie sollten es also senken.
    levelToCheck = 10

    Prüfen Sie als Nächstes Ihre Auslastung, um zu sehen, ob das Skript fortgesetzt werden soll:

    # Setze Variablen aus dem System:
    loadLevel = "cat / proc / loadavg | awk" print $ 1 "
    loadLevel = $ (printf "% 0.f" $ loadLevel)

    # Wenn der Ladestand höher ist als Sie möchten, starten Sie den Skriptprozess. Andernfalls beenden Sie 0

    if [$ loadLevel -gt $ levelToCheck]; dann
    echo ""> $ tmpfile
    echo "*************************************" ">> $ tmpfile
    echo "Date: $ dt" >> $ tmpfile
    echo "Systemlast und Prozesse prüfen" >> $ tmpfile
    echo "*************************************" ">> $ tmpfile

    Fahren Sie mit den Prüfungen fort und schreiben Sie die Ergebnisse in die temporäre Datei. Fügen Sie hier Elemente hinzu oder löschen Sie sie, wenn dies auf Ihre Situation zutrifft:

    # Holen Sie sich mehr Variablen vom System:
    httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"

    # Aktuelle Laststufe anzeigen:
    echo "Load Level Is: $ loadLevel" >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile

    # Anzahl der aktuell laufenden httpd-Prozesse anzeigen (ohne Kinder):
    echo "Anzahl der httpd-Prozesse jetzt: $ httpdProcesses" >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Prozessliste anzeigen:
    echo "Prozesse laufen jetzt:" >> $ tmpfile
    ps f -ef >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Aktuelle MySQL-Informationen anzeigen:
    echo "Ergebnisse von mytop:" >> $ tmpfile
    / usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    Beachten Sie mit dem Befehl top, dass wir in zwei temporäre Dateien schreiben. Eine ist für die viel kleinere Nachricht an das Handy. Wenn Sie die Dringlichkeit von Handybenachrichtigungen um drei Uhr morgens nicht möchten, können Sie dies herausnehmen (und die zweite Mailingroutine später im Skript herausnehmen)..


    # Aktuelles top anzeigen:
    echo "top zeigt jetzt:" >> $ tmpfile
    echo "top zeigt jetzt:" >> $ topfile
    / usr / bin / top -b -n1 >> $ tmpfile
    / usr / bin / top -b -n1 >> $ topfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    Weitere Prüfungen:


    # Aktuelle Verbindungen anzeigen:
    echo "netstat zeigt jetzt:" >> $ tmpfile
    / bin / netstat -p >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Überprüfen Sie den Speicherplatz
    echo "Speicherplatz:" >> $ tmpfile
    / bin / df -k >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    Dann schreiben Sie den Inhalt der temporären Datei in eine dauerhaftere Protokolldatei und senden Sie die Ergebnisse per E-Mail an die entsprechenden Parteien. Das zweite Mailing ist das reduzierte Ergebnis, das einfach aus dem Standard "top" besteht:

    # Ergebnisse an Protokolldatei senden:
    / bin / cat $ tmpfile >> $ logfile

    # Und E-Mail-Ergebnisse an sysadmin:
    / usr / bin / mutt -s "$ machine hat eine hohe Auslastung! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile

    Und dann etwas Hauswirtschaft und Ausgang:

    # Und dann die temporäre Datei entfernen:
    rm $ tmpfile
    rm $ topfile
    fi

    #
    Ausfahrt 0

    Hoffentlich hilft das jemandem da draußen. Vollständig zusammengesetztes Skript ist:

    #! / bin / bash
    #
    # Skript zur Überprüfung der durchschnittlichen Systemlast der Last, um festzustellen, welche Prozesse ausgeführt werden
    # es zu hoch nehmen ...
    #
    # Umgebung einstellen
    dt = "Datum +% d% b% Y-% X"
    # Ändern Sie selbstverständlich die folgenden Verzeichnisse dahin, wo Ihre Protokolldateien tatsächlich gespeichert werden
    tmpfile = "/ tmp / checkSystemLoad.tmp"
    logfile = "/ tmp / checkSystemLoad.log"
    msgLog = "/ var / log / messages"
    mysqlLog = "/ var / log / mysqld.log"
    # Der erste Mailstop ist eine Standard-E-Mail für Berichte. Zweite ist für Handy (mit einem reduzierten Bericht)
    mailstop = "[email protected]"
    mailstop1 = "[email protected]"
    machine = "hostname"
    # Die folgenden drei sind für die Verwendung von mytop - verwenden Sie einen Datenbankbenutzer mit anständigen Rechten
    dbusr = "Benutzername"
    dbpw = "Passwort"
    db = "yourdatabasename"
    # Das Folgende ist das Lastniveau, auf das Sie prüfen sollten - 10 ist wirklich hoch, Sie sollten es also senken.
    levelToCheck = 10
    # Setze Variablen aus dem System:
    loadLevel = "cat / proc / loadavg | awk" print $ 1 "
    loadLevel = $ (printf "% 0.f" $ loadLevel)

    # Wenn der Ladestand höher ist als Sie möchten, starten Sie den Skriptprozess. Andernfalls beenden Sie 0

    if [$ loadLevel -gt $ levelToCheck]; dann
    echo ""> $ tmpfile
    echo "*************************************" ">> $ tmpfile
    echo "Date: $ dt" >> $ tmpfile
    echo "Systemlast und Prozesse prüfen" >> $ tmpfile
    echo "*************************************" ">> $ tmpfile

    # Holen Sie sich mehr Variablen vom System:
    httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"

    # Aktuelle Laststufe anzeigen:
    echo "Load Level Is: $ loadLevel" >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile

    # Anzahl der aktuell laufenden httpd-Prozesse anzeigen (ohne Kinder):
    echo "Anzahl der httpd-Prozesse jetzt: $ httpdProcesses" >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Prozessliste anzeigen:
    echo "Prozesse laufen jetzt:" >> $ tmpfile
    ps f -ef >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Aktuelle MySQL-Informationen anzeigen:
    echo "Ergebnisse von mytop:" >> $ tmpfile
    / usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Aktuelles top anzeigen:
    echo "top zeigt jetzt:" >> $ tmpfile
    echo "top zeigt jetzt:" >> $ topfile
    / usr / bin / top -b -n1 >> $ tmpfile
    / usr / bin / top -b -n1 >> $ topfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Aktuelle Verbindungen anzeigen:
    echo "netstat zeigt jetzt:" >> $ tmpfile
    / bin / netstat -p >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Überprüfen Sie den Speicherplatz
    echo "Speicherplatz:" >> $ tmpfile
    / bin / df -k >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Ergebnisse an Protokolldatei senden:
    / bin / cat $ tmpfile >> $ logfile

    # Und E-Mail-Ergebnisse an sysadmin:
    / usr / bin / mutt -s "$ machine hat eine hohe Auslastung! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile

    # Und dann die temporäre Datei entfernen:
    rm $ tmpfile
    rm $ topfile
    fi

    #
    Ausfahrt 0