¿Cómo puedo medir y prevenir la deriva del reloj?

15

En varias plataformas de producción hemos observado síntomas que parecen sugerir que la hora del reloj se adelanta o retrocede periódicamente. Los saltos son típicamente alrededor de 1 segundo, típicamente se cancelan (saltan hacia adelante y luego hacia atrás muy poco después) y ocurren alrededor de 50 veces por día. Esta deriva es más notable durante los momentos de mayor uso de la aplicación y durante los períodos de altas operaciones de E / S de disco, como las copias de seguridad diarias. Estas derivaciones están afectando nuestra aplicación sensible en tiempo real.

Los sistemas son servidores Oracle Netra X4250 y Netra X4270 que ejecutan SLES 11SP2 con el kernel 3.0.58-0.6.6 predeterminado.

$ cat /sys/devices/system/clocksource/clocksource0/available_clocksource
tsc hpet acpi_pm

$ cat /sys/devices/system/clocksource/clocksource0/current_clocksource
tsc

Hemos deshabilitado NTP , pero eso no ha tenido ningún efecto en las derivas. ¿Existen herramientas que miden la deriva del reloj de la hora del día? ¿Cómo podemos evitar esto?

Estas son plataformas de producción, y no podemos recrear el problema en nuestros laboratorios, por lo que mi capacidad de experimentar es limitada. Si lo dejo en mis propios dispositivos, escribiré una herramienta para medir la deriva y tal vez experimentaré con una fuente de reloj HPET .

Brett
fuente
55
Deshabilitar NTP hace que los relojes sean mucho más inestables ... la única razón por la que puedo ver que NTP no mantiene el reloj en línea es que el reloj está fuera de control, y NTP se niega a actualizarlo (ver ntpdate(8)o ntpd(8)).
vonbrand
1
NTPD rastrea y corrige la deriva del reloj, pero lo que tiene no es deriva. La deriva es consistentemente en la misma dirección en aproximadamente la misma cantidad con el tiempo. Si salta aleatoriamente hacia adelante y hacia atrás, no hay forma de predecirlo y acomodarlo.
Patrick
1
Lo que dijo @Patrick es correcto, el problema que describe es un salto discontinuo en el tiempo hacia adelante y hacia atrás, varias veces al día. NTP funciona bien en deriva pero no te ayudará mucho con esto. Es probable que algo restablezca la fecha de su sistema a una fuente de tiempo externa que tal vez solo tenga una resolución de 1 segundo. Si sus servidores son x86 *, el RTC de hardware podría ser la fuente y un trabajo cron el culpable. En cuanto a medir el reloj, la respuesta ntpdate de Bratchley es un enfoque razonable, siempre que se utilice una buena referencia de reloj del estrato 1: ejecutar una vez por minuto y obtener el resultado de una imagen.
duanev
1
Me encontré con esta evaluación de NTP iniciando en un nuevo servidor ( drdobbs.com/embedded-systems/… ). Se necesitan horas NTP para aprender un nuevo cristal. Para cristales realmente malos, el NTP tendrá que 'pasar' el reloj en cantidades significativas varias veces durante el entrenamiento (ver las figuras 4 y 5 de ese artículo). Un valor final en ntp.drift de 118ppm es 10 segundos por día o 208 ms cada 30 minutos. Aunque esto no es lo que estaba viendo el OP, NTP inicialmente puede causar saltos notables en el tiempo.
duanev

Respuestas:

8

¿Existen herramientas que miden la deriva del reloj del día?

Las únicas herramientas que conozco son las herramientas NTP que deberían ser suficientes. No tiene que configurar realmente ntpd para sincronizar con una fuente de reloj dada, solo puede usar la -dopción ntpdatepara obtener el desplazamiento calculado.

Ejemplo:

[davisja5@xxxadmvlm08 ~]$ ntpdate -d clock.redhat.com 2>/dev/null | egrep "^offset"
offset -0.004545
[davisja5@xxxadmvlm08 ~]$

-d es la opción de depuración que hace que el NTP funcione sin tocar realmente el reloj del sistema.

¿Algún consejo sobre cómo podemos evitar esto?

No estoy demasiado sorprendido de que no pueda reproducir esto en entornos de desarrollo / prueba, ya que probablemente se deba al reloj del hardware. Si tiene soporte de hardware con alguien, trataría de reparar sus máquinas. Una posibilidad es cambiar una de las máquinas de desarrollo por esta máquina de producción, arreglar los sistemas PROD anteriores y reintroducirla como una máquina de desarrollo para reemplazar la que está en PROD ahora.

Aparte de eso, cambiar la fuente del reloj de hardware es todo lo que puede hacer. Si no puedes o no puedes hacer el intercambio, te sugiero que hagas la ruta hpet. Puede probar si el cambio en la fuente del reloj se complica con los servicios del sistema y luego implementarlo en producción como granizo.

Bratchley
fuente
Por "medir la deriva del reloj", no me refería a la deriva de una fuente de tiempo de referencia, como NTP le da. Me refería a una herramienta que puede detectar "saltos" en la hora del día en un rango de tiempo continuo. Por ejemplo, tome muestras de la hora del día cada 50 ms e informe si la diferencia con respecto al último muestreo está demasiado lejos de los 50 ms. Dicha herramienta mostraría si el reloj de la hora del día se desvía del reloj de hardware subyacente por algún motivo.
Brett
1
¿No es probable que la presencia de dicha intervención cause más degradación del rendimiento de lo que espera resolver? Sin embargo, es muy probable que sea un problema de hardware, por lo que deberá reparar el hardware o utilizar una fuente de reloj sin este problema. tscestá basado en la CPU, por lo que tiene sentido que una mayor actividad de la CPU desencadene un problema con el reloj del hardware de todos modos. Si hpet es lo suficientemente rápido para ti, entonces es posible que solo tengas que intentarlo, recibir servicio o hacer el intercambio. Esas son las únicas opciones que puedo ver por ti.
Bratchley
3

Una solución es usar HPET

Ver también Temporizador de eventos de alta precisión

Para configurarlo como parámetro de arranque, use

clocksource=hpet

En hardware antiguo, a TSCmenudo era inestable y el núcleo lo deshabilitaba.

Con la llegada de las CPU multi-core / hyper-thread, los sistemas con múltiples CPU y los sistemas operativos de hibernación, no se puede confiar en que el TSC proporcione resultados precisos ...

Wikipedia: Contador de sello de tiempo


fuente
En un sistema de producción que presentaba los síntomas de la fluctuación del reloj, cambié la fuente del reloj a hpet. Esto no tuvo ningún efecto sobre los síntomas de fluctuación de reloj observados.
brett
HPET es un temporizador de hardware externo y no puede fluctuar. Entonces, esta solución parece ser un camino equivocado. Hubo muchos problemas de sincronización con hardware antiguo, especialmente cuando se usaba la virtualización. ¿Verificaste esto con otro software también?
1

Escribí una herramienta más detallada para correlacionar las mediciones del reloj con los síntomas de latencia exhibidos por nuestra aplicación. Esta herramienta parece descartar lo que sospeché anteriormente como jitter en el reloj de la hora del día de Linux.

En resumen, mi hipótesis inicial era inválida. Pero aprendí mucho sobre los relojes Linux a partir de las respuestas y los enlaces, ¡así que gracias a todos los que respondieron!

Brett
fuente
3
(...) mi hipótesis inicial era inválida ¿Podría decirnos cuál fue la verdadera causa, entonces?
Piotr Dobrogost
0

¿No se supone que el reloj es monótono a menos que alguien lo cambie? Los saltos hacia atrás no deberían ser posibles. Debe haber algo que ajuste el reloj: un trabajo cron o algún otro demonio (por ejemplo, una llamada a hwclock --adjust). Recuerdo que ntp en sí actualiza las estadísticas de deriva y lo compensa de forma rutinaria y si no ejecuta ntp durante mucho tiempo y obtiene un gran desplazamiento, desordenará el tiempo durante días después de no restablecerlo /etc/adjtime. Es posible que tenga algo así, algo que reajusta periódicamente la deriva del tiempo (y causa saltos).

ntp en realidad está destinado a contrarrestar este problema.

Orión
fuente
Eso es lo que yo también pensaba. Mi lectura de las fuentes del reloj de hardware sugiere que el contador debería estar aumentando monotónicamente. Si eso fuera cierto, en el peor de los casos deberíamos observar tasas de tics erráticos, pero nunca retroceder. En un sistema multiprocesador, entiendo que tsc necesita sincronizarse entre los procesadores, ¿tal vez esto es lo que está causando saltos hacia atrás?
brett