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

    Diagnostiser Linux Server Load Problemer med et simpelt script

    Hvis du har været en administrator i nogen tid, har du helt sikkert opdaget situationer, hvor en server spikes i CPU brug eller hukommelse udnyttelse og / eller belastning niveauer. At køre 'top' vil ikke altid give dig svaret. Så hvordan finder du de snige processer, der tugger op med dine systemressourcer for at kunne dræbe dem?

    Følgende script kan muligvis hjælpe. Det var skrevet til en webserver, så har nogle dele af det, der specifikt leder efter httpd-processer og nogle dele, der beskæftiger sig med MySQL. Afhængigt af din serverudbredelse, skal du blot kommentere / slette disse sektioner og tilføje andre. Det skal bruges til udgangspunkt.

    Forudsætninger for denne version af scriptet er nogle freeware udgivet under GNU General Public License kaldet mytop (tilgængelig på http://jeremy.zawodny.com/mysql/mytop/), hvilket er et fantastisk værktøj til at kontrollere, hvordan MySQL udfører. Det bliver gammel, men fungerer stadig godt til vores formål her.
    Derudover bruger jeg mutt som mailer - du vil muligvis ændre scriptet til blot at bruge det indbyggede Linux-mail-værktøj. Jeg kører det via cron hver time; Juster som det passer dig. Åh - og dette script skal køre som rod, da det læser fra nogle beskyttede områder af serveren.

    Så lad os komme i gang, skal vi?

    Indstil først dine scriptvariabler:

    #! / Bin / bash
    #
    # Script for at tjekke gennemsnitsniveauer for systembelastning for at prøve at bestemme
    # hvilke processer tager det for højt ...
    #
    # 07Jul2010 tjones
    #
    # set miljø
    dt = "dato +% d% b% Y-% X"
    # Du skal selvfølgelig ændre følgende mapper til, hvor dine logfiler rent faktisk holdes
    tmpfile = "/ tmp / checkSystemLoad.tmp"
    logfil = "/ tmp / checkSystemLoad.log"
    msgLog = "/ var / log / messages"
    mysqlLog = "/ var / log / mysqld.log"
    # Den første mailstop er standard e-mail til rapporter. Anden er for mobiltelefon (med en pareret rapport)
    mailstop = "[email protected]"
    mailstop1 = "[email protected]"
    maskine = "værtsnavn"
    # Følgende tre er til mytop brug - brug en db bruger, der har anstændige rettigheder
    dbusr = "username"
    dbpw = "password"
    db = "yourdatabasename"
    # Følgende er belastningsniveauet for at tjekke på - 10 er virkelig højt, så du vil muligvis gerne sænke det.
    levelToCheck = 10

    Herefter skal du kontrollere dit belastningsniveau for at se om scriptet skal fortsætte:

    # Indstil variabler fra system:
    loadLevel = "cat / proc / loadavg | awk" print $ 1 "
    loadLevel = $ (printf "% 0.f" $ loadLevel)

    # Hvis belastningsniveauet er større end du vil, skal du starte scriptprocessen. Ellers afslut 0

    hvis [$ loadLevel -gt $ levelToCheck]; derefter
    echo ""> $ tmpfile
    ekko "**************************************" >> $ tmpfile
    ekko "Dato: $ dt" >> $ tmpfile
    ekko "Check System Load & Processes" >> $ tmpfile
    ekko "**************************************" >> $ tmpfile

    Og fortsæt gennem kontrollerne, skriv resultaterne til den midlertidige fil. Tilføj eller slet elementer herfra, hvor det passer til din situation:

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

    # Vis nuværende belastningsniveau:
    ekko "Indlæsningsniveau er: $ loadLevel" >> $ tmpfile
    ekko "************************************************ * ">> $ tmpfile

    # Vis antal httpd-processer, der kører nu (ikke inklusive børn):
    ekko "Antal httpd-processer nu: $ httpdProcesses" >> $ tmpfile
    ekko "************************************************ * ">> $ tmpfile
    ekko "" >> $ tmpfile

    # Vis procesliste:
    ekko "Processer kører nu:" >> $ tmpfile
    ps f -ef >> $ tmpfile
    ekko "************************************************ * ">> $ tmpfile
    ekko "" >> $ tmpfile

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

    Bemærk med den øverste kommando, vi skriver til to temp filer. Den ene er til den meget mindre besked til mobiltelefonen. Hvis du ikke vil have hastigheden af ​​mobiltelefonvarsler klokken tre om morgenen, kan du tage det ud (og tage den anden postrutine senere i scriptet).


    # Vis nuværende top:
    ekko "top viser nu:" >> $ tmpfile
    ekko "top viser nu:" >> $ topfile
    / usr / bin / top -b -n1 >> $ tmpfile
    / usr / bin / top -b -n1 >> $ topfile
    ekko "************************************************ * ">> $ tmpfile
    ekko "" >> $ tmpfile

    Flere checks:


    # Vis aktuelle forbindelser:
    ekko "netstat viser nu:" >> $ tmpfile
    / bin / netstat -p >> $ tmpfile
    ekko "************************************************ * ">> $ tmpfile
    ekko "" >> $ tmpfile

    # Kontroller diskplads
    ekko "diskplads:" >> $ tmpfile
    / bin / df-k >> $ tmpfile
    ekko "************************************************ * ">> $ tmpfile
    ekko "" >> $ tmpfile

    Skriv derefter det midlertidige fil indhold til en mere permanent logfil og send resultaterne til de relevante parter. Den anden mailing er de opdelte resultater, der udelukkende består af standarden ud af 'top':

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

    # Og email resultater til sysadmin:
    / usr / bin / mutt -s "$ maskine har et højt belastningsniveau! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfil

    Og så nogle housekeeping og exit:

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

    #
    Afslut 0

    Forhåbentlig hjælper det nogen derude. Fuldt monteret script er:

    #! / Bin / bash
    #
    # Script for at kontrollere gennemsnitlige niveauer for systembelastning for at prøve at bestemme hvilke processer der er
    # tager det for højt
    #
    # set miljø
    dt = "dato +% d% b% Y-% X"
    # Du skal selvfølgelig ændre følgende mapper til, hvor dine logfiler rent faktisk holdes
    tmpfile = "/ tmp / checkSystemLoad.tmp"
    logfil = "/ tmp / checkSystemLoad.log"
    msgLog = "/ var / log / messages"
    mysqlLog = "/ var / log / mysqld.log"
    # Den første mailstop er standard e-mail til rapporter. Anden er for mobiltelefon (med en pareret rapport)
    mailstop = "[email protected]"
    mailstop1 = "[email protected]"
    maskine = "værtsnavn"
    # Følgende tre er til mytop brug - brug en db bruger, der har anstændige rettigheder
    dbusr = "username"
    dbpw = "password"
    db = "yourdatabasename"
    # Følgende er belastningsniveauet for at tjekke på - 10 er virkelig højt, så du vil muligvis gerne sænke det.
    levelToCheck = 10
    # Indstil variabler fra system:
    loadLevel = "cat / proc / loadavg | awk" print $ 1 "
    loadLevel = $ (printf "% 0.f" $ loadLevel)

    # Hvis belastningsniveauet er større end du vil, skal du starte scriptprocessen. Ellers afslut 0

    hvis [$ loadLevel -gt $ levelToCheck]; derefter
    echo ""> $ tmpfile
    ekko "**************************************" >> $ tmpfile
    ekko "Dato: $ dt" >> $ tmpfile
    ekko "Check System Load & Processes" >> $ tmpfile
    ekko "**************************************" >> $ tmpfile

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

    # Vis nuværende belastningsniveau:
    ekko "Indlæsningsniveau er: $ loadLevel" >> $ tmpfile
    ekko "************************************************ * ">> $ tmpfile

    # Vis antal httpd-processer, der kører nu (ikke inklusive børn):
    ekko "Antal httpd-processer nu: $ httpdProcesses" >> $ tmpfile
    ekko "************************************************ * ">> $ tmpfile
    ekko "" >> $ tmpfile

    # Vis procesliste:
    ekko "Processer kører nu:" >> $ tmpfile
    ps f -ef >> $ tmpfile
    ekko "************************************************ * ">> $ tmpfile
    ekko "" >> $ tmpfile

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

    # Vis nuværende top:
    ekko "top viser nu:" >> $ tmpfile
    ekko "top viser nu:" >> $ topfile
    / usr / bin / top -b -n1 >> $ tmpfile
    / usr / bin / top -b -n1 >> $ topfile
    ekko "************************************************ * ">> $ tmpfile
    ekko "" >> $ tmpfile

    # Vis aktuelle forbindelser:
    ekko "netstat viser nu:" >> $ tmpfile
    / bin / netstat -p >> $ tmpfile
    ekko "************************************************ * ">> $ tmpfile
    ekko "" >> $ tmpfile

    # Kontroller diskplads
    ekko "diskplads:" >> $ tmpfile
    / bin / df-k >> $ tmpfile
    ekko "************************************************ * ">> $ tmpfile
    ekko "" >> $ tmpfile

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

    # Og email resultater til sysadmin:
    / usr / bin / mutt -s "$ maskine har et højt belastningsniveau! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfil

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

    #
    Afslut 0