Hemsida » hur » Diagnostisera Linux Server Load Problem med ett enkelt skript

    Diagnostisera Linux Server Load Problem med ett enkelt skript

    Om du har varit en administratör under någon tid har du säkert upptäckt situationer där en server spikar i CPU-användning eller minnesutnyttjande och / eller laddningsnivåer. Running 'top' kommer inte alltid att ge dig svaret heller. Så hur hittar du de snygga processerna som tuggar upp dina systemresurser för att kunna döda dem?

    Det följande skriptet kan hjälpa till. Det skrevs för en webbserver, så har vissa delar av det som specifikt letar efter httpd-processer och vissa delar som handlar om MySQL. Beroende på din serverutplacering, kommentera / ta bort dessa avsnitt och lägg till andra. Den ska användas till en utgångspunkt.

    Förutsättningarna för den här versionen av skriptet är några freeware publicerade under GNU General Public License, kallad mytop (tillgänglig på http://jeremy.zawodny.com/mysql/mytop/) vilket är ett fantastiskt verktyg för att kontrollera hur MySQL utför. Det blir gammalt, men fungerar fortfarande bra för våra syften här.
    Dessutom använder jag mutt som mailer - du kanske vill ändra skriptet för att helt enkelt använda det linux-inbyggda verktyget "mail". Jag kör det via cron varje timme; justera som du passar dig. Åh - och det här skriptet måste springa som root eftersom det läser från några skyddade områden på servern.

    Så låt oss börja, ska vi?

    Ange först dina skriptvariabler:

    #! / Bin / bash
    #
    # Skript för att kontrollera genomsnittliga nivåer för systembelastning för att försöka bestämma
    # vilka processer tar det för högt ...
    #
    # 07Jul2010 tjones
    #
    # set miljö
    dt = "datum +% d% b% Y-% X"
    # Ändra självklart följande kataloger till var dina loggfiler faktiskt hålls
    tmpfile = "/ tmp / checkSystemLoad.tmp"
    loggfil = "/ tmp / checkSystemLoad.log"
    msgLog = "/ var / log / messages"
    mysqlLog = "/ var / log / mysqld.log"
    # Den första poststoppen är standard e-post för rapporter. Den andra är för mobiltelefon (med en jämförd rapport)
    mailstop = "[email protected]"
    mailstop1 = "[email protected]"
    maskin = "värdnamn"
    # Följande tre är för mytopanvändning - använd en db-användare som har anständiga rättigheter
    dbusr = "användarnamn"
    dbpw = "lösenord"
    db = "yourdatabasename"
    # Följande är lastnivån att kolla på - 10 är riktigt hög, så du kanske vill sänka den.
    levelToCheck = 10

    Kontrollera sedan din belastningsnivå för att se om skriptet ska fortsätta:

    # Ställ in variabler från systemet:
    loadLevel = "cat / proc / loadavg | awk" skriv ut $ 1 "
    loadLevel = $ (printf "% 0.f" $ loadLevel)

    # Om belastningsnivån är större än vad du vill, starta scriptprocessen. Annars, avsluta 0

    om [$ loadLevel -gt $ levelToCheck]; sedan
    echo ""> $ tmpfile
    echo "**************************************" >> $ tmpfile
    eko "Datum: $ dt" >> $ tmpfile
    echo "Kontrollera systembelastning och processer" >> $ tmpfile
    echo "**************************************" >> $ tmpfile

    Och fortsätt genom kontrollerna och skriv resultaten till den temporära filen. Lägg till eller ta bort objekt härifrån där det är aktuellt för din situation:

    # Hämta fler variabler från systemet:
    httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"

    # Visa aktuell belastningsnivå:
    echo "Laddningsnivå är: $ loadLevel" >> $ tmpfile
    echo "*********************************************** * ">> $ tmpfile

    # Visa antal httpd-processer som körs nu (inte inklusive barn):
    echo "Antal httpd-processer nu: $ httpdProcesses" >> $ tmpfile
    echo "*********************************************** * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Visa processlista:
    echo "Processer som nu körs:" >> $ tmpfile
    ps f -ef >> $ tmpfile
    echo "*********************************************** * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Visa aktuell MySQL-info:
    echo "Resultat från mytop:" >> $ tmpfile
    / usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
    echo "*********************************************** * ">> $ tmpfile
    echo "" >> $ tmpfile

    Observera med det översta kommandot, vi skriver till två tempfiler. En är för det mycket mindre meddelandet till mobiltelefonen. Om du inte vill ha brådskande telefonvarningar vid tre på morgonen kan du ta bort det här (och ta ut den andra postrutinen senare i skriptet).


    # Visa aktuell topp:
    echo "toppen visar nu:" >> $ tmpfile
    echo "toppen visar nu:" >> $ topfile
    / usr / bin / top -b -n1 >> $ tmpfile
    / usr / bin / top -b -n1 >> $ topfile
    echo "*********************************************** * ">> $ tmpfile
    echo "" >> $ tmpfile

    Fler kontroller:


    # Visa aktuella anslutningar:
    echo "netstat visar nu:" >> $ tmpfile
    / bin / netstat -p >> $ tmpfile
    echo "*********************************************** * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Kontrollera diskutrymme
    eko "diskutrymme:" >> $ tmpfile
    / bin / df-k >> $ tmpfile
    echo "*********************************************** * ">> $ tmpfile
    echo "" >> $ tmpfile

    Skriv sedan det temporära filinnehållet till en mer permanent loggfil och skicka resultatet till lämpliga parter. Den andra sändningen är de uppdelade resultaten som helt enkelt består av standarden utifrån "topp":

    # Skicka resultat till loggfilen:
    / bin / cat $ tmpfile >> $ logfile

    # Och mailresultat till sysadmin:
    / usr / bin / mutt -s "$ maskin har en hög lastnivå! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ loggfil

    Och sedan hushållning och utträde:

    # Och ta bort tempfilen:
    rm $ tmpfile
    rm $ topfile
    fi

    #
    utgång 0

    Förhoppningsvis hjälper det någon där ute. Fullständigt monterat skript är:

    #! / Bin / bash
    #
    # Skript för att kontrollera genomsnittliga nivåer för systembelastning för att försöka bestämma vilka processer som är
    # tar det för högt ...
    #
    # set miljö
    dt = "datum +% d% b% Y-% X"
    # Ändra självklart följande kataloger till var dina loggfiler faktiskt hålls
    tmpfile = "/ tmp / checkSystemLoad.tmp"
    loggfil = "/ tmp / checkSystemLoad.log"
    msgLog = "/ var / log / messages"
    mysqlLog = "/ var / log / mysqld.log"
    # Den första poststoppen är standard e-post för rapporter. Den andra är för mobiltelefon (med en jämförd rapport)
    mailstop = "[email protected]"
    mailstop1 = "[email protected]"
    maskin = "värdnamn"
    # Följande tre är för mytopanvändning - använd en db-användare som har anständiga rättigheter
    dbusr = "användarnamn"
    dbpw = "lösenord"
    db = "yourdatabasename"
    # Följande är lastnivån att kolla på - 10 är riktigt hög, så du kanske vill sänka den.
    levelToCheck = 10
    # Ställ in variabler från systemet:
    loadLevel = "cat / proc / loadavg | awk" skriv ut $ 1 "
    loadLevel = $ (printf "% 0.f" $ loadLevel)

    # Om belastningsnivån är större än vad du vill, starta scriptprocessen. Annars, avsluta 0

    om [$ loadLevel -gt $ levelToCheck]; sedan
    echo ""> $ tmpfile
    echo "**************************************" >> $ tmpfile
    eko "Datum: $ dt" >> $ tmpfile
    echo "Kontrollera systembelastning och processer" >> $ tmpfile
    echo "**************************************" >> $ tmpfile

    # Hämta fler variabler från systemet:
    httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"

    # Visa aktuell belastningsnivå:
    echo "Laddningsnivå är: $ loadLevel" >> $ tmpfile
    echo "*********************************************** * ">> $ tmpfile

    # Visa antal httpd-processer som körs nu (inte inklusive barn):
    echo "Antal httpd-processer nu: $ httpdProcesses" >> $ tmpfile
    echo "*********************************************** * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Visa processlista:
    echo "Processer som nu körs:" >> $ tmpfile
    ps f -ef >> $ tmpfile
    echo "*********************************************** * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Visa aktuell MySQL-info:
    echo "Resultat från mytop:" >> $ tmpfile
    / usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
    echo "*********************************************** * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Visa aktuell topp:
    echo "toppen visar nu:" >> $ tmpfile
    echo "toppen visar nu:" >> $ topfile
    / usr / bin / top -b -n1 >> $ tmpfile
    / usr / bin / top -b -n1 >> $ topfile
    echo "*********************************************** * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Visa aktuella anslutningar:
    echo "netstat visar nu:" >> $ tmpfile
    / bin / netstat -p >> $ tmpfile
    echo "*********************************************** * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Kontrollera diskutrymme
    eko "diskutrymme:" >> $ tmpfile
    / bin / df-k >> $ tmpfile
    echo "*********************************************** * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Skicka resultat till loggfilen:
    / bin / cat $ tmpfile >> $ logfile

    # Och mailresultat till sysadmin:
    / usr / bin / mutt -s "$ maskin har en hög lastnivå! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ loggfil

    # Och ta bort tempfilen:
    rm $ tmpfile
    rm $ topfile
    fi

    #
    utgång 0