lunes, junio 15, 2015

Leap Seconds: Problemas en los ajustes horarios (2 de 2)

Tras explicar en la primera de este artículo el porqué de la existencia de los Leap Second, llega el momento de analizar su impacto cuando hay que introducirlos. Cualquier cambio en las condiciones de funcionamiento de un sistema, más cuando se trata de algo tan importante como el tiempo - orquestador de todos los procesos de un sistema -, puede generar situaciones excepcionales que generen excepciones no controladas. Es por eso que, históricamente, los Leap Second han provocado problemas en los sistemas GNU/Linux, ya que utilizan el protocolo NTP para sincronizar el reloj interno del sistema.

Figura 9: ¿Qué pasará cuando tu sistema operativo mienta a las aplicaciones con la hora?
¿Estás listo para el Leap Second del 30 de Junio?

En palabras de Linus Torvalds, creador de Linux, en unas declaraciones, a colación de la próxima inserción el próximo 30 de Junio de un nuevo Leap Second, para la publicación Wired:
“Prácticamente siempre que introducimos un Leap Second encontramos algo nuevo.” “Es muy molesto, porque se trata del claro ejemplo de un código que básicamente nunca se ejecuta, y que no es posible comprobar en condiciones normales”. 
Así que, como se puede ver,  resulta que el mismísimo creador del kernel de Linux - con muy buen criterio, por cierto - afirma que no se sabe a ciencia cierta qué es lo que puede pasar al introducir el Leap Second. Tranquilizador, ¿verdad? Cuando esto suceda, no obstante, se podrá ver en los mensajes de log del kernel de Linux, tal y como se puede ver a continuación.

Figura 10: Mensaje que se verá en los logs del kernel cuando se introduzca el Leap Second

Problemas en el pasado en Linux con la introducción de Leap Seconds

Algunas de las posibles consecuencias de las que habla Linus, se materializaron tanto en el año 2009, como en el año 2012 en forma de “Kernel Dumps” y “Live Locks” producidos en el kernel de Linux.

Figura 11: Problemas reportados tras la introducción de un Leap Second

Figura 12: Bug de condición de carrera en NTP debido al Leap Second

Figura 13: El Kernel de Linux crasheando por culpa del Leap Second de 2009

Figura 14: El Kernel de Linux crasheando por culpa del Leap Second introducido en 2012

Problemas con Leap Seconds en aplicaciones

Lo cierto es que independientemente de los fallos a nivel de kernel, cualquier aplicación que dependa de la serialización de eventos, puede sufrir de la inserción de Leap Seconds si ve, por ejemplo, instantes de tiempo repetidos. El problema se acentúa en sistemas multi-nodo distribuidos, en los que es vital que los relojes se encuentren alineados. Sólo hay que imaginar por ejemplo el caso de dos eventos que van a la misma base de datos con la misma marca temporal. O peor aún, eventos posteriores a otros, que sin embargo quedan con el mismo Timestamp. Está claro que la mayoría del software no está preparado para lidiar con estos Leap Seconds.

Debido al Leap Second introducido en 2012, Gawker, entre otros, sufrió problemas, y se atrevió además a reconocerlo (cosa que otros no hicieron):
“Our web servers running tomcat came close to zero response (we were able to handle some requests),” [...] “We were able to connect to servers in order to reset them. Only rebooting the servers cleared up the issue.”
Software como Java, se vio también afectado por aquel Leap Second, y esto afectó a servicios que corren sobre él, tales como Cassandra y Hadoop. Otras empresas con problemas fueron Foursquare, Yelp, LinkedIn, Mozilla Foundation y StumbleUpon. También se dijo que The Pirate Bay había sido afectada por este bug, pero lo cierto es que no fue así, sino que se trató de una migración de un servidor que salió mal, todo ello en la misma noche en la que se materializó el Leap Second. MySQL sufrió también este bug:

Figura 15: MySQL afectada por el Leap Second

Incluso los servidores de Minecraft fallaron, lo que podía haber sido el fin del mundo si todos los usuarios de este mundo virtual no pudieran entrar a la plataforma ;).

Figura 16: Servidores de MineCraft afectados

Uno de los casos más sonados fue el de Amadeus, la multinacional española de desarrollo de soluciones. El sistema de reservas de Qantas y de Virgin Australia, basado en el software de Amadeus, se vino abajo debido al Leap Second de 2012, imposibilitando a los viajeros facturar, teniendo por tanto que formar largas colas, y provocando retrasos de varias horas, obligando a los trabajadores a realizar la facturación manualmente, como hace décadas.

Figura 17: Consumos superiores a 1 Megavatio en Hetzner

Otro caso interesante, fue el del aumento en el consumo de CPU (debido a un Live Lock) en dos proveedores de hosting, que sufrieron el bug del Leap Second de Linux en 2012 donde Hetzner sufrió una subida en el consumo eléctrico de 1 Megavatio y OVH reportó picos de consumo eléctrico debido a bugs al lidiar con el Leap Second.

Figura 18: Picos de consumo reportados por OVH

Posibles soluciones para evitar problemas con Leap Seconds

El problema que tenemos con los Leap Second, es un problema de base. Tal y como comenta Steve Allen, un programador del Observatorio Lick de California:
“Cuando ocurre un Leap Second, el sistema operativo tiene que ingeniárselas para que el resto de las aplicaciones no se den cuenta”.
Se trata por tanto de “mentiras piadosas” que nos pueden pasar factura. Una comparativa interesante que realiza el propio Steve Allen, es que nos enfrentamos a la misma paradoja que se produce en la película 2001 Una odisea en el espacio, en la que HAL 9000, el ordenador de a bordo, empieza a funcionar mal y a tener comportamientos psicópatas, a partir de ser programada para mentir:
“Le dices al ordenador que mienta, y a partir de ahí ya no se puede tener certeza de lo que pasará a continuación.”
La solución que se ha buscado Google consiste en mentirse a sí mismos, pero muy poco a poco y de manera apenas imperceptible, durante un periodo de 20 horas. Durante ese tiempo previo a la introducción en UTC del Leap Second, Google irá ralentizado gradualmente la hora de los sistemas, de forma que para cuando llegue el momento del Leap Second, los sistemas de Google ya estén en línea con la nueva hora UTC.

Amazon hará algo similar: ralentizará durante un periodo de 24 horas sus relojes, desde las 12 horas previas a la introducción del Leap Second, hasta las 12 horas posteriores. Por tanto, 12 horas después del Leap Second, los relojes estarán en línea con la nueva hora UTC.

Para aquellos que no tengan los recursos de Google o Amazon, y que no se puedan permitir implementar su propia versión de NTP, existe una alternativa. Dicho sea de paso, esta alternativa se podrá utilizar en sistemas que requieran precisión, que no exactitud, en lo que a la sincronización horaria se refiere.

El workaround consiste en ejecutar NTP en modo slew. En dicho modo, NTP no utilizará la llamada adjtime() de cara a informar al kernel de que se ha introducido un Leap Second. Por el contrario, NTP utilizará la llamada adjtimex() para simplemente, ajustar el reloj del sistema, pero ignorando por completo el Leap Second introducido.

Figura 19: Modo slew del daemon de NTP

De esa forma, el kernel no ejecutará ninguna rutina excepcional de cara a tratar el Leap Second, sino que ajustará eventualmente el reloj cuando se percate de que no se encuentra en línea con la hora UTC. Este ajuste lo realizará durante bastante horas, que podrían en algunos casos llegar a ser días. Lo cierto es que en el peor de los casos, durante todo este periodo, el reloj se encontrará desajustado en 1s. Para activar el modo slew, no hay más que reiniciar el demonio NTP, pasándole el flag ‘-x’. Se recomienda realizar este cambio al menos 24 horas antes de que se introduzca el Leap Second, y desactivarlo 24 horas después.

Por último hay que decir que dada la complejidad del problema y las dificultades que se han experimentado en el pasado, existen voces dentro de ITU (International Telecommunication Union) para abandonar por completo la idea de los Leap Second, precisamente por el riesgo que el uso de los mismos entraña. Pero no será hasta noviembre de este año, que es cuando se celebra la WRC-15, que se vuelva a hablar de este tema. Por tanto, tendremos Leap Second el 30 de junio de este año 2015, sí o sí. Veremos cuales son esta vez las consecuencias, si es que las hay…

Figura 20: ¿Habrá situaciones anómalas en la introducción de este Leap Second?

Por otro lado, desde aquí me gustaría lanzar una cuestión, ya que cuando se miente con la hora pasan cosas raras en los sistemas operativos:
¿Creéis que sería posible explotar determinadas vulnerabilidades, o bordear ciertos controles (reglas de firewall, IDS/IPS, iptables, etc…) durante la introducción del Leap Second ¿Cómo pensáis que se comportan determinadas aplicaciones o hardware durante ese preciso instante?
Autor: Ángel Blázquez

6 comentarios:

  1. Por poder seguro que hay alguna forma imaginativa de explotar de forma maliciosa los leap seconds.

    Siempre me había preguntado como se getionan los leap seconds en sistemas operativos. Nunca lo he tenido en cuenta a la hora de desarrollar software, porque siempre he supuesto que el sistema operativo revolverá el asunto y durante el leap second en cada llamada a obtener el instante de tiempo dará distintas lecturas.

    ResponderEliminar
  2. Me ha parecido muy interesante el artículo completo, y estaba expectante por leer la pregunta final, pues es la que me había estado haciendo desde que empecé a leerlo: ¿cómo se podrán sacar ventajas, de cualquier tipo y desde cualquier punto de vista, de la implementación de los leap seconds?

    Como curiosidad, este fenómeno me recuerda a una anécdota histórica real. Por un problema de causas similares, cuando intentaron corregir los errores de cálculo del calendario juliano allá por 1582, se dieron cuenta de que la duración de los días era distinta a la que hasta entonces se creía (por observaciones y predicciones de eclipses, sobre todo). La solución fue sencilla pero algo radical: del jueves 4 pasaron directamente al viernes 15 de octubre, perdiéndose diez días por el camino. La pobre Santa Teresa de Jesús, fallecida poco antes de la noche del jueves, estuvo de cuerpo presente más de una semana hasta que fue finalmente enterrada el día 15. A partir de ese momento empezaron a tener en cuenta muchas variables que hasta entonces resultaban desapercibidas.

    Por último, no me gustaría irme sin plantear una cuestión. ¿Cómo afectan los cambios de horario de verano/invierno, introducidos por Benjamín Franklin, a los sistemas informáticos? Me encantaría conocer la respuesta de un problema que llevo algún tiempo planteándome.

    Enhorabuena a Ángel por su artículo y un saludo.

    ResponderEliminar
  3. Excelente explicación. Felicitaciones.

    ResponderEliminar
  4. Buenas, es primera vez que leo al respecto de esto. Tengo una pregunta, ¿sólo sufren los sistemas GNU/Linux? ¿o también toda la familia de Unix? ¿Podría un Solaris, HP-UX, o AIX verse afectado por este problema?

    Gracias.

    ResponderEliminar
  5. A mi, lo de engañar al reloj dándole la hora falsa me ha recordado la película "La Trampa" de Sean Conery y Catherine Zeta-Jones. Creo que ahí se engañaba al reloj para poder robar dinero.

    ResponderEliminar
  6. Sobre el cambio de calendario juliano a gregoriano: El cambio se hizo en diferentes años dependiendo de cada país. Puedes buscar cuando se hizo el cambio en los diferentes paises. Entre las anécdotas está la de la revolución soviética de octubre. En los paises con el calendario gregoriano fue en noviembre.

    ResponderEliminar