Diagnostisera Linux Server Load Problem med ett enkelt skript
Om du har varit en administratör under någon tid har du säkert upptäckt situationer där en server spikar i CPU-användning eller minnesutnyttjande och / eller laddningsnivåer. Running 'top' kommer inte alltid att ge dig svaret heller. Så hur hittar du de snygga processerna som tuggar upp dina systemresurser för att kunna döda dem?
Det följande skriptet kan hjälpa till. Det skrevs för en webbserver, så har vissa delar av det som specifikt letar efter httpd-processer och vissa delar som handlar om MySQL. Beroende på din serverutplacering, kommentera / ta bort dessa avsnitt och lägg till andra. Den ska användas till en utgångspunkt.
Förutsättningarna för den här versionen av skriptet är några freeware publicerade under GNU General Public License, kallad mytop (tillgänglig på http://jeremy.zawodny.com/mysql/mytop/) vilket är ett fantastiskt verktyg för att kontrollera hur MySQL utför. Det blir gammalt, men fungerar fortfarande bra för våra syften här.
Dessutom använder jag mutt som mailer - du kanske vill ändra skriptet för att helt enkelt använda det linux-inbyggda verktyget "mail". Jag kör det via cron varje timme; justera som du passar dig. Åh - och det här skriptet måste springa som root eftersom det läser från några skyddade områden på servern.
Så låt oss börja, ska vi?
Ange först dina skriptvariabler:
#! / Bin / bash
#
# Skript för att kontrollera genomsnittliga nivåer för systembelastning för att försöka bestämma
# vilka processer tar det för högt ...
#
# 07Jul2010 tjones
#
# set miljö
dt = "datum +% d% b% Y-% X"
# Ändra självklart följande kataloger till var dina loggfiler faktiskt hålls
tmpfile = "/ tmp / checkSystemLoad.tmp"
loggfil = "/ tmp / checkSystemLoad.log"
msgLog = "/ var / log / messages"
mysqlLog = "/ var / log / mysqld.log"
# Den första poststoppen är standard e-post för rapporter. Den andra är för mobiltelefon (med en jämförd rapport)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
maskin = "värdnamn"
# Följande tre är för mytopanvändning - använd en db-användare som har anständiga rättigheter
dbusr = "användarnamn"
dbpw = "lösenord"
db = "yourdatabasename"
# Följande är lastnivån att kolla på - 10 är riktigt hög, så du kanske vill sänka den.
levelToCheck = 10
Kontrollera sedan din belastningsnivå för att se om skriptet ska fortsätta:
# Ställ in variabler från systemet:
loadLevel = "cat / proc / loadavg | awk" skriv ut $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# Om belastningsnivån är större än vad du vill, starta scriptprocessen. Annars, avsluta 0
om [$ loadLevel -gt $ levelToCheck]; sedan
echo ""> $ tmpfile
echo "**************************************" >> $ tmpfile
eko "Datum: $ dt" >> $ tmpfile
echo "Kontrollera systembelastning och processer" >> $ tmpfile
echo "**************************************" >> $ tmpfile
Och fortsätt genom kontrollerna och skriv resultaten till den temporära filen. Lägg till eller ta bort objekt härifrån där det är aktuellt för din situation:
# Hämta fler variabler från systemet:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"# Visa aktuell belastningsnivå:
echo "Laddningsnivå är: $ loadLevel" >> $ tmpfile
echo "*********************************************** * ">> $ tmpfile# Visa antal httpd-processer som körs nu (inte inklusive barn):
echo "Antal httpd-processer nu: $ httpdProcesses" >> $ tmpfile
echo "*********************************************** * ">> $ tmpfile
echo "" >> $ tmpfile# Visa processlista:
echo "Processer som nu körs:" >> $ tmpfile
ps f -ef >> $ tmpfile
echo "*********************************************** * ">> $ tmpfile
echo "" >> $ tmpfile# Visa aktuell MySQL-info:
echo "Resultat från mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
echo "*********************************************** * ">> $ tmpfile
echo "" >> $ tmpfile
Observera med det översta kommandot, vi skriver till två tempfiler. En är för det mycket mindre meddelandet till mobiltelefonen. Om du inte vill ha brådskande telefonvarningar vid tre på morgonen kan du ta bort det här (och ta ut den andra postrutinen senare i skriptet).
# Visa aktuell topp:
echo "toppen visar nu:" >> $ tmpfile
echo "toppen visar nu:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
echo "*********************************************** * ">> $ tmpfile
echo "" >> $ tmpfile
Fler kontroller:
# Visa aktuella anslutningar:
echo "netstat visar nu:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
echo "*********************************************** * ">> $ tmpfile
echo "" >> $ tmpfile# Kontrollera diskutrymme
eko "diskutrymme:" >> $ tmpfile
/ bin / df-k >> $ tmpfile
echo "*********************************************** * ">> $ tmpfile
echo "" >> $ tmpfile
Skriv sedan det temporära filinnehållet till en mer permanent loggfil och skicka resultatet till lämpliga parter. Den andra sändningen är de uppdelade resultaten som helt enkelt består av standarden utifrån "topp":
# Skicka resultat till loggfilen:
/ bin / cat $ tmpfile >> $ logfile# Och mailresultat till sysadmin:
/ usr / bin / mutt -s "$ maskin har en hög lastnivå! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ loggfil
Och sedan hushållning och utträde:
# Och ta bort tempfilen:
rm $ tmpfile
rm $ topfile
fi#
utgång 0
Förhoppningsvis hjälper det någon där ute. Fullständigt monterat skript är:
#! / Bin / bash
#
# Skript för att kontrollera genomsnittliga nivåer för systembelastning för att försöka bestämma vilka processer som är
# tar det för högt ...
#
# set miljö
dt = "datum +% d% b% Y-% X"
# Ändra självklart följande kataloger till var dina loggfiler faktiskt hålls
tmpfile = "/ tmp / checkSystemLoad.tmp"
loggfil = "/ tmp / checkSystemLoad.log"
msgLog = "/ var / log / messages"
mysqlLog = "/ var / log / mysqld.log"
# Den första poststoppen är standard e-post för rapporter. Den andra är för mobiltelefon (med en jämförd rapport)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
maskin = "värdnamn"
# Följande tre är för mytopanvändning - använd en db-användare som har anständiga rättigheter
dbusr = "användarnamn"
dbpw = "lösenord"
db = "yourdatabasename"
# Följande är lastnivån att kolla på - 10 är riktigt hög, så du kanske vill sänka den.
levelToCheck = 10
# Ställ in variabler från systemet:
loadLevel = "cat / proc / loadavg | awk" skriv ut $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# Om belastningsnivån är större än vad du vill, starta scriptprocessen. Annars, avsluta 0
om [$ loadLevel -gt $ levelToCheck]; sedan
echo ""> $ tmpfile
echo "**************************************" >> $ tmpfile
eko "Datum: $ dt" >> $ tmpfile
echo "Kontrollera systembelastning och processer" >> $ tmpfile
echo "**************************************" >> $ tmpfile# Hämta fler variabler från systemet:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"# Visa aktuell belastningsnivå:
echo "Laddningsnivå är: $ loadLevel" >> $ tmpfile
echo "*********************************************** * ">> $ tmpfile# Visa antal httpd-processer som körs nu (inte inklusive barn):
echo "Antal httpd-processer nu: $ httpdProcesses" >> $ tmpfile
echo "*********************************************** * ">> $ tmpfile
echo "" >> $ tmpfile# Visa processlista:
echo "Processer som nu körs:" >> $ tmpfile
ps f -ef >> $ tmpfile
echo "*********************************************** * ">> $ tmpfile
echo "" >> $ tmpfile# Visa aktuell MySQL-info:
echo "Resultat från mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
echo "*********************************************** * ">> $ tmpfile
echo "" >> $ tmpfile# Visa aktuell topp:
echo "toppen visar nu:" >> $ tmpfile
echo "toppen visar nu:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
echo "*********************************************** * ">> $ tmpfile
echo "" >> $ tmpfile# Visa aktuella anslutningar:
echo "netstat visar nu:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
echo "*********************************************** * ">> $ tmpfile
echo "" >> $ tmpfile# Kontrollera diskutrymme
eko "diskutrymme:" >> $ tmpfile
/ bin / df-k >> $ tmpfile
echo "*********************************************** * ">> $ tmpfile
echo "" >> $ tmpfile# Skicka resultat till loggfilen:
/ bin / cat $ tmpfile >> $ logfile# Och mailresultat till sysadmin:
/ usr / bin / mutt -s "$ maskin har en hög lastnivå! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ loggfil# Och ta bort tempfilen:
rm $ tmpfile
rm $ topfile
fi#
utgång 0