Monitoring serveur: traquer les zombies ou processus morts

Monitoring serveur: traquer les zombies ou processus morts

La problématique

Il arrive quelquefois qu’un processus ou service démarré à un moment donné sur un serveur finisse anormalement ou avant sa fin programmée et/ou ne récupère pas le code de fin des processus fils qu’il a engendré. Dans ce cas, les processus concernés disposent toujours encore de leur PID associé à leur bloc de contrôle. Lorsque ces cas se multiplient, il occupent des ressources qui vont manquer par ailleurs, provoquant des ralentissements voire un gel du système. C’est mieux de les détecter et de corriger le problème car il est souvent récurrent…

Les solutions

  1. Une première solution consiste à lancer un “ps aux” qui va prendre un instantané des processus en cours. Mais comme les processus varient en continu, il faudrait répéter l’opération très souvent pour tomber sur le coupable !
  2. Une seconde solution est offerte pas la commande “top ou htop qui fournit la même chose, mais en live. La commande prouve bien que les processus varient en continu et qu’il est important d’avoir une résolution suffisamment fine pour les détecter. C’est finalement cette commande avec ses filtres que l’on va utiliser pour une analyse en temps réel.
  3. Mais pour une détection sur un réseau qui contient plusieurs serveurs, mieux vaut disposer d’un automate associer à un moniteur centralisé comme Nagios par exemple.
    J’ai écris le script Perl ci-après pour que le moniteur Nagios se charge de ce travail. Ce dernier avertira si des processus zombies existent et alertera si leur nombre dépasse un seuil toléré.

Le script PERL sur le serveur

Afin d’augmenter la résolution du moniteur qui, au meilleur des cas, est d’une requête toute les 15s, et pour diminuer le temps de latence qui devrait inclure le temps d’éxécution de la commande, multipliée par x serveurs, mon astuce consiste à passer par une base de donnée SQLite installée sur le serveur et dont la taille est limitée (une autre astuce !).

Sans révéler tout le synoptique que j’ai mis en place pour l’analyse des processus, je peux affirmer avoir multiplié par 10 ou 20 la résolution des données récoltées par le moniteur Nagios tout en divisant par deux le temps de latence d’un cycle de requêtes. Je ne vais livrer ici que le script Perl qui stocke les données dans la base existante côté serveur.

  • L’authentification fonctionne-elle ?
  • Le temps de réponse est-il dans les limites acceptables ?
  • Le contenu de la page est-il conforme à celui attendu (même taille, même contenu, …) ?
  • Eventuellement la page est-elle identique sur le serveur mirroir ?

Principe :

Sans trop rentrer dans les détails techniques …

  • On se connecte à la page par l’authentification requise, c’est à dire en transmettant un nom d’utilisateur et un mot de passe. Il est préférable de définir pour cet accès un nouvel utilisateur spécifique à cette requête.
  • On doit alors également gérér un coockie de session pour la durée de celle-ci.
  • Pour accéder à la page voulue, il peut être nécessaire de cliquer sur des menus, des liens ou faire des choix dans un formulaire, dépendament de la configuration du site.
  • Lors d’une première connexion “manuelle”, on crée un fichier de référence (ou modèle) de la page à analyser. Evidemment celle-ci devra être vérifiée la première fois par le concepteur.
  • Lors des autres visites, on récupère la page pour la compiler dans un tableau. Dès lors, ce sont les fonctions de PERL qui se chargenet de ce travail.
  • On affiche le résultat de l’analyse sous une forme interpretable par le moniteur nagios pour qu’il puisse la transmettre par son interface et les courriels paramétrés.

Le script

Le script est anonymé ! Il conviendra donc de remplacer les adresses IP, le “login”, le “mdp” (mot de passe) et l'”user” par ceux voulus.

Il faudra également adapter la structure du script à celui du site, pour tenir compte du cheminement qui permet d’atteindre la page à analyser.

 

Une variante du script

Il se peut que le script précédent ne fonctionne pas correctement dans votre environnement. Ce fut d’ailleurs mon cas après des modifications survenues au niveau de l’authentification.
Vous pourrez alors essayer une autre méthode en remplaçant les modules de perl choisis.
A SUIVRE …

Pour marque-pages : Permaliens.

Les commentaires sont fermés.