Hjemmeside » hvordan » Diagnostiser Linux Server Load Problemer med et enkelt script

    Diagnostiser Linux Server Load Problemer med et enkelt script

    Hvis du har vært en administrator for en viss tid, har du sikkert oppdaget situasjoner hvor en server spiker i CPU bruk eller minne utnyttelse og / eller last nivåer. Kjører "topp" vil ikke alltid gi deg svaret, heller ikke. Så hvordan finner du de lune prosessene som tugger opp systemressursene dine for å drepe dem?

    Følgende skript kan være i stand til å hjelpe. Det ble skrevet for en webserver, så har noen deler av det som er spesielt på jakt etter httpd-prosesser og enkelte deler som omhandler MySQL. Avhengig av serverplasseringen din, kan du bare kommentere / slette de seksjonene og legge til andre. Den skal brukes til utgangspunkt.

    Forutsetninger for denne versjonen av skriptet er noen freeware utgitt under GNU General Public License kalt mytop (tilgjengelig på http://jeremy.zawodny.com/mysql/mytop/) som er et fantastisk verktøy for å sjekke hvordan MySQL utfører. Det blir gammelt, men fungerer fortsatt bra for våre formål her.
    I tillegg bruker jeg mutt som mailer - det kan hende du vil endre skriptet for å bare bruke Linux-bygget i 'mail'-verktøyet. Jeg kjører det via cron hver time; Juster etter behov. Oh - og dette skriptet må løpe som root siden det leser fra noen beskyttede områder av serveren.

    Så la oss komme i gang, skal vi?

    Først sett inn skriptvariablene dine:

    #! / Bin / bash
    #
    # Skript for å sjekke gjennomsnittsnivåer for systembelastning for å prøve å bestemme
    # hvilke prosesser tar det for høyt ...
    #
    # 07Jul2010 tjones
    #
    # sett miljø
    dt = "dato +% d% b% Y-% X"
    # Du må selvsagt endre følgende kataloger til hvor loggfilene dine faktisk holdes
    tmpfile = "/ tmp / checkSystemLoad.tmp"
    logfile = "/ tmp / checkSystemLoad.log"
    msgLog = "/ var / log / meldinger"
    mysqlLog = "/ var / log / mysqld.log"
    # Den første poststopp er standard e-post for rapporter. Den andre er for mobiltelefon (med en pared down rapport)
    mailstop = "[email protected]"
    mailstop1 = "[email protected]"
    machine = "hostname"
    # Følgende tre er for mytop bruk - bruk en db bruker som har anstendige rettigheter
    dbusr = "brukernavn"
    dbpw = "passord"
    db = "yourdatabasename"
    # Følgende er lastnivået for å sjekke på - 10 er veldig høyt, så du vil kanskje redusere det.
    levelToCheck = 10

    Kontroller deretter lastnivået ditt for å se om skriptet skal fortsette:

    # Angi variabler fra systemet:
    loadLevel = "cat / proc / loadavg | awk" skriv ut $ 1 "
    loadLevel = $ (printf "% 0.f" $ loadLevel)

    # Hvis lastnivået er større enn du vil, start scriptprosessen. Ellers avslutter du 0

    hvis [$ loadLevel -gt $ levelToCheck]; deretter
    ekko ""> $ tmpfile
    ekko "**************************************" >> $ tmpfile
    ekko "Dato: $ dt" >> $ tmpfile
    ekko "Kontroller systembelastning og prosesser" >> $ tmpfile
    ekko "**************************************" >> $ tmpfile

    Og fortsett gjennom kontrollene, skriv resultatene til den midlertidige filen. Legg til eller slett elementer herfra der det er aktuelt for din situasjon:

    # Få flere variabler fra systemet:
    httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"

    # Vis gjeldende lastnivå:
    ekko "Load Level er: $ loadLevel" >> $ tmpfile
    ekko "************************************************ * ">> $ tmpfile

    # Vis antall httpd-prosesser som kjører nå (ikke inkludert barn):
    ekko "Antall httpd prosesser nå: $ httpdProcesses" >> $ tmpfile
    ekko "************************************************ * ">> $ tmpfile
    ekko "" >> $ tmpfile

    # Vis prosessliste:
    ekko "Prosesser som kjører nå:" >> $ tmpfile
    ps f -ef >> $ tmpfile
    ekko "************************************************ * ">> $ tmpfile
    ekko "" >> $ tmpfile

    # Vis gjeldende MySQL-info:
    ekko "Resultat fra mytop:" >> $ tmpfile
    / usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
    ekko "************************************************ * ">> $ tmpfile
    ekko "" >> $ tmpfile

    Legg merke til toppkommandoen, vi skriver til to tempfiler. En er for den mye mindre meldingen til mobiltelefonen. Hvis du ikke vil ha haster med mobiltelefonvarsler klokken tre om morgenen, kan du ta dette ut (og ta ut den andre postrutinen senere i skriptet).


    # Vis nåværende topp:
    ekko "toppen viser nå:" >> $ tmpfile
    ekko "toppen viser nå:" >> $ topfile
    / usr / bin / top -b -n1 >> $ tmpfile
    / usr / bin / top -b -n1 >> $ topfile
    ekko "************************************************ * ">> $ tmpfile
    ekko "" >> $ tmpfile

    Flere kontroller:


    # Vis gjeldende tilkoblinger:
    ekko "netstat viser nå:" >> $ tmpfile
    / bin / netstat -p >> $ tmpfile
    ekko "************************************************ * ">> $ tmpfile
    ekko "" >> $ tmpfile

    # Sjekk diskplass
    ekko "diskplass:" >> $ tmpfile
    / bin / df-k >> $ tmpfile
    ekko "************************************************ * ">> $ tmpfile
    ekko "" >> $ tmpfile

    Skriv deretter det midlertidige filinnholdet til en mer permanent loggfil og send resultatene til de aktuelle partene. Den andre postadressen er de avstemmede resultatene som bare består av standarden ut av "topp":

    # Send resultater til loggfil:
    / bin / cat $ tmpfile >> $ logfile

    # Og email resultater til sysadmin:
    / usr / bin / mutt-s "$ maskin har et høyt lastnivå! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile

    Og så litt housekeeping og exit:

    # Og fjern deretter tempfilen:
    rm $ tmpfile
    rm $ topfile
    fi

    #
    utgang 0

    Forhåpentligvis hjelper dette noen der ute. Fullt montert skript er:

    #! / Bin / bash
    #
    # Skript for å sjekke gjennomsnittsnivåer for systembelastning for å prøve å avgjøre hvilke prosesser som er
    # tar det for høyt ...
    #
    # sett miljø
    dt = "dato +% d% b% Y-% X"
    # Du må selvsagt endre følgende kataloger til hvor loggfilene dine faktisk holdes
    tmpfile = "/ tmp / checkSystemLoad.tmp"
    logfile = "/ tmp / checkSystemLoad.log"
    msgLog = "/ var / log / meldinger"
    mysqlLog = "/ var / log / mysqld.log"
    # Den første poststopp er standard e-post for rapporter. Den andre er for mobiltelefon (med en pared down rapport)
    mailstop = "[email protected]"
    mailstop1 = "[email protected]"
    machine = "hostname"
    # Følgende tre er for mytop bruk - bruk en db bruker som har anstendige rettigheter
    dbusr = "brukernavn"
    dbpw = "passord"
    db = "yourdatabasename"
    # Følgende er lastnivået for å sjekke på - 10 er veldig høyt, så du vil kanskje redusere det.
    levelToCheck = 10
    # Angi variabler fra systemet:
    loadLevel = "cat / proc / loadavg | awk" skriv ut $ 1 "
    loadLevel = $ (printf "% 0.f" $ loadLevel)

    # Hvis lastnivået er større enn du vil, start scriptprosessen. Ellers avslutter du 0

    hvis [$ loadLevel -gt $ levelToCheck]; deretter
    ekko ""> $ tmpfile
    ekko "**************************************" >> $ tmpfile
    ekko "Dato: $ dt" >> $ tmpfile
    ekko "Kontroller systembelastning og prosesser" >> $ tmpfile
    ekko "**************************************" >> $ tmpfile

    # Få flere variabler fra systemet:
    httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"

    # Vis gjeldende lastnivå:
    ekko "Load Level er: $ loadLevel" >> $ tmpfile
    ekko "************************************************ * ">> $ tmpfile

    # Vis antall httpd-prosesser som kjører nå (ikke inkludert barn):
    ekko "Antall httpd prosesser nå: $ httpdProcesses" >> $ tmpfile
    ekko "************************************************ * ">> $ tmpfile
    ekko "" >> $ tmpfile

    # Vis prosessliste:
    ekko "Prosesser som kjører nå:" >> $ tmpfile
    ps f -ef >> $ tmpfile
    ekko "************************************************ * ">> $ tmpfile
    ekko "" >> $ tmpfile

    # Vis gjeldende MySQL-info:
    ekko "Resultat fra mytop:" >> $ tmpfile
    / usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
    ekko "************************************************ * ">> $ tmpfile
    ekko "" >> $ tmpfile

    # Vis nåværende topp:
    ekko "toppen viser nå:" >> $ tmpfile
    ekko "toppen viser nå:" >> $ topfile
    / usr / bin / top -b -n1 >> $ tmpfile
    / usr / bin / top -b -n1 >> $ topfile
    ekko "************************************************ * ">> $ tmpfile
    ekko "" >> $ tmpfile

    # Vis gjeldende tilkoblinger:
    ekko "netstat viser nå:" >> $ tmpfile
    / bin / netstat -p >> $ tmpfile
    ekko "************************************************ * ">> $ tmpfile
    ekko "" >> $ tmpfile

    # Sjekk diskplass
    ekko "diskplass:" >> $ tmpfile
    / bin / df-k >> $ tmpfile
    ekko "************************************************ * ">> $ tmpfile
    ekko "" >> $ tmpfile

    # Send resultater til loggfil:
    / bin / cat $ tmpfile >> $ logfile

    # Og email resultater til sysadmin:
    / usr / bin / mutt-s "$ maskin har et høyt lastnivå! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile

    # Og fjern deretter tempfilen:
    rm $ tmpfile
    rm $ topfile
    fi

    #
    utgang 0