Diagnostiser Linux Server Load Problemer med et enkelt script

Diagnostiser Linux Server Load Problemer med et enkelt script
Diagnostiser Linux Server Load Problemer med et enkelt script

Video: Diagnostiser Linux Server Load Problemer med et enkelt script

Video: Diagnostiser Linux Server Load Problemer med et enkelt script
Video: OSI Layer 4 Explained - YouTube 2024, April
Anonim

Hvis du har vært en administrator for en lengre tid, har du sikkert oppdaget situasjoner hvor en server spikes i CPU bruk eller minne utnyttelse og / eller last nivåer. Kjører "toppen" vil ikke alltid gi deg svaret, heller ikke. Så hvordan finner du de lurte prosessene som tugger opp systemressursene dine for å drepe dem?

Følgende skript kan kanskje hjelpe. Det ble skrevet for en webserver, så har noen deler av det som er spesielt på jakt etter httpd-prosesser og enkelte deler som omhandler MySQL. Avhengig av serverplasseringen din, kan du bare kommentere / slette de seksjonene og legge til andre. Det skal brukes til utgangspunkt.

Forutsetninger for denne versjonen av scriptet er noen freeware utgitt under GNU General Public License kalt mytop (tilgjengelig på https://jeremy.zawodny.com/mysql/mytop/) som er et fantastisk verktøy for å sjekke hvordan MySQL utfører. Det blir gammelt, men fungerer fortsatt bra for våre formål her. I tillegg bruker jeg mutt som mailer - det kan hende du vil endre skriptet for å bare bruke Linux bygget i `mail`-verktøyet. Jeg kjører den via cron hver time; Juster etter behov. Oh - og dette skriptet må løpe som root siden det leses fra enkelte beskyttede områder av serveren.

Så la oss komme i gang, skal vi?

Først angi du skriptvariablene dine:

#!/bin/bash # # Script to check system load average levels to try to determine # what processes are taking it overly high… # # 07Jul2010 tjones # # set environment dt=`date +%d%b%Y-%X` # Obviously, change the following directories to where your log files actually are kept tmpfile='/tmp/checkSystemLoad.tmp' logfile='/tmp/checkSystemLoad.log' msgLog='/var/log/messages' mysqlLog='/var/log/mysqld.log' # the first mailstop is standard email for reports. Second one is for cell phone (with a pared down report) mailstop='[email protected]' mailstop1='[email protected]' machine=`hostname` # The following three are for mytop use - use a db user that has decent rights dbusr='username' dbpw='password' db='yourdatabasename' # The following is the load level to check on - 10 is really high, so you might want to lower it. levelToCheck=10

Kontroller deretter lastnivået ditt for å se om skriptet skal fortsette:

# Set variables from system: loadLevel=`cat /proc/loadavg | awk '{print $1}'` loadLevel=$( printf '%0.f' $loadLevel )

# if the load level is greater than you want, start the script process. Otherwise, exit 0

if [ $loadLevel -gt $levelToCheck ]; then echo '' > $tmpfile echo '**************************************' >>$tmpfile echo 'Date: $dt ' >>$tmpfile echo 'Check System Load & Processes ' >>$tmpfile echo '**************************************' >>$tmpfile

Og fortsett gjennom kontrollene, skriv resultatene til den midlertidige filen. Legg til eller slett elementer herfra der det er aktuelt for din situasjon:

# Get more variables from system: httpdProcesses=`ps -def | grep httpd | grep -v grep | wc -l`

# Show current load level: echo 'Load Level Is: $loadLevel' >>$tmpfile echo '*************************************************' >>$tmpfile

# Show number of httpd processes now running (not including children): echo 'Number of httpd processes now: $httpdProcesses' >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Show process list: echo 'Processes now running:' >>$tmpfile ps f -ef >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Show current MySQL info: echo 'Results from mytop:' >>$tmpfile /usr/bin/mytop -u $dbusr -p $dbpw -b -d $db >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

Legg merke til toppkommandoen, vi skriver til to tempfiler. En er for den mye mindre meldingen til mobiltelefonen. Hvis du ikke vil ha haster med mobiltelefonvarsler klokken tre om morgenen, kan du ta dette ut (og ta ut den andre postrutinen senere i skriptet).

# Show current top: echo 'top now shows:' >>$tmpfile echo 'top now shows:' >>$topfile /usr/bin/top -b -n1 >>$tmpfile /usr/bin/top -b -n1 >>$topfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

Flere kontroller:

# Show current connections: echo 'netstat now shows:' >>$tmpfile /bin/netstat -p >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Check disk space echo 'disk space:' >>$tmpfile /bin/df -k >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

Skriv deretter den midlertidige filinnholdet til en mer permanent loggfil og send resultatene til de aktuelle partene. Den andre postadressen er de oppdelte resultatene som bare består av standarden ut av `top`:

# Send results to log file: /bin/cat $tmpfile >>$logfile

# And email results to sysadmin: /usr/bin/mutt -s '$machine has a high load level! - $dt' -a $mysqlLog -a $msgLog $mailstop <$tmpfile /usr/bin/mutt -s '$machine has a high load level! - $dt' $mailstop1 <$topfile echo '**************************************' >>$logfile

Og så litt housekeeping og exit:

# And then remove the temp file: rm $tmpfile rm $topfile fi

# exit 0

Forhåpentligvis hjelper dette noen der ute. Fullt montert skript er:

#!/bin/bash # # Script to check system load average levels to try to determine what processes are # taking it overly high… # # set environment dt=`date +%d%b%Y-%X` # Obviously, change the following directories to where your log files actually are kept tmpfile='/tmp/checkSystemLoad.tmp' logfile='/tmp/checkSystemLoad.log' msgLog='/var/log/messages' mysqlLog='/var/log/mysqld.log' # the first mailstop is standard email for reports. Second one is for cell phone (with a pared down report) mailstop='[email protected]' mailstop1='[email protected]' machine=`hostname` # The following three are for mytop use - use a db user that has decent rights dbusr='username' dbpw='password' db='yourdatabasename' # The following is the load level to check on - 10 is really high, so you might want to lower it. levelToCheck=10 # Set variables from system: loadLevel=`cat /proc/loadavg | awk '{print $1}'` loadLevel=$( printf '%0.f' $loadLevel )

# if the load level is greater than you want, start the script process. Otherwise, exit 0

if [ $loadLevel -gt $levelToCheck ]; then echo '' > $tmpfile echo '**************************************' >>$tmpfile echo 'Date: $dt ' >>$tmpfile echo 'Check System Load & Processes ' >>$tmpfile echo '**************************************' >>$tmpfile

# Get more variables from system: httpdProcesses=`ps -def | grep httpd | grep -v grep | wc -l`

# Show current load level: echo 'Load Level Is: $loadLevel' >>$tmpfile echo '*************************************************' >>$tmpfile

# Show number of httpd processes now running (not including children): echo 'Number of httpd processes now: $httpdProcesses' >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Show process list: echo 'Processes now running:' >>$tmpfile ps f -ef >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Show current MySQL info: echo 'Results from mytop:' >>$tmpfile /usr/bin/mytop -u $dbusr -p $dbpw -b -d $db >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Show current top: echo 'top now shows:' >>$tmpfile echo 'top now shows:' >>$topfile /usr/bin/top -b -n1 >>$tmpfile /usr/bin/top -b -n1 >>$topfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Show current connections: echo 'netstat now shows:' >>$tmpfile /bin/netstat -p >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Check disk space echo 'disk space:' >>$tmpfile /bin/df -k >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Send results to log file: /bin/cat $tmpfile >>$logfile

# And email results to sysadmin: /usr/bin/mutt -s '$machine has a high load level! - $dt' -a $mysqlLog -a $msgLog $mailstop <$tmpfile /usr/bin/mutt -s '$machine has a high load level! - $dt' $mailstop1 <$topfile echo '**************************************' >>$logfile

# And then remove the temp file: rm $tmpfile rm $topfile fi

# exit 0

Anbefalt: