Instant Wikipédia

Une seconde intercalaire, également appelée saut de seconde ou seconde additionnelle, est un ajustement d’une seconde du Temps universel coordonné (UTC). Et ce, afin qu’il reste assez proche du Temps universel (UT) défini quant à lui par l’orientation de la Terre par rapport aux étoiles.

Afin de maintenir l’UTC, conformément à sa définition, à moins de 0,9 seconde du temps universel (UT1), il convient parfois d’ajouter ou de retrancher une seconde intercalaire.

Pour les curieux ça ce passe ici : https://fr.wikipedia.org/wiki/Seconde_intercalaire

La seconde intercalaire du 30 Juin

Si vous avez un peu suivi l’actualité informatique vous avez peut-être vu qu’une seconde intercalaire (« leap second » en anglais) a été planifié par le Service International de la Rotation Terrestre et Systèmes de Référence pour le 30 Juin 2012 à 23:59:59. Seulement cette seconde intercalaire, géré par le protocole NTP à posé quelques soucis à de nombreux serveurs sous GNU/Linux dans le monde entier et chez Evolix (et forcément j’étais d’astreinte :P).

Présentation du bug

Pour que le bug affecte votre système, il faut réunir plusieurs conditions.

  • Disposer d’un noyau > 2.6.26 (hors RHEL – à priori) ;
  • Avoir un service NTP ;
  • Disposer de Java et/ou Ruby (certains rapportent aussi des problèmes avec Mysql, Firefox ou encore Virtualbox).

Le bug est facile à diagnostiquer via un système de monitoring du type Munin, mais un simple top/htop ou bien une alerte Nagios (Hmm à 3h du mat’ !) à cause de la charge élevée du serveur permet aussi de s’en rendre compte.

Comme annoncé sur Twitter voici l’exemple typique permettant de constater le bug à coup sûr.

https://twitter.com/benpro82/status/219348309960167425

On voit clairement qu’à partir de 0h00 UTC (02h00 en GMT+2 Europe/Paris) le graphique devient « étrange », sur 16 cœurs (1600%), 800% est utilisé par le système (appels noyaux notamment) et 400% en espace utilisateur. Notez que nombre de cœur n’est pas correct sur le graphique, ça s’arrête à 1400% au lieu de 1600%, comme si la machine avait perdu 2 cœur, « marrant » ! (Si quelqu’un peut m’expliquer ce point…)

Une histoire de Futex

Le bug provient du noyau au niveau de la gestion des Futex (verrous de type mutex en espace utilisateur) sur les kernel Linux supérieur à 2.6.26 (à priori). La routine FUTEX_WAIT du noyau nécessite de faire des appels aux valeurs de TIMER_ABSTIME et CLOCK_REALTIME mais celles-ci ont expirés une seconde trop à cause de la « leap second ». Ce qui avait pour effet de faire une boucle infinie sur les FUTEX_WAIT. (Source LKML.)

En effectuant un « strace » sur un processus Java, voici ce qu’on obtenait :

futex(0x4073bed4, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1, {1341105860, 343808000}, ffffffff) = -1 ETIMEDOUT (Connection timed out)
futex(0x7fccbc015228, FUTEX_WAKE_PRIVATE, 1) = 0
futex(0x4073bed4, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1, {1341105860, 343877000}, ffffffff) = -1 ETIMEDOUT (Connection timed out)
futex(0x7fccbc015228, FUTEX_WAKE_PRIVATE, 1) = 0
futex(0x4073bed4, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1, {1341105860, 343945000}, ffffffff) = -1 ETIMEDOUT (Connection timed out)
futex(0x7fccbc015228, FUTEX_WAKE_PRIVATE, 1) = 0
futex(0x4073bed4, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1, {1341105860, 344015000}, ffffffff) = -1 ETIMEDOUT (Connection timed out)
futex(0x7fccbc015228, FUTEX_WAKE_PRIVATE, 1) = 0
futex(0x4073bed4, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1, {1341105860, 344083000}, ffffffff) = -1 ETIMEDOUT (Connection timed out)

Comment résoudre le soucis ?

  • Reboot ;
  • Resynchronisation de l’horloge via un « date -s "`date`" ».

Conclusion

Il est assez étrange que ce bug touche les systèmes récents alors que l’ajout de seconde intercalaire est réalisé depuis 1972, il y en a eu d’ailleurs 24 depuis. Les kernel > 2.6.26 semblent donc intégrer une régression (remplacement de la routine qui gèle le temps, par un retour en arrière d’une seconde). En attendant un patch circule sur la LKML.

Il y a sûrement quelques incohérences pour la partie Futex, je n’ai pas la compétence d’un développeur kernel 😛 N’hésitez pas à laisser vos réflexions par commentaires.

Vous trouverez plus d’informations en Anglais sur ServerFault.

Et vous, avez-vous été affecté par le bug « du 1er Juillet 2012 » ?

3 replies on “Le cauchemar de la seconde intercalaire – The nightmare of the leap second”

  1. J’ai effectivement été touché par ce problème et tu es bien placé pour le savoir 😉

    Le lien avec Ruby est peut-être moins évident qu’avec la JVM car j’ai d’autres serveurs avec du Ruby + kernel 2.6.34 ou 2.6.38 + NTP (mais pas de JVM) et qui n’ont pas eu de soucis. Je connais en revanche au moins une personne qui a eu le soucis avec un soft en Ruby (Unicorn) et qui n’a pas non plus de JVM.

Comments are closed.