Diagnose van Linux Server Load Problems met een Simple Script
Als je al een tijdje beheerder bent, heb je zeker situaties ontdekt waarbij een server spant in CPU-gebruik of geheugengebruik en / of laadniveaus. Het uitvoeren van 'top' geeft je ook niet altijd het antwoord. Dus hoe vind je die sluipende processen die je systeembronnen aan het opeten zijn om ze te kunnen doden?
Het volgende script kan misschien helpen. Het is geschreven voor een webserver, dus sommige delen ervan zijn specifiek op zoek naar httpd-processen en sommige delen die te maken hebben met MySQL. Afhankelijk van uw serverimplementatie, commentaar / verwijder die secties en voeg anderen toe. Het zou voor een beginpunt moeten worden gebruikt.
Vereisten voor deze versie van het script zijn een aantal freeware uitgebracht onder de GNU General Public License genaamd mytop (beschikbaar op http://jeremy.zawodny.com/mysql/mytop/), wat een fantastisch hulpmiddel is om te controleren hoe MySQL presteert. Het wordt oud, maar werkt nog steeds goed voor onze doeleinden hier.
Daarnaast gebruik ik mutt als de mailer - misschien wilt u het script wijzigen om eenvoudig het ingebouwde linux-hulpprogramma 'mail' te gebruiken. Ik voer het elk uur via cron uit; aanpassen zoals je wilt. Oh - en dit script moet als root worden uitgevoerd, omdat het van sommige beveiligde gedeelten van de server leest.
Dus laten we beginnen, zullen we?
Stel eerst uw scriptvariabelen in:
#! / Bin / bash
#
# Script om de gemiddelde systeemniveau's te controleren om te proberen te bepalen
# welke processen nemen het overdreven hoog ...
#
# 07Jul2010 tjones
#
# ingestelde omgeving
dt = "datum +% d% b% Y-% X"
# Verander natuurlijk de volgende mappen naar waar uw logbestanden daadwerkelijk worden bewaard
tmpfile = "/ tmp / checkSystemLoad.tmp"
logfile = "/ tmp / checkSystemLoad.log"
msgLog = "/ var / log / messages"
mysqlLog = "/ var / log / mysqld.log"
# de eerste e-mailstop is standaard e-mail voor rapporten. De tweede is voor een mobiele telefoon (met een gereduceerd rapport)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
machine = "hostnaam"
# De volgende drie zijn voor gebruik door mytop - gebruik een db-gebruiker met fatsoenlijke rechten
dbusr = "gebruikersnaam"
dbpw = "password"
db = "yourdatabasename"
# Het volgende is het laadniveau dat moet worden gecontroleerd - 10 is erg hoog, dus u kunt het misschien verlagen.
levelToCheck = 10
Controleer vervolgens uw laadniveau om te zien of het script moet doorgaan:
# Variabelen instellen van systeem:
loadLevel = "cat / proc / loadavg | awk" print $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# als het laadniveau groter is dan u wilt, start u het scriptproces. Anders sluit u 0 af
als [$ loadLevel -gt $ levelToCheck]; dan
echo ""> $ tmpfile
echo "******************************" >> $ tmpfile
echo "Datum: $ dt" >> $ tmpfile
echo "Controleer systeem Load & Processes" >> $ tmpfile
echo "******************************" >> $ tmpfile
En ga door met de controles en schrijf de resultaten naar het tijdelijke bestand. Voeg hier items toe of verwijder ze, indien van toepassing op uw situatie:
# Haal meer variabelen uit het systeem:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"# Toon huidig laadniveau:
echo "Laadniveau is: $ loadLevel" >> $ tmpfile
echo "**************************************** * ">> $ tmpfile# Toon aantal httpd-processen dat nu actief is (niet inclusief kinderen):
echo "Aantal httpd-processen nu: $ httpdProcesses" >> $ tmpfile
echo "**************************************** * ">> $ tmpfile
echo "" >> $ tmpfile# Toon proceslijst:
echo "Processen nu uitgevoerd:" >> $ tmpfile
ps f -ef >> $ tmpfile
echo "**************************************** * ">> $ tmpfile
echo "" >> $ tmpfile# Toon huidige MySQL-info:
echo "Resultaten van mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
echo "**************************************** * ">> $ tmpfile
echo "" >> $ tmpfile
Let op met de opdracht top, we schrijven naar twee tijdelijke bestanden. Een daarvan is voor het veel kleinere bericht naar de mobiele telefoon. Als je de urgentie van GSM-meldingen om drie uur 's nachts niet wilt hebben, kun je dit verwijderen (en de tweede mailroutine later in het script verwijderen).
# Huidige top tonen:
echo "bovenaan toont nu:" >> $ tmpfile
echo "bovenaan toont nu:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
echo "**************************************** * ">> $ tmpfile
echo "" >> $ tmpfile
Meer controles:
# Toon huidige verbindingen:
echo "netstat laat nu zien:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
echo "**************************************** * ">> $ tmpfile
echo "" >> $ tmpfile# Controleer schijfruimte
echo "disk space:" >> $ tmpfile
/ bin / df-k >> $ tmpfile
echo "**************************************** * ">> $ tmpfile
echo "" >> $ tmpfile
Schrijf vervolgens de tijdelijke bestandsinhoud naar een meer permanent logbestand en e-mail de resultaten naar de juiste partijen. De tweede mailing is de gereduceerde resultaten, simpelweg bestaande uit de standaard uit 'top':
# Resultaten verzenden naar logbestand:
/ bin / cat $ tmpfile >> $ logbestand# En e-mail resultaten naar sysadmin:
/ usr / bin / mutt -s "$ machine heeft een hoog laadniveau! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile
En dan wat huishoudelijke en exit:
# En verwijder vervolgens het tijdelijke bestand:
rm $ tmpfile
rm $ topfile
fi#
exit 0
Hopelijk helpt dit iemand daarbuiten. Volledig geassembleerd script is:
#! / Bin / bash
#
# Script om de gemiddelde systeemniveau's te controleren om te proberen te bepalen welke processen dat zijn
# het overdreven hoog nemen ...
#
# ingestelde omgeving
dt = "datum +% d% b% Y-% X"
# Verander natuurlijk de volgende mappen naar waar uw logbestanden daadwerkelijk worden bewaard
tmpfile = "/ tmp / checkSystemLoad.tmp"
logfile = "/ tmp / checkSystemLoad.log"
msgLog = "/ var / log / messages"
mysqlLog = "/ var / log / mysqld.log"
# de eerste e-mailstop is standaard e-mail voor rapporten. De tweede is voor een mobiele telefoon (met een gereduceerd rapport)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
machine = "hostnaam"
# De volgende drie zijn voor gebruik door mytop - gebruik een db-gebruiker met fatsoenlijke rechten
dbusr = "gebruikersnaam"
dbpw = "password"
db = "yourdatabasename"
# Het volgende is het laadniveau dat moet worden gecontroleerd - 10 is erg hoog, dus u kunt het misschien verlagen.
levelToCheck = 10
# Variabelen instellen van systeem:
loadLevel = "cat / proc / loadavg | awk" print $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# als het laadniveau groter is dan u wilt, start u het scriptproces. Anders sluit u 0 af
als [$ loadLevel -gt $ levelToCheck]; dan
echo ""> $ tmpfile
echo "******************************" >> $ tmpfile
echo "Datum: $ dt" >> $ tmpfile
echo "Controleer systeem Load & Processes" >> $ tmpfile
echo "******************************" >> $ tmpfile# Haal meer variabelen uit het systeem:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"# Toon huidig laadniveau:
echo "Laadniveau is: $ loadLevel" >> $ tmpfile
echo "**************************************** * ">> $ tmpfile# Toon aantal httpd-processen dat nu actief is (niet inclusief kinderen):
echo "Aantal httpd-processen nu: $ httpdProcesses" >> $ tmpfile
echo "**************************************** * ">> $ tmpfile
echo "" >> $ tmpfile# Toon proceslijst:
echo "Processen nu uitgevoerd:" >> $ tmpfile
ps f -ef >> $ tmpfile
echo "**************************************** * ">> $ tmpfile
echo "" >> $ tmpfile# Toon huidige MySQL-info:
echo "Resultaten van mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
echo "**************************************** * ">> $ tmpfile
echo "" >> $ tmpfile# Huidige top tonen:
echo "bovenaan toont nu:" >> $ tmpfile
echo "bovenaan toont nu:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
echo "**************************************** * ">> $ tmpfile
echo "" >> $ tmpfile# Toon huidige verbindingen:
echo "netstat laat nu zien:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
echo "**************************************** * ">> $ tmpfile
echo "" >> $ tmpfile# Controleer schijfruimte
echo "disk space:" >> $ tmpfile
/ bin / df-k >> $ tmpfile
echo "**************************************** * ">> $ tmpfile
echo "" >> $ tmpfile# Resultaten verzenden naar logbestand:
/ bin / cat $ tmpfile >> $ logbestand# En e-mail resultaten naar sysadmin:
/ usr / bin / mutt -s "$ machine heeft een hoog laadniveau! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile# En verwijder vervolgens het tijdelijke bestand:
rm $ tmpfile
rm $ topfile
fi#
exit 0