Diagnostiquer les problèmes de charge du serveur Linux avec un script simple

Diagnostiquer les problèmes de charge du serveur Linux avec un script simple
Diagnostiquer les problèmes de charge du serveur Linux avec un script simple

Vidéo: Diagnostiquer les problèmes de charge du serveur Linux avec un script simple

Vidéo: Diagnostiquer les problèmes de charge du serveur Linux avec un script simple
Vidéo: QUE PEUT-ON FAIRE avec votre ADRESSE E-MAIL ? [3 POSSIBILITÉS] - YouTube 2024, Avril
Anonim

Si vous avez été administrateur pendant un certain temps, vous avez certainement découvert des situations dans lesquelles un serveur connaît des pics d'utilisation du processeur ou d'utilisation de la mémoire et / ou des niveaux de charge. Courir `top` ne vous donnera pas toujours la réponse non plus. Alors, comment trouvez-vous ces processus sournois qui grincent les ressources de votre système pour pouvoir les tuer?

Le script suivant pourrait peut-être vous aider. Il a été écrit pour un serveur Web. Il en est de même de certaines parties qui recherchent spécifiquement les processus httpd et d’autres qui traitent de MySQL. Selon le déploiement de votre serveur, commentez / supprimez ces sections et ajoutez-en d'autres. Il devrait être utilisé comme point de départ.

Les prérequis pour cette version du script sont des logiciels gratuits publiés sous la licence publique générale GNU appelée mytop (disponible à l'adresse https://jeremy.zawodny.com/mysql/mytop/), qui est un outil fantastique pour vérifier les performances de MySQL. Il se fait vieux, mais fonctionne toujours très bien pour nos buts ici. De plus, j'utilise mutt comme mailer - vous voudrez peut-être changer le script pour utiliser simplement l'utilitaire `mail` intégré à Linux. Je le lance via cron toutes les heures; ajustez comme bon vous semble. Oh, et ce script doit être exécuté en tant que root car il lit à partir de certaines zones protégées du serveur.

Alors commençons, allons-nous?

Commencez par définir vos variables de 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

Ensuite, vérifiez votre niveau de charge pour voir si le script doit continuer:

# 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

Et poursuivez les vérifications en écrivant les résultats dans le fichier temporaire. Ajoutez ou supprimez des éléments d’ici si applicable à votre situation:

# 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

Remarquez qu'avec la commande top, nous écrivons dans deux fichiers temporaires. L'une concerne le message beaucoup plus petit au téléphone portable. Si vous ne souhaitez pas que les alertes par téléphone cellulaire soient urgentes à trois heures du matin, vous pouvez les supprimer (et supprimer la deuxième routine d'envoi plus tard dans le script).

# 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

Plus de contrôles:

# 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

Ensuite, écrivez le contenu du fichier temporaire dans un fichier journal plus permanent et envoyez les résultats par courrier électronique aux parties appropriées. Le deuxième envoi correspond aux résultats réduits consistant simplement en la norme «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

Et puis un peu de ménage et de sortie:

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

# exit 0

Espérons que cela aide quelqu'un là-bas. Le script entièrement assemblé est:

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

Conseillé: