Diagnozuokite „Linux“ serverio įkrovimo problemas naudodami paprastą scenarijų
Jei buvote administratorius bet kokiam laikotarpiui, jūs tikrai radote situacijų, kai serverio šuoliai vyksta naudojant procesoriaus naudojimą arba atminties panaudojimą ir (arba) apkrovos lygius. „Top“ važiavimas ne visada suteiks jums atsakymą. Taigi, kaip jūs surasite tuos neryškius procesus, kurie kenkia jūsų sistemos ištekliams, kad galėtumėte nužudyti?
Šis scenarijus gali padėti. Jis buvo parašytas žiniatinklio serveriui, todėl turi tam tikras jo dalis, kurios konkrečiai ieško httpd procesų ir kai kurių dalių, kurios susijusios su „MySQL“. Priklausomai nuo jūsų serverio diegimo, tiesiog komentuokite / ištrinkite tuos skyrius ir pridėkite kitus. Jis turėtų būti naudojamas pradiniam taškui.
Šios scenarijaus versijos prielaidos yra nemokama, išleista pagal GNU Bendrąją viešąją licenciją, vadinamą „mytop“ (galima rasti adresu http://jeremy.zawodny.com/mysql/mytop/), kuri yra fantastiška priemonė patikrinti, kaip veikia „MySQL“. Jis sensta, tačiau vis dar puikiai tinka mūsų tikslams.
Be to, aš naudoju „mutt“ kaip pašto siuntėją - galbūt norėsite pakeisti scenarijų, kad galėtumėte naudoti „linux“ pastatytą „pašto“ įrankį. Kas valandą jį paleisiu per croną; koreguokite, kaip matote. Oh - ir šis scenarijus turi paleisti kaip root, nes jis skaitomas iš kai kurių saugomų serverio zonų.
Taigi, pradėkime, ar mes?
Pirma, nustatykite scenarijaus kintamuosius:
#! / bin / bash
#
# Script, kad patikrintumėte sistemos apkrovos vidurkį, kad bandytumėte nustatyti
# kokie procesai yra per dideli ...
#
# 07Jul2010 tjones
#
# nustatyti aplinką
dt = "data +% d% b% Y-% X"
# Akivaizdu, kad pakeiskite šiuos katalogus, kuriuose faktiškai laikomi jūsų žurnalo failai
tmpfile = "/ tmp / checkSystemLoad.tmp"
logfile = "/ tmp / checkSystemLoad.log"
msgLog = "/ var / log / messages"
mysqlLog = "/ var / log / mysqld.log"
# pirmasis laiškas yra standartinis el. laiškas ataskaitoms. Antrasis skirtas mobilųjį telefoną (su pared žemyn ataskaita)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
machine = "hostname"
# Šie trys yra skirti naudoti „mytop“ - naudokite „db“ vartotoją, kuris turi tinkamas teises
dbusr = "naudotojo vardas"
dbpw = "slaptažodis"
db = "yourdatabasename"
# Toliau pateikiamas apkrovos lygis, kad patikrintumėte - 10 yra labai didelis, todėl galbūt norėsite jį sumažinti.
levelToCheck = 10
Tada patikrinkite apkrovos lygį, kad pamatytumėte, ar scenarijus turėtų tęsti:
# Nustatyti kintamuosius iš sistemos:
loadLevel = "katė / proc / loadavg | awk" print $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# jei apkrovos lygis yra didesnis nei norite, paleiskite scenarijaus procesą. Priešingu atveju išeiti iš 0
jei [$ loadLevel -gt $ levelToCheck]; tada
echo ""> $ tmpfile
echo "**************************************" >> $ tmpfile
echo "Data: $ dt" >> $ tmpfile
echo "Patikrinkite sistemos apkrovą ir procesus" >> $ tmpfile
echo "**************************************" >> $ tmpfile
Ir tęskite per patikrinimus, rašydami rezultatus į laikiną failą. Pridėti arba ištrinti elementus iš čia, jei tai įmanoma jūsų situacijai:
# Gauti daugiau kintamųjų iš sistemos:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc-l"# Rodyti esamą apkrovos lygį:
echo "apkrovos lygis: $ loadLevel" >> $ tmpfile
echo "************************************************ * ">> $ tmpfile# Rodyti šiuo metu vykdomų httpd procesų skaičių (neįskaitant vaikų):
echo "httpd procesų skaičius dabar: $ httpdProcesses" >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Rodyti proceso sąrašą:
echo "Dabar vykdomi procesai:" >> $ tmpfile
ps f -ef >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Rodyti dabartinę MySQL informaciją:
echo "Mytop rezultatai:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile
Atkreipkite dėmesį į viršutinę komandą, mes rašome į du temp failus. Vienas iš jų yra daug mažesnis pranešimas mobiliesiems telefonams. Jei nenorite, kad mobiliojo telefono įspėjimai skubiai skambėtų trimis rytais, galite tai padaryti (ir ištrinti antrąjį el. Laiškus vėliau scenarijuje).
# Rodyti dabartinį viršų:
echo "top dabar rodo:" >> $ tmpfile
echo "top dabar rodo:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile
Daugiau patikrinimų:
# Rodyti dabartinius ryšius:
echo "netstat dabar rodo:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Patikrinkite vietos diske
echo "disk space:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile
Tada parašykite laikiną failo turinį į nuolatinį žurnalo failą ir išsiųskite rezultatus atitinkamoms šalims. Antrasis laiškas yra lyginamieji rezultatai, susidedantys iš standarto iš „viršaus“:
# Siųsti rezultatus į žurnalo failą:
/ bin / cat $ tmpfile >> $ logfile# Ir el. Laiškų sysadmin rezultatai:
/ usr / bin / mutt -s "$ mašina turi didelį apkrovos lygį! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile
Ir tada kai kurie namų ruošos ir išvykimo darbai:
# Ir tada pašalinkite temp failą:
rm $ tmpfile
rm $ topfile
fi#
išeiti 0
Tikimės, kad tai padės kažkas ten. Pilnai surinktas scenarijus yra:
#! / bin / bash
#
# Script, kad patikrintumėte sistemos apkrovos vidurkį, kad būtų galima nustatyti, kokie procesai yra
# pernelyg aukštas…
#
# nustatyti aplinką
dt = "data +% d% b% Y-% X"
# Akivaizdu, kad pakeiskite šiuos katalogus, kuriuose faktiškai laikomi jūsų žurnalo failai
tmpfile = "/ tmp / checkSystemLoad.tmp"
logfile = "/ tmp / checkSystemLoad.log"
msgLog = "/ var / log / messages"
mysqlLog = "/ var / log / mysqld.log"
# pirmasis laiškas yra standartinis el. laiškas ataskaitoms. Antrasis skirtas mobilųjį telefoną (su pared žemyn ataskaita)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
machine = "hostname"
# Šie trys yra skirti naudoti „mytop“ - naudokite „db“ vartotoją, kuris turi tinkamas teises
dbusr = "naudotojo vardas"
dbpw = "slaptažodis"
db = "yourdatabasename"
# Toliau pateikiamas apkrovos lygis, kad patikrintumėte - 10 yra labai didelis, todėl galbūt norėsite jį sumažinti.
levelToCheck = 10
# Nustatyti kintamuosius iš sistemos:
loadLevel = "katė / proc / loadavg | awk" print $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# jei apkrovos lygis yra didesnis nei norite, paleiskite scenarijaus procesą. Priešingu atveju išeiti iš 0
jei [$ loadLevel -gt $ levelToCheck]; tada
echo ""> $ tmpfile
echo "**************************************" >> $ tmpfile
echo "Data: $ dt" >> $ tmpfile
echo "Patikrinkite sistemos apkrovą ir procesus" >> $ tmpfile
echo "**************************************" >> $ tmpfile# Gauti daugiau kintamųjų iš sistemos:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc-l"# Rodyti esamą apkrovos lygį:
echo "apkrovos lygis: $ loadLevel" >> $ tmpfile
echo "************************************************ * ">> $ tmpfile# Rodyti šiuo metu vykdomų httpd procesų skaičių (neįskaitant vaikų):
echo "httpd procesų skaičius dabar: $ httpdProcesses" >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Rodyti proceso sąrašą:
echo "Dabar vykdomi procesai:" >> $ tmpfile
ps f -ef >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Rodyti dabartinę MySQL informaciją:
echo "Mytop rezultatai:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Rodyti dabartinį viršų:
echo "top dabar rodo:" >> $ tmpfile
echo "top dabar rodo:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Rodyti dabartinius ryšius:
echo "netstat dabar rodo:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Patikrinkite vietos diske
echo "disk space:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Siųsti rezultatus į žurnalo failą:
/ bin / cat $ tmpfile >> $ logfile# Ir el. Laiškų sysadmin rezultatai:
/ usr / bin / mutt -s "$ mašina turi didelį apkrovos lygį! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile# Ir tada pašalinkite temp failą:
rm $ tmpfile
rm $ topfile
fi#
išeiti 0