Diagnostica i problemi di caricamento del server Linux con uno script semplice

Diagnostica i problemi di caricamento del server Linux con uno script semplice
Diagnostica i problemi di caricamento del server Linux con uno script semplice

Video: Diagnostica i problemi di caricamento del server Linux con uno script semplice

Video: Diagnostica i problemi di caricamento del server Linux con uno script semplice
Video: Gmail Guida Pratica: Come Visualizzare le Mail Non Lette Rapidamente (Tutorial Italiano) - YouTube 2024, Novembre
Anonim

Se sei stato un amministratore per un certo periodo di tempo, hai sicuramente scoperto situazioni in cui un server picchia nell'uso della CPU o nell'utilizzo della memoria e / o nei livelli di carico. Eseguire `top` non ti darà sempre la risposta. Quindi, come trovi quei subdoli processi che stanno masticando le risorse del tuo sistema per essere in grado di ucciderli?

Il seguente script potrebbe essere in grado di aiutare. È stato scritto per un web server, quindi ha alcune parti che sono specificamente alla ricerca di processi httpd e alcune parti che si occupano di MySQL. A seconda della distribuzione del server, è sufficiente commentare / eliminare quelle sezioni e aggiungerne altre. Dovrebbe essere usato per un punto di partenza.

I prerequisiti per questa versione dello script sono alcuni freeware rilasciati sotto la GNU General Public License chiamata mytop (disponibile all'indirizzo https://jeremy.zawodny.com/mysql/mytop/) che è uno strumento fantastico per verificare come MySQL sta eseguendo. Sta invecchiando, ma funziona ancora alla grande per i nostri scopi qui. Inoltre, io uso mutt come mailer - potresti voler cambiare lo script per usare semplicemente linux integrato nell'utility `mail`. Lo eseguo via cron ogni ora; regolare come meglio credi. Oh - e questo script deve essere eseguito come root poiché legge da alcune aree protette del server.

Quindi iniziamo, dobbiamo?

Per prima cosa, imposta le tue variabili di script:

#!/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

Successivamente, controlla il tuo livello di carico per vedere se lo script deve continuare:

# 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

E continua attraverso i controlli, scrivendo i risultati nel file temporaneo. Aggiungi o elimina elementi da qui dove applicabile alla tua situazione:

# 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

Notare con il comando in alto, stiamo scrivendo su due file temporanei. Uno è per il messaggio molto più piccolo al telefono cellulare. Se non si desidera l'urgenza degli allarmi del cellulare alle tre del mattino, è possibile rimuoverlo (ed eliminare la seconda routine di mailing più avanti nella sceneggiatura).

# 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

Più controlli:

# 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

Quindi scrivi il contenuto del file temporaneo in un file di registro permanente e invia i risultati alle parti appropriate. Il secondo mailing è il risultato ridotto che consiste semplicemente nello standard di "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

E poi alcune pulizie e uscita:

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

# exit 0

Spero che questo aiuti qualcuno là fuori. Lo script completamente assemblato è:

#!/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

Consigliato: