in

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

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

Le script suivant pourrait vous aider. Il a été écrit pour un serveur Web, il contient donc certaines parties qui recherchent spécifiquement les processus httpd et certaines parties qui traitent de MySQL. En fonction de votre déploiement de serveur, commentez / supprimez simplement ces sections et ajoutez-en d’autres. Il doit être utilisé comme point de départ.

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

Alors commençons, d’accord?

Tout d’abord, définissez 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="sysadmin@mydomain.com"
mailstop1="15555555555@mycellphone.com"
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 )

# si le niveau de charge est supérieur à ce que vous souhaitez, démarrez le processus de script. Sinon, quittez 0

si [ $loadLevel -gt $levelToCheck ]; ensuite
echo «  »> $ tmpfile
echo « ************************************** » >> $ tmpfile
echo « Date: $ dt » >> $ tmpfile
echo « Vérifier la charge du système et les processus » >> $ tmpfile
echo « ************************************** » >> $ tmpfile

Et continuez les vérifications en écrivant les résultats dans le fichier temporaire. Ajoutez ou supprimez des éléments d’ici, le cas échéant, à votre situation:

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

# Afficher le niveau de charge actuel:
echo « Le niveau de charge est: $ loadLevel » >> $ tmpfile
écho « ************************************************ * « >> $ tmpfile

# Afficher le nombre de processus httpd en cours d’exécution (sans les enfants):
echo « Nombre de processus httpd actuellement: $ httpdProcesses » >> $ tmpfile
écho « ************************************************ * « >> $ tmpfile
echo «  » >> $ tmpfile

# Afficher la liste des processus:
echo « Processus en cours d’exécution: » >> $ tmpfile
ps f -ef >> $ tmpfile
écho « ************************************************ * « >> $ tmpfile
echo «  » >> $ tmpfile

# Afficher les informations MySQL actuelles:
echo « Résultats de mytop: » >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
écho « ************************************************ * « >> $ tmpfile
echo «  » >> $ tmpfile

Remarquez qu’avec la commande top, nous écrivons sur deux fichiers temporaires. La première concerne le message beaucoup plus petit adressé au téléphone portable. Si vous ne voulez pas l’urgence des alertes de téléphone portable à trois heures du matin, vous pouvez supprimer ceci (et supprimer la deuxième routine de mailing 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

# Vérifier l’espace disque
echo « espace disque: » >> $ tmpfile
/ bin / df -k >> $ tmpfile
écho « ************************************************ * « >> $ 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 mailing est le résultat épuré consistant simplement en le standard hors de `top`:

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

# Et envoyez les résultats par e-mail à l’administrateur système:
/ usr / bin / mutt -s « $ machine a un niveau de charge élevé! – $ dt » -a $ mysqlLog -a $ msgLog $ mailstop> $ logfile

Et puis un peu de ménage et sortie:

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

#
sortie 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="sysadmin@mydomain.com"
mailstop1="15555555555@mycellphone.com"
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 )

# si le niveau de charge est supérieur à ce que vous souhaitez, démarrez le processus de script. Sinon, quittez 0

si [ $loadLevel -gt $levelToCheck ]; ensuite
echo «  »> $ tmpfile
echo « ************************************** » >> $ tmpfile
echo « Date: $ dt » >> $ tmpfile
echo « Vérifier la charge du système et les processus » >> $ tmpfile
echo « ************************************** » >> $ tmpfile

# Obtenez plus de variables du système:
httpdProcesses = `ps -def | grep httpd | grep -v grep | wc -l`

# Afficher le niveau de charge actuel:
echo « Le niveau de charge est: $ loadLevel » >> $ tmpfile
écho « ************************************************ * « >> $ tmpfile

# Afficher le nombre de processus httpd en cours d’exécution (sans les enfants):
echo « Nombre de processus httpd actuellement: $ httpdProcesses » >> $ tmpfile
écho « ************************************************ * « >> $ tmpfile
echo «  » >> $ tmpfile

# Afficher la liste des processus:
echo « Processus en cours d’exécution: » >> $ tmpfile
ps f -ef >> $ tmpfile
écho « ************************************************ * « >> $ tmpfile
echo «  » >> $ tmpfile

# Afficher les informations MySQL actuelles:
echo « Résultats de mytop: » >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
écho « ************************************************ * « >> $ tmpfile
echo «  » >> $ tmpfile

# Afficher le top actuel:
echo « top affiche maintenant: » >> $ tmpfile
echo « top affiche maintenant: » >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
écho « ************************************************ * « >> $ tmpfile
echo «  » >> $ tmpfile

# Afficher les connexions actuelles:
echo « netstat affiche maintenant: » >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
écho « ************************************************ * « >> $ tmpfile
echo «  » >> $ tmpfile

# Vérifier l’espace disque
echo « espace disque: » >> $ tmpfile
/ bin / df -k >> $ tmpfile
écho « ************************************************ * « >> $ tmpfile
echo «  » >> $ tmpfile

# Envoyer les résultats au fichier journal:
/ bin / cat $ tmpfile >> $ logfile

# Et envoyez les résultats par e-mail à l’administrateur système:
/ usr / bin / mutt -s « $ machine a un niveau de charge élevé! – $ dt » -a $ mysqlLog -a $ msgLog $ mailstop> $ logfile

# Et puis supprimez le fichier temporaire:
rm $ tmpfile
rm $ topfile
Fi

#
sortie 0

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Comment redimensionner des images et des photos sous Windows

Comment redimensionner des images et des photos sous Windows

Comment désactiver (la plupart) des comptes de spam et des trolls sur Twitter

Comment désactiver (la plupart) des comptes de spam et des trolls sur Twitter