Diagnostica i problemi di caricamento del server Linux con uno script semplice
Se sei stato un amministratore per un certo periodo di tempo, hai sicuramente scoperto situazioni in cui un server picchia nell'utilizzo della CPU o nell'utilizzo della memoria e / o nei livelli di carico. Eseguire 'top' non ti darà sempre la risposta. Quindi, come si trovano quei processi subdoli che stanno masticando le risorse del sistema per essere in grado di ucciderli?
Il seguente script potrebbe essere in grado di aiutare. È stato scritto per un server web, 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 http://jeremy.zawodny.com/mysql/mytop/) che è uno strumento fantastico per verificare come MySQL sta eseguendo. Sta diventando vecchio, ma funziona ancora alla grande per i nostri scopi qui.
Inoltre, uso mutt come mailer - potresti voler cambiare lo script semplicemente usando l'utility linux integrata in "mail". Lo faccio tramite 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 per verificare i livelli di carico medio del sistema per provare a determinare
# quali processi stanno prendendo troppo in alto ...
#
# 07Jul2010 tjones
#
# set environment
dt = "data +% d% b% Y-% X"
# Ovviamente, cambia le seguenti directory dove vengono effettivamente conservati i tuoi file di registro
tmpfile = "/ tmp / checkSystemLoad.tmp"
logfile = "/ tmp / checkSystemLoad.log"
MSGLOG = "/ var / log / messages"
mysqlLog = "/ var / log / mysqld.log"
# il primo mailstop è l'e-mail standard per i report. Il secondo è per il cellulare (con un rapporto ridotto)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
Macchina = "host"
# I seguenti tre sono per uso mytop: utilizzare un utente db con diritti decenti
dbusr = "username"
DBPW = "password"
db = "YourDatabaseName"
# Quanto segue è il livello di carico da controllare - 10 è veramente alto, quindi potresti volerlo abbassare.
levelToCheck = 10
Successivamente, controlla il tuo livello di carico per vedere se lo script deve continuare:
# Imposta variabili dal sistema:
loadLevel = "cat / proc / loadavg | awk" print $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# se il livello di carico è maggiore di quello desiderato, avviare la procedura di script. Altrimenti, esci 0
se [$ loadLevel -gt $ levelToCheck]; poi
echo ""> $ tmpfile
echo "**************************************" >> $ tmpfile
echo "Data: $ dt" >> $ tmpfile
echo "Verifica caricamento e processi del sistema" >> $ 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:
# Ottieni più variabili dal sistema:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"# Mostra il livello di carico attuale:
echo "Load Level Is: $ loadLevel" >> $ tmpfile
eco "************************************************ * ">> $ tmpfile# Mostra il numero dei processi httpd ora in esecuzione (esclusi i bambini):
echo "Numero di processi httpd ora: $ httpdProcesses" >> $ tmpfile
eco "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Mostra elenco processi:
echo "Processi ora in esecuzione:" >> $ tmpfile
ps f -ef >> $ tmpfile
eco "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Mostra le informazioni attuali su MySQL:
echo "Risultati da mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
eco "************************************************ * ">> $ 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 vuoi l'urgenza degli avvisi del cellulare alle tre del mattino, puoi farlo (e prendere la seconda routine di mailing più avanti nella sceneggiatura).
# Mostra la parte superiore corrente:
echo "top ora mostra:" >> $ tmpfile
echo "top ora mostra:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
eco "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile
Più controlli:
# Mostra connessioni attuali:
echo "netstat ora mostra:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
eco "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Controlla lo spazio del disco
echo "spazio su disco:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
eco "************************************************ * ">> $ 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":
# Invia risultati al file di registro:
/ bin / cat $ tmpfile >> $ logfile# E i risultati dell'email a sysadmin:
/ usr / bin / mutt -s "$ machine ha un alto livello di carico! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile
E poi alcune pulizie e uscita:
# E quindi rimuovere il file temporaneo:
rm $ tmpfile
rm $ topfile
fi#
uscita 0
Speriamo che questo aiuti qualcuno là fuori. Lo script completamente assemblato è:
#! / Bin / bash
#
# Script per verificare i livelli di carico medio del sistema per provare a determinare quali processi sono
# prendendo troppo in alto ...
#
# set environment
dt = "data +% d% b% Y-% X"
# Ovviamente, cambia le seguenti directory dove vengono effettivamente conservati i tuoi file di registro
tmpfile = "/ tmp / checkSystemLoad.tmp"
logfile = "/ tmp / checkSystemLoad.log"
MSGLOG = "/ var / log / messages"
mysqlLog = "/ var / log / mysqld.log"
# il primo mailstop è l'e-mail standard per i report. Il secondo è per il cellulare (con un rapporto ridotto)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
Macchina = "host"
# I seguenti tre sono per uso mytop: utilizzare un utente db con diritti decenti
dbusr = "username"
DBPW = "password"
db = "YourDatabaseName"
# Quanto segue è il livello di carico da controllare - 10 è veramente alto, quindi potresti volerlo abbassare.
levelToCheck = 10
# Imposta variabili dal sistema:
loadLevel = "cat / proc / loadavg | awk" print $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# se il livello di carico è maggiore di quello desiderato, avviare la procedura di script. Altrimenti, esci 0
se [$ loadLevel -gt $ levelToCheck]; poi
echo ""> $ tmpfile
echo "**************************************" >> $ tmpfile
echo "Data: $ dt" >> $ tmpfile
echo "Verifica caricamento e processi del sistema" >> $ tmpfile
echo "**************************************" >> $ tmpfile# Ottieni più variabili dal sistema:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"# Mostra il livello di carico attuale:
echo "Load Level Is: $ loadLevel" >> $ tmpfile
eco "************************************************ * ">> $ tmpfile# Mostra il numero dei processi httpd ora in esecuzione (esclusi i bambini):
echo "Numero di processi httpd ora: $ httpdProcesses" >> $ tmpfile
eco "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Mostra elenco processi:
echo "Processi ora in esecuzione:" >> $ tmpfile
ps f -ef >> $ tmpfile
eco "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Mostra le informazioni attuali su MySQL:
echo "Risultati da mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
eco "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Mostra la parte superiore corrente:
echo "top ora mostra:" >> $ tmpfile
echo "top ora mostra:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
eco "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Mostra connessioni attuali:
echo "netstat ora mostra:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
eco "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Controlla lo spazio del disco
echo "spazio su disco:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
eco "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Invia risultati al file di registro:
/ bin / cat $ tmpfile >> $ logfile# E i risultati dell'email a sysadmin:
/ usr / bin / mutt -s "$ machine ha un alto livello di carico! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile# E quindi rimuovere il file temporaneo:
rm $ tmpfile
rm $ topfile
fi#
uscita 0