If-Koubou

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

Diagnosticarea problemelor de încărcare a serverului Linux cu un script simplu (Cum să)

Dacă ați fost administratorul pentru o perioadă lungă de timp, ați descoperit cu siguranță situații în care un server scade în utilizarea procesorului sau în utilizarea memoriei și / sau a nivelelor 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 ucide?

Următorul scenariu ar putea fi de ajutor. Acesta a fost scris pentru un server web, așa că unele părți din acesta caută în mod specific procesele httpd și unele părți care se ocupă de MySQL. În funcție de implementarea serverului dvs., pur și simplu comentează / șterge acele secțiuni și adaugă altele. Ar trebui să fie 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. Este vechi, dar totusi functioneaza excelent pentru scopurile noastre aici.
În plus, eu folosesc mutt ca mailer - poate doriți să schimbați script-ul pentru a utiliza pur și simplu linux construit în utilitate "mail". Îl conduc prin cron în fiecare oră; reglaț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, nu-i așa?

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
#
# set de mediu
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 un e-mail 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ătoarea 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 de la 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ă a include copiii):
echo "Numărul proceselor 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. Unul 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ă:" >> $ 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 trimiteți-l prin e-mail către părțile corespunzătoare. Cea de-a doua trimitere poștală este rezultatul obținut prin comparație, care constă pur și simplu din standardul "de sus":

# Trimiteți rezultate la fișierul de jurnal:
/ bin / pisică $ tmpfile >> $ logfile

# Și rezultatele de e-mail la sysadmin:
/ usr / bin / mutt -s "$ mașină are un nivel de încărcare mare! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$ tmpfile / usr / bin / mutt -s " ! - $ 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ă acest lucru îi ajută pe cineva acolo. Scenul 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 ...
#
# set de mediu
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 un e-mail 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ătoarea 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 de la 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ă a include copiii):
echo "Numărul proceselor 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ă:" >> $ 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 rezultate la fișierul de jurnal:
/ bin / pisică $ tmpfile >> $ logfile

# Și rezultatele de e-mail la sysadmin:
/ usr / bin / mutt -s "$ mașină are un nivel de încărcare mare! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$ tmpfile / usr / bin / mutt -s " ! - $ dt "$ mailstop1> $ logfile

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

#
ieșire 0