Diagnostiquer les problèmes de charge 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 connaît une forte augmentation de l'utilisation du processeur ou de l'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 grignotent vos ressources système pour pouvoir les tuer??
Le script suivant pourrait peut-être vous aider. Il a été écrit pour un serveur Web, il en va de même pour 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 http://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 simplement utiliser 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 pour vérifier les niveaux moyens de charge du système à essayer de déterminer
# quels processus prennent trop élevé…
#
# 07Jul2010 tjones
#
# définir l'environnement
dt = "date +% d% b% Y-% X"
# Évidemment, changez les répertoires suivants pour conserver vos fichiers de log
tmpfile = "/ tmp / checkSystemLoad.tmp"
logfile = "/ tmp / checkSystemLoad.log"
msgLog = "/ var / log / messages"
mysqlLog = "/ var / log / mysqld.log"
# le premier arrêt de courrier est un email standard pour les rapports. Le deuxième est pour le téléphone portable (avec un rapport réduit)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
machine = "nom d'hôte"
# Les trois suivants sont destinés à l'utilisation de mytop - utilisez un utilisateur de base de données qui dispose de droits convenables
dbusr = "nom d'utilisateur"
dbpw = "mot de passe"
db = "votre nom de la base de données"
# Ce qui suit est le niveau de charge à vérifier - 10 est vraiment élevé, vous pouvez donc le baisser.
levelToCheck = 10
Ensuite, vérifiez votre niveau de charge pour voir si le script doit continuer:
# Définir les variables du système:
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
if [$ loadLevel -gt $ levelToCheck]; puis
echo ""> $ tmpfile
echo "***************************************" >> $ tmpfile
echo "Date: $ dt" >> $ tmpfile
echo "Vérifier la charge et les processus du système" >> $ 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, le cas échéant, à votre situation:
# Obtenir 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# Affiche le nombre de processus httpd en cours d'exécution (à l'exclusion des enfants):
echo "Nombre de processus httpd maintenant: $ 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 dans deux fichiers temporaires. L'une concerne le message beaucoup plus petit au téléphone cellulaire. 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)..
# Montrer top actuel:
echo "top affiche maintenant:" >> $ tmpfile
echo "top montre maintenant:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
écho "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile
Plus de contrôles:
# Afficher les connexions actuelles:
echo "netstat montre 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
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 second envoi correspond aux résultats allégés consistant simplement en la norme «top»:
# Envoyer les résultats au fichier journal:
/ bin / cat $ tmpfile >> $ logfile# Et envoyez les résultats par courrier électronique à l'administrateur système:
/ usr / bin / mutt -s "$ machine a un niveau de charge élevé! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile
Et puis un peu de ménage et de sortie:
# Et ensuite supprimez le fichier temporaire:
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 pour vérifier les niveaux moyens de charge du système pour essayer de déterminer quels processus sont
# le prenant trop haut…
#
# définir l'environnement
dt = "date +% d% b% Y-% X"
# Évidemment, changez les répertoires suivants pour conserver vos fichiers de log
tmpfile = "/ tmp / checkSystemLoad.tmp"
logfile = "/ tmp / checkSystemLoad.log"
msgLog = "/ var / log / messages"
mysqlLog = "/ var / log / mysqld.log"
# le premier arrêt de courrier est un courrier électronique standard pour les rapports. Le deuxième est pour le téléphone portable (avec un rapport réduit)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
machine = "nom d'hôte"
# Les trois suivants sont destinés à l'utilisation de mytop - utilisez un utilisateur de base de données qui dispose de droits convenables
dbusr = "nom d'utilisateur"
dbpw = "mot de passe"
db = "votre nom de la base de données"
# Ce qui suit est le niveau de charge à vérifier - 10 est vraiment élevé, vous pouvez donc le baisser.
levelToCheck = 10
# Définir les variables du système:
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
if [$ loadLevel -gt $ levelToCheck]; puis
echo ""> $ tmpfile
echo "***************************************" >> $ tmpfile
echo "Date: $ dt" >> $ tmpfile
echo "Vérifier la charge et les processus du système" >> $ tmpfile
echo "***************************************" >> $ tmpfile# Obtenir 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# Affiche le nombre de processus httpd en cours d'exécution (à l'exclusion des enfants):
echo "Nombre de processus httpd maintenant: $ 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# Montrer top actuel:
echo "top affiche maintenant:" >> $ tmpfile
echo "top montre maintenant:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
écho "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Afficher les connexions actuelles:
echo "netstat montre 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 courrier électronique à l'administrateur système:
/ usr / bin / mutt -s "$ machine a un niveau de charge élevé! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile# Et ensuite supprimez le fichier temporaire:
rm $ tmpfile
rm $ topfile
Fi#
sortie 0