Un « watchdog » veille sur vos serveurs.

Le WATCHDOG, ou chien de garde, est une solution matérielle destinée à exécuter un programme ou (par défaut) à redémarrer un système en cas de défaillance. Cette technologie est disponible sur de nombreux serveurs mais est rarement utilisée. Ce post revient sommairement sur les principes de fonctionnement et sur la mise en service de cette solution.

Principe

Le watchdog est, à l’origine, une solution hardware de surveillance du système. Il s’agit, en très simplifié, d’un compteur (en fait il décompte mais bon…) que le système réinitialise à intervalle régulier au travers du fichier « /dev/watchdog » (issu de l’activation du driver watchdog dans le kernel, voir installation dans cette article) via le démon « /etc/init.d/watchdog ». Si le système est figé, le compteur n’est plus réinitialisé. Dans ce cas, la machine exécute un programme donné ou redémarre brutalement (comportement par défaut).

fhh@srv:~$ lspci
...
00:1d.4 System peripheral: Intel Corporation 6300ESB Watchdog Timer (rev 02)
...

Le comportement d’un watchdog matériel a été reproduit par une alternative logicielle (Softdog) qui, en cas de non ré initialisation du compteur en temps voulu reboot la machine en passant directement l’ordre de reset au kernel. Bien sur en cas de plantage grave du système (kernel panic), cette solution ne servira pas à grand chose…

La réinitialisation du compteur du watchdog est effectuée en fonction de critère fixés par l’administrateur dans le fichier « /etc/watchdog.conf ». Ces critères peuvent être :

  • la réponse au ping d’une adresse ip ;
  • la température ;
  • la quantité de mémoire disponible ;
  • la vitesse des ventilateurs ;
  • le load average à 1, 5 ou 15 minutes ;
  • le délais de changement d’un/de fichier(s) ;
  • le résultat d’un script personnalisé.

Installation

L’installation est découpée en 4 ou 5 points :

  • en cas de besoins, activation du watchdog hard ou soft dans le kernel ;
  • toujours en cas de besoins, chargement des modules ;
  • installation du programme de gestion du watchdog ;
  • configuration du programme ;
  • lancement du démon.

Activation du watchdog dans le kernel

Première étape, vérifiez que WATCHDOG est ou non activé dans votre kernel :

root@test:~# grep WATCHDOG /boot/config-2.6.31-14-generic-pae
CONFIG_CLOCKSOURCE_WATCHDOG=y
CONFIG_IPMI_WATCHDOG=m
CONFIG_WATCHDOG=y
...

..si tel est le cas, pas de problème ou de compilation (si le driver de votre carte est compilé également)… Sinon :

root@srv:~# zcat /proc/config.gz | grep WATCHDOG
CONFIG_CLOCKSOURCE_WATCHDOG=y
CONFIG_IPMI_WATCHDOG=m
# CONFIG_WATCHDOG is not set

…placez vous dans les source du kernel et via « make menuconfig » par exemple, activez le driver correspondant à votre matériel. Comme dans l’extrait de code vu précédemment, « lspci » vous renseignera sur le matériel embarqué dans votre machine. Ensuite, l’activation du Watchdog ce trouve dans « Device Drivers » > « Watchdog Timer Support » qui donne accès à la liste des matériels supportés.

    Device Drivers  --->
       [ * ] Watchdog Timer Support  --->
             [   ]   Disable watchdog shutdown on close
                    *** Watchdog Device Drivers ***
             <   >   Software watchdog
             <   >   WM8350 watchdog
...
             < M >   Intel 6300ESB Timer/Watchdog
             <   >   Intel TCO Timer/Watchdog
             [   ]     Intel TCO Timer/Watchdog Specific Vendor Support
             <   >   IT8712F (Smart Guardian) Watchdog Timer
             <   >   IT87 Watchdog Timer
...

Chargement des modules

Après compilation des modules et installation, chargement du driver :

root@srv:/usr/src/linux# make modules
...
root@srv:/usr/src/linux# make modules_install
...
root@srv:~# ls /dev/watchdog
ls: cannot access /dev/watchdog: No such file or directory
root@srv:~# modprobe i6300esb
root@srv:~# ls -l /dev/watchdog
crw-rw---- 1 root root 10, 130 2010-02-25 18:14 /dev/watchdog
root@srv:~# dmesg
...
[15115.560187] i6300ESB timer: Intel 6300ESB WatchDog Timer Driver v0.04
[15115.560357] i6300ESB timer: initialized (0xfa190800). heartbeat=30 sec (nowayout=0)

Par défaut, le compteur doit être réinitialisé en moins de 30 secondes. Ce paramètre peut être changé lors du chargement du module :

root@srv:~# rmmod i6300esb
root@srv:~# dmesg
...
[19383.214052] i6300ESB timer: Watchdog Module Unloaded.
root@srv:~# root@srv:~# modprobe i6300esb heartbeat=90
root@srv:~# dmesg
...
[19444.735508] i6300ESB timer: Intel 6300ESB WatchDog Timer Driver v0.04
[19444.735671] i6300ESB timer: initialized (0xfa1cc800). heartbeat=90 sec (nowayout=0)

Bien entendu, si vous souhaitez utiliser le watchdog logiciel, activez « Software watchdog » et si vous disposez d’une autre carte que l’Intel ici présentée activez celle qui vous convient. il en vas de même sur le chargement du module.

A noter, pour les cartes INTEL, le driver « Intel TCO » fonctionne sur plusieurs cartes (par exemple, pour la carte présentée ici, il fonctionne également en chargeant le module iTCO_wdt) :

root@srv:~# modprobe iTCO_wdt
root@srv:~# dmesg
..
[20807.136608] iTCO_wdt: Intel TCO WatchDog Timer Driver v1.05
[20807.136726] iTCO_wdt: Found a 6300ESB TCO device (Version=1, TCOBASE=0x0860)
[20807.136803] iTCO_wdt: initialized. heartbeat=30 sec (nowayout=0)

Enfin pour tester votre watchdog, rendez vous dans la documentation des sources du kernel pour trouver un petit programme de test :

root@srv:~# cd /usr/src/linux/Documentation/watchdog/src/
root@srv:/usr/src/linux/Documentation/watchdog/src# ls
Makefile  watchdog-simple.c  watchdog-test.c
root@srv:/usr/src/linux/Documentation/watchdog/src# make watchdog-test
cc     watchdog-test.c   -o watchdog-test
root@srv:/usr/src/linux/Documentation/watchdog/src# ./watchdog-test h
-d to disable, -e to enable.
run by itself to tick the card.

Installation de watchdog

Étant un outil assez ancien et stable, watchdog est packagé sur la plupart des distributions linux. vous l’installerez donc sans problème avec votre gestionnaire de package :

[root@centos ~]# yum install watchdog
...

ou :

backup ~ # emerge -av watchdog
...

ou encore :

root@srv:~# apt-get install watchdog
...

Bien entendu, si l’idée d’utiliser le package de votre distrib vous insupporte, vous pouvez compiler l’outil depuis ces sources disponibles sur sourceforge : http://watchdog.sourceforge.net/ :

backup ~ # cd /usr/src/
backup src # wget http://sourceforge.net/projects/watchdog/files/watchdog/5.7/watchdog-5.7.tar.gz/download
...
backup src # tar xvf watchdog-5.7.tar.gz
backup src # cd watchdog-5.7
backup watchdog-5.7 # ./configure
...
backup watchdog-5.7 # make
...
backup watchdog-5.7 # make install
...

Configuration de watchdog

Comme évoqué dans la présentation de watchdog, la configuration s’effectue dans le fichier « /etc/watchdog.conf ». Les paramètres du programme sont au format « option = valeur ». Par défaut (et par sécurité), le fichier ne fait rien. La page de man de « watchdog.conf » (http://linux.die.net/man/5/watchdog.conf) donne une vision exhaustive des options disponibles.

Paramètres généraux

Dans le fichier par défaut, il faudra dans un premier temps renseigner le « watchdog-device » permettant la ré initialisation du compteur de votre watchdog :

...
watchdog-device        = /dev/watchdog
...

Ainsi que l’interval de temps après lequel le système ré initialise le compteur matériel (ou logiciel dans le cas de soft dog) :

...
interval        = 10
...

Si l’interval définit dépasse la minute (60 secondes pour ceux qui calculeraient lentement), vous devrez ajouter l’option « -f » lors de l’appel de « watchdog » en ligne de commande.

ATTENTION, rappelez vous que si le compteur n’est pas ré initialisé dans la minute, le système sera re démarré !

Afin d’éviter de mauvaises surprises dûe au latences d’accès disque, il peut être intéressant de s’assurer que le démon « watchdog » reste en RAM sans être « swappé » via l’option « realtime ». Le démon ayant le pouvoir de redémarrer brusquement la machine, nous pouvons également lui donner une forte priorité afin qu’il ne le fasse pas à mauvais escient avec l’option « priority » :

...
realtime                = yes
priority                = 1
...

L’option « admin » permet de définir l’adresse mail de l’administrateur afin qu’il soit prévenu en cas de re démarrage du serveur.

L’option « logtick » définit la fréquence d’écriture des événements watchdog dans les logs. L’exemple donné dans le man pour expliquer le fonctionnement de cette option est plutôt clair :
si vous utilisez le mode verbeux de watchdog et que vous définissez logtick à 60 avec un interval définit à 10, une ligne de log sera ajoutée à syslog toute les 10 minutes (soit 60*10 secondes = 600 secondes = 10 minutes). Cela rend le temps de détermination d’un crash plus difficile à trouver, mais réduit les accès disques (et l’occupation).

Critères de dysfonctionnements

La plupart des autres options définissent les critères à surveiller. Ainsi « ping » surveillera que l’adresse spécifiée répond bien dans un délais inférieur à « interval », « max-temperature » vérifie que la température du capteur « temperature-device » est inférieure à la valeur donnée, « max-load-{1, 5, 15} = X » vérifie que le load average (nombre de process en attente d’obtenir une ressource disponible) ne dépasse pas la valeur « X », etc.

A noter le paramètre « test-binary » qui permet de lancer un script de tests personnalisé. « test-timeout » est la durée maximale d’execution du script « test-binary ». Passé le délais « test-timeout », « test-binary » est considéré comme échoué.

Paramètres d’actions

« repair-binary » Permet de définir un script à exécuter au lieu d’effectuer un reboot brutal du système. Cette option ce substitue au reboot et permet a l’administrateur d’appliquer une action qu’il métrise en cas de défaillance.

Fichier de configuration complet

Au final, un fichier de configuration de watchdog pourra ressembler à celui ci :

## /etc/watchdog.conf
#
# Par FHH le 01 / 03 / 2010
#
# Surveillance du niveau de charge du serveur SRV
 
# [ GLOBAL ]
 
watchdog-device         = /dev/watchdog
 
realtime                = yes
priority                = 1
 
admin                   = fhh@admin-linux.fr
interval                = 10
logtick                 = 1
 
# [ CHECK ]
 
# Vérification de la surcharge :
max-load-1              = 24
max-load-5              = 18
max-load-15             = 12
# ping                  = 10.0.0.1
# ping                  = 192.168.1.3
# interface             = eth0
# file                  = /var/log/messages
# change                = 1407
# Check if syslogd is still running by enabling the following line
# pidfile               = /var/run/syslogd.pid
# test-binary           =
# test-timeout          =
# temperature-device    =
# max-temperature       = 120
# min-memory            = 1
 
# [ ACTION ]
 
# Par défaut, redémarrage.
# Sinon, execution du script suivant :
# repair-binary          = /usr/sbin/repair

Télécharger le fichier “watchdog.conf”.

Conclusion

Le principe de fonctionnement du watchdog est simple et efficace. Le seul défaut du système est de veiller à bien définir les critères de mise en échec du démon sous peine de voir redémarrer la machine sans préavis. La technique du « je reboot au moindre problème » peut en effet devenir problématique dans certains environnements de production. Le coût d’un watchdog est faible (voir null pour la version soft) et peut s’avérer utile dans certain cas. Le ratio temps de config/cout d’une indisponibilité penche souvent en faveur de la mise en production de cet outil même si le risque d’opérer des redémarrages mal justifié ne peut être complétement écarté. A vous de peser les risques sur votre structure…

Références

Page de man de watchdog : http://linux.die.net/man/8/watchdog
Page de man de watchdog.conf : http://linux.die.net/man/5/watchdog.conf
Documentation du kernel : /usr/src/linux/Documentation/watchdog/*

Une réflexion au sujet de « Un « watchdog » veille sur vos serveurs. »

Laisser un commentaire

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