Pagina principala » HOWTO » Diagnosticarea problemelor de încărcare a serverului Linux cu un script simplu

    Diagnosticarea problemelor de încărcare a serverului Linux cu un script simplu

    Dacă ați fost administratorul pentru o perioadă lungă de timp, ați descoperit cu siguranță situații în care un server scade utilizările CPU-ului sau utilizarea memoriei și / sau nivelurile de încărcare. Rularea "de sus" nu vă va da întotdeauna răspunsul. Deci, cum găsiți acele procese mascate care mestec resursele sistemului pentru a le putea omorî?

    Următorul scenariu ar putea fi de ajutor. Acesta a fost scris pentru un server web, astfel încât unele părți din acesta caută în mod special procesele httpd și unele părți care se ocupă de MySQL. În funcție de implementarea serverului dvs., pur și simplu comentează / șterge aceste secțiuni și adaugă altele. Ar trebui folosit pentru un punct de plecare.

    Cerințele preliminare pentru această versiune a script-ului sunt unele freeware lansate sub licența GNU General Public numită mytop (disponibilă la http://jeremy.zawodny.com/mysql/mytop/), care este un instrument fantastic pentru a verifica modul în care funcționează MySQL. Se îmbătrânește, dar încă funcționează bine pentru scopurile noastre aici.
    În plus, eu folosesc mutt ca mailer - poate doriți să schimbați script-ul pentru a folosi pur și simplu linux construit în utilitate "mail". Îl conduc prin cron în fiecare oră; ajustați după cum doriți. Oh - și acest script trebuie să ruleze ca root, deoarece citește din anumite zone protejate ale serverului.

    Deci, să începem, să o facem noi?

    Mai întâi, setați variabilele de script:

    #! / Bin / bash
    #
    # Script pentru a verifica nivelurile medii de încărcare a sistemului pentru a încerca să determinați
    # ce procese se iau prea mult ...
    #
    # 07Jul2010 tjones
    #
    # mediu setat
    dt = "data +% d% b% Y-% X"
    # Evident, schimbați următoarele directoare în locul în care sunt păstrate fișierele de jurnale
    tmpfile = "/ tmp / checkSystemLoad.tmp"
    logfile = "/ tmp / checkSystemLoad.log"
    msgLog = "/ var / log / mesaje"
    mysqlLog = "/ var / log / mysqld.log"
    # primul e-mail este e-mailul standard pentru rapoarte. Al doilea este pentru telefonul mobil (cu un raport redus)
    Mailstop = "[email protected]"
    mailstop1 = "[email protected]"
    mașină = "hostname"
    # Următoarele trei sunt pentru utilizarea mytop - utilizați un utilizator db care are drepturi decente
    dbusr = "nume de utilizator"
    dbpw = "parola"
    db = "yourdatabasename"
    # Următorul este nivelul de încărcare pentru a verifica - 10 este foarte mare, deci ar putea să doriți să o micșorați.
    levelToCheck = 10

    Apoi, verificați nivelul de încărcare pentru a vedea dacă scriptul ar trebui să continue:

    # Setați variabilele din sistem:
    loadLevel = "cat / proc / loadavg | awk" print $ 1 "
    loadLevel = $ (printf "% 0.f" $ loadLevel)

    # dacă nivelul de încărcare este mai mare decât doriți, porniți procesul de script. În caz contrar, ieșiți 0

    dacă [$ loadLevel -gt $ levelToCheck]; atunci
    echo ""> $ tmpfile
    echo "**************************************" >> $ tmpfile
    echo "Data: $ dt" >> $ tmpfile
    ecou "Verificați încărcarea și procesarea sistemului" >> $ tmpfile
    echo "**************************************" >> $ tmpfile

    Și continuați prin verificări, scriind rezultatele în fișierul temporar. Adăugați sau ștergeți elemente de aici, după caz, pentru situația dvs.:

    # Obțineți mai multe variabile din sistem:
    httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"

    # Afișați nivelul de încărcare curent:
    echo "Nivelul de încărcare este: $ loadLevel" >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile

    # Afișați numărul de procese httpd care rulează acum (fără copii):
    echo "Numărul de procese httpd acum: $ httpdProcesses" >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Afișați lista proceselor:
    echo "Procesele care rulează acum:" >> $ tmpfile
    ps f-ef >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Afișați informațiile MySQL curente:
    echo "Rezultatele din mytop:" >> $ tmpfile
    / usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    Observați cu comanda de sus, scriem două fișiere temp. Una este pentru mesajul mult mai mic la telefonul mobil. Dacă nu dorești urgența alertelor telefonului mobil la ora trei dimineața, poți să iei acest lucru (și să iei a doua rutină de trimitere mai târziu în scenariu).


    # Afișați topul curent:
    echo "de top arată acum:" >> $ tmpfile
    echo "de top arată acum:" >> $ topfile
    / usr / bin / top -b -n1 >> $ tmpfile
    / usr / bin / top -b -n1 >> $ topfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    Mai multe verificări:


    # Afișați conexiunile curente:
    echo "netstat arată acum:" >> $ tmpfile
    / bin / netstat -p >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Verificați spațiul pe disc
    echo "spațiu pe disc:" >> $ tmpfile
    / bin / df -k >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    Apoi, scrieți conținutul fișierului temporar într-un fișier jurnal mai permanent și expediați rezultatele către părțile corespunzătoare. Cea de-a doua trimitere prin poștă este rezultatul obținut dintr-un simplu tip de "top":

    # Trimiteți rezultatele în fișierul de jurnal:
    / bin / pisică $ tmpfile >> $ logfile

    # Și rezultatele de e-mail la sysadmin:
    / usr / bin / mutt -s "$ machine are un nivel ridicat de încărcare! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile

    Și apoi unele menaj și ieșire:

    # Și apoi eliminați fișierul temp:
    rm $ tmpfile
    rm $ topfile
    Fi

    #
    ieșire 0

    Sperăm că asta îi ajută pe cineva acolo. Scriptul complet asamblat este:

    #! / Bin / bash
    #
    # Script pentru a verifica nivelurile medii de încărcare a sistemului pentru a încerca să determinați ce procese sunt
    # luând-o prea mult ...
    #
    # mediu setat
    dt = "data +% d% b% Y-% X"
    # Evident, schimbați următoarele directoare în locul în care sunt păstrate fișierele de jurnale
    tmpfile = "/ tmp / checkSystemLoad.tmp"
    logfile = "/ tmp / checkSystemLoad.log"
    msgLog = "/ var / log / mesaje"
    mysqlLog = "/ var / log / mysqld.log"
    # primul e-mail este e-mailul standard pentru rapoarte. Al doilea este pentru telefonul mobil (cu un raport redus)
    Mailstop = "[email protected]"
    mailstop1 = "[email protected]"
    mașină = "hostname"
    # Următoarele trei sunt pentru utilizarea mytop - utilizați un utilizator db care are drepturi decente
    dbusr = "nume de utilizator"
    dbpw = "parola"
    db = "yourdatabasename"
    # Următorul este nivelul de încărcare pentru a verifica - 10 este foarte mare, deci ar putea să doriți să o micșorați.
    levelToCheck = 10
    # Setați variabilele din sistem:
    loadLevel = "cat / proc / loadavg | awk" print $ 1 "
    loadLevel = $ (printf "% 0.f" $ loadLevel)

    # dacă nivelul de încărcare este mai mare decât doriți, porniți procesul de script. În caz contrar, ieșiți 0

    dacă [$ loadLevel -gt $ levelToCheck]; atunci
    echo ""> $ tmpfile
    echo "**************************************" >> $ tmpfile
    echo "Data: $ dt" >> $ tmpfile
    ecou "Verificați încărcarea și procesarea sistemului" >> $ tmpfile
    echo "**************************************" >> $ tmpfile

    # Obțineți mai multe variabile din sistem:
    httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"

    # Afișați nivelul de încărcare curent:
    echo "Nivelul de încărcare este: $ loadLevel" >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile

    # Afișați numărul de procese httpd care rulează acum (fără copii):
    echo "Numărul de procese httpd acum: $ httpdProcesses" >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Afișați lista proceselor:
    echo "Procesele care rulează acum:" >> $ tmpfile
    ps f-ef >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Afișați informațiile MySQL curente:
    echo "Rezultatele din mytop:" >> $ tmpfile
    / usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Afișați topul curent:
    echo "de top arată acum:" >> $ tmpfile
    echo "de top arată acum:" >> $ topfile
    / usr / bin / top -b -n1 >> $ tmpfile
    / usr / bin / top -b -n1 >> $ topfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Afișați conexiunile curente:
    echo "netstat arată acum:" >> $ tmpfile
    / bin / netstat -p >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Verificați spațiul pe disc
    echo "spațiu pe disc:" >> $ tmpfile
    / bin / df -k >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Trimiteți rezultatele în fișierul de jurnal:
    / bin / pisică $ tmpfile >> $ logfile

    # Și rezultatele de e-mail la sysadmin:
    / usr / bin / mutt -s "$ machine are un nivel ridicat de încărcare! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile

    # Și apoi eliminați fișierul temp:
    rm $ tmpfile
    rm $ topfile
    Fi

    #
    ieșire 0