Je me suis rendu compte il y a quelques semaines que mon interface réseau (msk0) cessait de fonctionner après un certain temps (jours, parfois des semaines) sous une charge modérée ou importante, tout en inondant le journal système de « msk0: watchdog timeout ». Ce qui est plûtot gênant pour un serveur… Je n’ai malheureusement pas réussi à corriger le problème en désactivant le MSI via l’outil sysctl(8)…
Le problème viendrait de :
- Une carte de mauvaise qualité (Marvell 88E8053)
- Un driver
msk(4)peu testé et donc rempli de bugs potentiels
La seule façon de rétablir la connexion est de redémarrer la machine. Ce qui pose problème quand on a accès à la machine en question uniquement par SSH la majorité du temps… J’ai donc réalisé un petit script (vraiment fait à la vite), faisant office de solution de secours, qui fait automatiquement redémarrer la machine si un watchdog timeout a été détécté. Cela permet de ne pas complètement bloquer l’accès via SSH.
Il suffit donc de lancer ce script en cronjob (effectué par root, bien sûr) :
#!/bin/sh LOGFILE="/var/log/check_msk0" DATE=`date` CLEAN=`echo | grep zero` LOGDATE=`date "+%b %d"` TIMEOUTS=`cat /var/log/messages | grep "msk0: watchdog timeout" | tail | grep "$LOGDATE"` if [ "$TIMEOUTS" = "$CLEAN" ] then echo "$DATE OK, no timeouts." >> $LOGFILE echo OK. else echo "$DATE WATCHDOG TIMEOUT, initiating reboot..." >> $LOGFILE echo Rebooting in 15 seconds. Press ^C to abort. sleep 15 cp /var/log/messages /var/log/messages.timeout echo > /var/log/messages /sbin/reboot fi
Inutile de préciser que j’ai commandé une nouvelle carte réseau, plus adaptée pour un serveur, et que cette solution est vraiment temporaire…