Startpagina » hoe » Diagnose van Linux Server Load Problems met een Simple Script

    Diagnose van Linux Server Load Problems met een Simple Script

    Als je al een tijdje beheerder bent, heb je zeker situaties ontdekt waarbij een server spant in CPU-gebruik of geheugengebruik en / of laadniveaus. Het uitvoeren van 'top' geeft je ook niet altijd het antwoord. Dus hoe vind je die sluipende processen die je systeembronnen aan het opeten zijn om ze te kunnen doden?

    Het volgende script kan misschien helpen. Het is geschreven voor een webserver, dus sommige delen ervan zijn specifiek op zoek naar httpd-processen en sommige delen die te maken hebben met MySQL. Afhankelijk van uw serverimplementatie, commentaar / verwijder die secties en voeg anderen toe. Het zou voor een beginpunt moeten worden gebruikt.

    Vereisten voor deze versie van het script zijn een aantal freeware uitgebracht onder de GNU General Public License genaamd mytop (beschikbaar op http://jeremy.zawodny.com/mysql/mytop/), wat een fantastisch hulpmiddel is om te controleren hoe MySQL presteert. Het wordt oud, maar werkt nog steeds goed voor onze doeleinden hier.
    Daarnaast gebruik ik mutt als de mailer - misschien wilt u het script wijzigen om eenvoudig het ingebouwde linux-hulpprogramma 'mail' te gebruiken. Ik voer het elk uur via cron uit; aanpassen zoals je wilt. Oh - en dit script moet als root worden uitgevoerd, omdat het van sommige beveiligde gedeelten van de server leest.

    Dus laten we beginnen, zullen we?

    Stel eerst uw scriptvariabelen in:

    #! / Bin / bash
    #
    # Script om de gemiddelde systeemniveau's te controleren om te proberen te bepalen
    # welke processen nemen het overdreven hoog ...
    #
    # 07Jul2010 tjones
    #
    # ingestelde omgeving
    dt = "datum +% d% b% Y-% X"
    # Verander natuurlijk de volgende mappen naar waar uw logbestanden daadwerkelijk worden bewaard
    tmpfile = "/ tmp / checkSystemLoad.tmp"
    logfile = "/ tmp / checkSystemLoad.log"
    msgLog = "/ var / log / messages"
    mysqlLog = "/ var / log / mysqld.log"
    # de eerste e-mailstop is standaard e-mail voor rapporten. De tweede is voor een mobiele telefoon (met een gereduceerd rapport)
    mailstop = "[email protected]"
    mailstop1 = "[email protected]"
    machine = "hostnaam"
    # De volgende drie zijn voor gebruik door mytop - gebruik een db-gebruiker met fatsoenlijke rechten
    dbusr = "gebruikersnaam"
    dbpw = "password"
    db = "yourdatabasename"
    # Het volgende is het laadniveau dat moet worden gecontroleerd - 10 is erg hoog, dus u kunt het misschien verlagen.
    levelToCheck = 10

    Controleer vervolgens uw laadniveau om te zien of het script moet doorgaan:

    # Variabelen instellen van systeem:
    loadLevel = "cat / proc / loadavg | awk" print $ 1 "
    loadLevel = $ (printf "% 0.f" $ loadLevel)

    # als het laadniveau groter is dan u wilt, start u het scriptproces. Anders sluit u 0 af

    als [$ loadLevel -gt $ levelToCheck]; dan
    echo ""> $ tmpfile
    echo "******************************" >> $ tmpfile
    echo "Datum: $ dt" >> $ tmpfile
    echo "Controleer systeem Load & Processes" >> $ tmpfile
    echo "******************************" >> $ tmpfile

    En ga door met de controles en schrijf de resultaten naar het tijdelijke bestand. Voeg hier items toe of verwijder ze, indien van toepassing op uw situatie:

    # Haal meer variabelen uit het systeem:
    httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"

    # Toon huidig ​​laadniveau:
    echo "Laadniveau is: $ loadLevel" >> $ tmpfile
    echo "**************************************** * ">> $ tmpfile

    # Toon aantal httpd-processen dat nu actief is (niet inclusief kinderen):
    echo "Aantal httpd-processen nu: $ httpdProcesses" >> $ tmpfile
    echo "**************************************** * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Toon proceslijst:
    echo "Processen nu uitgevoerd:" >> $ tmpfile
    ps f -ef >> $ tmpfile
    echo "**************************************** * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Toon huidige MySQL-info:
    echo "Resultaten van mytop:" >> $ tmpfile
    / usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
    echo "**************************************** * ">> $ tmpfile
    echo "" >> $ tmpfile

    Let op met de opdracht top, we schrijven naar twee tijdelijke bestanden. Een daarvan is voor het veel kleinere bericht naar de mobiele telefoon. Als je de urgentie van GSM-meldingen om drie uur 's nachts niet wilt hebben, kun je dit verwijderen (en de tweede mailroutine later in het script verwijderen).


    # Huidige top tonen:
    echo "bovenaan toont nu:" >> $ tmpfile
    echo "bovenaan toont nu:" >> $ topfile
    / usr / bin / top -b -n1 >> $ tmpfile
    / usr / bin / top -b -n1 >> $ topfile
    echo "**************************************** * ">> $ tmpfile
    echo "" >> $ tmpfile

    Meer controles:


    # Toon huidige verbindingen:
    echo "netstat laat nu zien:" >> $ tmpfile
    / bin / netstat -p >> $ tmpfile
    echo "**************************************** * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Controleer schijfruimte
    echo "disk space:" >> $ tmpfile
    / bin / df-k >> $ tmpfile
    echo "**************************************** * ">> $ tmpfile
    echo "" >> $ tmpfile

    Schrijf vervolgens de tijdelijke bestandsinhoud naar een meer permanent logbestand en e-mail de resultaten naar de juiste partijen. De tweede mailing is de gereduceerde resultaten, simpelweg bestaande uit de standaard uit 'top':

    # Resultaten verzenden naar logbestand:
    / bin / cat $ tmpfile >> $ logbestand

    # En e-mail resultaten naar sysadmin:
    / usr / bin / mutt -s "$ machine heeft een hoog laadniveau! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile

    En dan wat huishoudelijke en exit:

    # En verwijder vervolgens het tijdelijke bestand:
    rm $ tmpfile
    rm $ topfile
    fi

    #
    exit 0

    Hopelijk helpt dit iemand daarbuiten. Volledig geassembleerd script is:

    #! / Bin / bash
    #
    # Script om de gemiddelde systeemniveau's te controleren om te proberen te bepalen welke processen dat zijn
    # het overdreven hoog nemen ...
    #
    # ingestelde omgeving
    dt = "datum +% d% b% Y-% X"
    # Verander natuurlijk de volgende mappen naar waar uw logbestanden daadwerkelijk worden bewaard
    tmpfile = "/ tmp / checkSystemLoad.tmp"
    logfile = "/ tmp / checkSystemLoad.log"
    msgLog = "/ var / log / messages"
    mysqlLog = "/ var / log / mysqld.log"
    # de eerste e-mailstop is standaard e-mail voor rapporten. De tweede is voor een mobiele telefoon (met een gereduceerd rapport)
    mailstop = "[email protected]"
    mailstop1 = "[email protected]"
    machine = "hostnaam"
    # De volgende drie zijn voor gebruik door mytop - gebruik een db-gebruiker met fatsoenlijke rechten
    dbusr = "gebruikersnaam"
    dbpw = "password"
    db = "yourdatabasename"
    # Het volgende is het laadniveau dat moet worden gecontroleerd - 10 is erg hoog, dus u kunt het misschien verlagen.
    levelToCheck = 10
    # Variabelen instellen van systeem:
    loadLevel = "cat / proc / loadavg | awk" print $ 1 "
    loadLevel = $ (printf "% 0.f" $ loadLevel)

    # als het laadniveau groter is dan u wilt, start u het scriptproces. Anders sluit u 0 af

    als [$ loadLevel -gt $ levelToCheck]; dan
    echo ""> $ tmpfile
    echo "******************************" >> $ tmpfile
    echo "Datum: $ dt" >> $ tmpfile
    echo "Controleer systeem Load & Processes" >> $ tmpfile
    echo "******************************" >> $ tmpfile

    # Haal meer variabelen uit het systeem:
    httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"

    # Toon huidig ​​laadniveau:
    echo "Laadniveau is: $ loadLevel" >> $ tmpfile
    echo "**************************************** * ">> $ tmpfile

    # Toon aantal httpd-processen dat nu actief is (niet inclusief kinderen):
    echo "Aantal httpd-processen nu: $ httpdProcesses" >> $ tmpfile
    echo "**************************************** * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Toon proceslijst:
    echo "Processen nu uitgevoerd:" >> $ tmpfile
    ps f -ef >> $ tmpfile
    echo "**************************************** * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Toon huidige MySQL-info:
    echo "Resultaten van mytop:" >> $ tmpfile
    / usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
    echo "**************************************** * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Huidige top tonen:
    echo "bovenaan toont nu:" >> $ tmpfile
    echo "bovenaan toont nu:" >> $ topfile
    / usr / bin / top -b -n1 >> $ tmpfile
    / usr / bin / top -b -n1 >> $ topfile
    echo "**************************************** * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Toon huidige verbindingen:
    echo "netstat laat nu zien:" >> $ tmpfile
    / bin / netstat -p >> $ tmpfile
    echo "**************************************** * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Controleer schijfruimte
    echo "disk space:" >> $ tmpfile
    / bin / df-k >> $ tmpfile
    echo "**************************************** * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Resultaten verzenden naar logbestand:
    / bin / cat $ tmpfile >> $ logbestand

    # En e-mail resultaten naar sysadmin:
    / usr / bin / mutt -s "$ machine heeft een hoog laadniveau! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile

    # En verwijder vervolgens het tijdelijke bestand:
    rm $ tmpfile
    rm $ topfile
    fi

    #
    exit 0