lunes, 25 de marzo de 2013

¿me dice la hora por favor?


Cualquiera que sincronize debidamente por NTP, tienen las misma hora EPOCH,
es decir, hasta los mismos segundos. Pero surge una interrogante:


                           ¿Que cosa es un segundo?

Hace unos años un segundo era el tiempo que tardaba el volante de un reloj en moverse de un lado a otro. Pero cuando el volante cambia su tamaño, material o peso, cambia el tiempo que tarda en moverse de un lado a otro. Si vamos a los números muy pequeños, a los 0,00N segundos, dos volantes no tendrán la misma noción de un segundo. Tengamos en cuenta que el tiempo es una magnitud cuya existencia real es aun cuestionada por los físicos más escapaos del yuma.

Mientras tanto, aparecieron las computadoras. Ya no hay un volantes pero persiste el problema del milisegundo. Los relojes deben medir el tiempo basándose en la frecuencia del microprocesador.

                      ¡¿y qué pasa cuando sube el voltaje?!

Pues la frecuencia varía. Además, pal caso es la misma mierda, porque si tomamos un volante que pese una pendejésima menos que el otro, su segundo sera entonces un pendejisegundo de diferencia con respecto al otro volante.

No parece haber un sistema decente que mantenga un flujo de tiempo constante. No hay un árbol de tiempo, ni un caudal de un rió fluye siempre igual. La marea del mar varía de solo mirarlo, también según como esté la luna, que es particularmente venática.

:-P drama descomunal. Parece no tener solución

Pero eso No ha frenado a nuestra civilización de querer demostrar la existencia del tiempo real; hasta decir que es una dimensión más del universo ¿Se ha puesto a pensar, como se comporta el flujo de tiempo en una
cuerda? Debe ser algo sublime.

Pero de vuelta a lo que nos compete...

Decíamos que el EPOCH (la hora de unix) es la cantidad de segundos transcurridos desde 1970 hasta la ACTUALIDAD. Alabao! ¿y qué es "la actualidad" entonces?! ¡ÑÓ! ¡Cuantas preguntas existenciales! Pues en epoch, la actualidad o el presente, es la cantidad de segundos que se suman desde 1970 hasta la hora
que tiene la máquina. Por ende:

Si nuestra máquina tiene UN segundo de atraso,
dará el EPOCH de manera incorrecta.

Si un satélite de GPS se equivoca UN SEGUNDO, dará mal unos metros la ubicación de un cuerpo moviéndose en la tierra. Las triangulaciones satelitales requieren una precisión de milisegundos.

Supongamos que los Yankis tiran un misil para el Capitolio...



Mientras el misil vuela en el aire, la tierra se va trasladando a 15 grados por hora. En dos minutos, la tierra se habrá desplazado 0,5 grados sobre su propio eje y el objetivo no estará en el mismo lugar, si leí bien mi regla de cálculos, estará a 2500 metros.

Para contrarestar esta impresición, el GPS ordena al misil que corrija su curso. Le indica un ángulo de inclinación que lo vuelve a poner con destino al blanco. Esto sucede en el aire, sobre todo si el objetivo está en movimiento.

Supongamos que el sistema tiene una diferencia de 0,4 segundos y que dada la altura, el retardo ha provocado que el satélite ordene al misil, una inclinación de 7,3 miserables grados de más.

Ahora el misil que está a 32 kM de altura, recibió una inclinación que excede 7,3 grados al desplazamiento axial de la tierra y por tanto, su objetivo ya NO será el capitolio.

Por 7,3 grados nos quedamos sin estadio de pelota! 



Pero NO solo en los celajes, aquí en la baja atmósfera también suceden cagástrofes locales:

Una aplicación que trabaje con Round Robin, por ejemplo el MRTG; si le entran datos con dos EPOCH iguales, crea inconsistencias en la base de datos. Un evento que debe loguearse cada un segundo y si estos segundos están mal, el log estará alterado. Quizás a usted no le importe mucho ese asunto, pero recuerde que los países desarrollados son desarrollados por que su tecnología es de alta precisión ;) Por eso los países subdesarrollados NO fabrican cohetes, ni aún teniendo los recursos.

Entonces, definitivamente tiene que existir una fuente infalible de tiempo. Tienen que haberla inventado o no hubiesen misiles teledirigidos de alcance global.

Gracias a ntp, tenemos una fuente infalible de tiempo.

Bueno, en nuestro mundo el tiempo parece no existir. Pero en el micromundo hay algo que es bien constante. Un tipo muy escapao de la física, descubrió que si podía tomarle el pulso a un átomo, obtendría un flujo de tiempo BIEN preciso y constante. El átomo tiene un electrón que orbita alrededor del núcleo con una constancia y precisión casi infalible. Con eso, se inventó un aparatico que le dicen:

   "reloj atómico" (dicho con una gran sonrisa y los ojos cerrados)

y diiiicen, que el más preciso del mundo. Su imprecisión es de un milisegundo cada no se cuantos miles de años. Tiempo más que suficiente para morirte sin ver como tu reloj se atrasa un milisegundo :D

Pues ya, solucionado el problema, inventaron el stratum 0. Pero en la tienda de Carlos 3ero NO venden relojes atómicos :(

Los stratum 0 transmiten por honda corta la hora y los radios relojes la reciben. Calculan la diferencia usando la frecuencia y retardo de la señal y andando; se inventó el stratum 1, es decir: Aquellos relojes que reciben la hora del infalible. Bueno pero ese tampoco lo tengo :-/ Pero aún queda la opción de conectar una computadora al GPS o al raioreloj...

Bueno, resuelto el problema, que los stratum dos manden la hora por la red y todos felices.

SI TA BIEN :D créete eso

La cosa no es tan simple como mandar un string con la hora. Si NTP fuera tan simple como eso, chocaría de frente con la metatranca más grande que ha dado la física: "la relatividad de Einstein"

-son las 3 con 2 minutos y 0.0001 milisegundos, TRABA, aquí te lo mando

El paquete tardará 65 milisegundos en recorrer el cable (una fibra óptica muy de pinga). Al llegar, ya tendrá 0.6499 de atraso y ya vimos el desastre cuando hay 0,4 segundos de atraso así que solo será cuestión de tiempo que el reloj se atrase gradualmente.

COÑO! El tiempo es relativo!

Cuando miras un reloj, ves que son las 12 y media con 18 segundos. Pero la luz viaja a no se cuantos kilómetros por hora. Valla, como que 18 segundos son más que preciso pero en realidad la imagen llegó a tus ojos con unos 0,000036 segundos de retardo :D

Para resolver este problema, el protocolo NTP, compara el tiempo que tardo en viajar el paquete por la red. El paquete dice:

-son las 3 y 20, sali a las 3 y 24

Cuando llegue, ntp mira la hora y mira lo que tardó el paquete en llegar.

-segun el reloj de él, este paquete tardo 12 minutos en llegar y tenia las
  3 y 20 por tanto 4 y 12 son 16. En este momento son las 3 y 36

Balla no es así exactamente. Es mucho más complejo. El paquete de NTP es una matatranca tremenda que se se basa en una pila de cosas.


Las computadoras conectadas, al radio, o al segundo infalible (el GPS), son los llamados stratum 2, esos tienen servidor NTP y por lo general son de acceso público.


Bueno pero todo eso está muy bonito en teoría. Cuando hay que mandar un paquete por modem de 28K por un ADSL; empieza la realidad del cubano a derretir nuestro sueño. Ahí es cuando entra:

¡Chrony al rescate! Defensor de los pueblos pobres, oprimidos por el subdesarrollo o bloqueados comercialmente :D

NTP puede ser configurado para evitar que un drift muy largo descarte una fuente como fideligna. Chrony, por naturaleza, hace mil y una maroma para acercarse a la realidad. Además. Chrony, hace algo único

   "adivina nuestro hardware"

Chrony se basa en los estratos y almacena en un fichero el drift con que periódicamente falla nuestro micro. De esta forma aplica un "threshold" basado en la conducta usual de nuestro microprocesador. Por ejemplo: Si el micro se adelanta 0.005 ms cada un segundo. Chrony estará atrazándolo 0.005 ms cada un segundo para mantener la realidad acoplada.  Esto se hace de esta forma, porque cuando cambias la hora, algunos
servicios se vuelven locos. Prueba a usar "date -s" y veras como dovecot se para en seco :D porque un cambio de hora en el server es una violación de seguridad.

Si un marcapasos pulsa dos veces por segundo y tú le cambias la hora de sopetón:

 Biip biip bip-bip-bip biiiiiiiiiiiiiiiiiiiiiip ¡¡ENFERMERAAA!!

Para hacer esto de manera "imperceptible", están los llamados "threshold". Aplicar un "tresjol" no es más que: "ir restando milisegundo por milisegundo, hasta alcanzar la hora correcta"

Dime... ¿no es fascinante? Todavía hay mediocres por ahí que usan "date -s" La delgada linea que separa la ignorancia de la estupidez. Algo típico: -mi reloj (de mano) está puesto por radioreloj, tu celular está mal

¡COJONE! ¡que somos informáticos, somos científicos! Técnicos operadores de sistemas unix. NO somos copiadores de códigos ni seguidores de tutoriales baratos. Podemos tener un sistema cuya precisión de tiempo sea digna de tirar un misil ICBM y no nos cuesta nada.

Con todos esto en mi cabeza, cada vez que alguien me dice que mi nokia sincronizado por cubacell podría estar mal, lo que me dan ganas de matarlo, no sería homicidio, es que la ignorancia mata a los pueblos. Ya que tenemos un chrony tan preciso:

echo 'stratum 2' >> /etc/chrony/chrony.conf
echo 'allow 0/0' >> /etc/chrony/chrony.conf

De esta forma podremos responder con mucha precisión cuando nos pregunten:

¿qué hora es?

martes, 19 de marzo de 2013

róbate la hora


Los cubanos le sacamos agua a un ladriyo :D

Para aquellos que 50 segundos de diferencia no le quita el sueño; ya pueden actualizar detrás de un servidor proxy y no necestian NTP ya que con este método lo que hacemos es:

   "setear la hora usando el header Date: de un servidor remoto"

al cron le ponemos una tarea asi:

 # cada una hora, sincronizate
 00 * * * * cronos.sh http://www.algunsitio.com

El script recibe una URL como parámetro y de ahí se fachará la hora. Google tiene una hora bien firme pero no creoq ue le haga mucha gracias tu pedidera de encabezados. Asegúrate de usar algun servicio decente...

sin mas, aqui los dejo con el script

#!/bin/bash
#
# http://github.com/uranio-235/dev/blob/master/cronos.sh
#
# debemos esperar a que comienze un segundo para
# evitar que la transicion 59 > 00 cause drift
while test $(date +%S) -gt 10; do sleep 5; done

# ejecutamos test y curl para que se cacheen
# en memoria y arranquen mas rapido despues
curl --help 2> /dev/null > /dev/null
test

# calentamos los motores aritmeticos tambien :D
echo $(($(seq 1 9|shuf|tail -1)*$(seq 1 9|shuf|tail -1)-$(seq 1 9|shuf|tail -1)))

# trae la fecha del header Date:
remota=$(curl -I $1 2> /dev/null |grep 'Date:'|sed s/'Date: '/''/g)

# arrestun momentum
local=$(date +%s)

# si el sistema tiene la misma fecha ni te inmutes
test $(date -d "$remota" +%s) = $local && exit 0

# un segundo menos es por culpa de Einstein, asume que esta bien
test $(date -d "$remota" +%s) = $(($local-1)) && exit 0

# SETEA LA FECHA!
date -s "$remota"

# logueo por syslog
logger 'le fachamos a' $1 'las' $(date)

exit 0
# vim:fo=tcq:tw=75:nowrap:
# EOF