En el artículo Time drift extremo en Windows XP virtualizado con KVM muestro un caso de time drift extremo en un guest Windows virtualizado con KVM. Luego de haber podido reproducir los eventos que conducen al problema, un poco más de luz sobre el asunto...

Cómo reproducir la situación:

Para reproducir la situación se necesita un host de máquinas virtuales KVM (en este caso una workstation con CentOS 6.3) y una máquina virtual Windows XP SP3.

1) Apagar el host con las máquinas virtuales en ejecución. Al apagar el host, las máquinas virtuales se ponen en pausa (es como si se congelaran, al mejor estilo Han Solo).

2) Luego de algunas horas (por ejemplo al día siguiente) encender el host. Durante el proceso de inicio de CentOS 6.3, las máquinas virtuales que estaban en pausa se resumen (reanudan, se descongelan) a la misma hora y en exactamente el mismo estado en que estaban al haberse pausado.

3) Lo que sucede a continuación es lo que todavía no logro entender con total claridad: dependiendo de la configuración del guest, el host re-inyecta todas las interrupciones de reloj que se perdieron desde que la máquina virtual se pausó hasta que se reanudó (de un día para otro son unas cuantas...)

Sin embargo, además de re-inyectar las interrupciones de reloj, parece que el guest sincroniza la hora con el host (tal vez durante el inicio del host). Estimo que sincroniza dos veces, por ello el reloj se adelanta. El resultado es el siguiente:

Experimento:

Para demostrar como funciona la re-inyección de interrupciones de reloj en diferentes sistemas operativos guest, un breve experimento que consiste en pausar y reanudar máquinas virtuales luego de unos minutos.

Experimento con guest Windows XP SP3:

Experimento con guest Mageia 2:

Debido a que me está resultando muy difícil encontrar documentación al respecto, agradecería que cualquier experto en sistemas operativos y virtualización me de una ayuda al respecto. Según mi opinión ("las opiniones son como los traseros, cada cual tiene el suyo y todos apestan..."), la re-inyección de interrupciones luego de un gran período de pausa no es viable (los resultados están a la vista) y estoy tratando de desactivarlo para el guest Windows XP.

Update:

Para evitar este problema en Windows XP SP3 se debe reconfigurar la máquina virtual de la siguiente forma:

# virsh edit WXPsp3

Dentro de la sección "clock" se debe eliminar la política "catchup" del timer RTC (Real-Time Clock). Esto impide que se traten de "recuperar" o "re-inyectar" los ticks de reloj perdidos durante la pausa de la máquina virtual.

  <clock offset='localtime'>
    <timer name='rtc' tickpolicy='catchup'/>
  </clock>

Debe quedar como se muestra a continuación:

  <clock offset='localtime' />

Para aplicar esta configuración es necesario apagar el guest. El resultado es que cuando se resume la ejecución de la máquina virtual, luego de la pausa, no se recuperan tics de reloj (el curioso "viaje en el tiempo" que se muestra en el video) y la máquina virtual continúa con la misma hora que tenía en el momento en que se había pausado. Por lo tanto es necesario actualizar el reloj de alguna otra forma, por ejemplo utilizando el protocolo NTP (Network Time Protocol), pero así se evitan todos estos ticks de reloj que aumentan considerablemente el consumo de CPU en el guest (y que de todas formas dejan al guest fuera de sincronismo ya que el reloj se adelanta).

También es posible probar las diferentes políticas para los ticks del reloj RTC que se especifican en la documentación (ver tabla a continuación) para determinar cual se adapta mejor al guest.



Virtualization Administration Guide:

tickpolicy
The policy used to pass ticks on to the guest.
Table 9.4. tickpolicy attribute values
ValueDescription
none Continue to deliver at normal rate (i.e. ticks are delayed).
catchup Deliver at a higher rate to catch up.
merge Ticks merged into one single tick.
discard All missed ticks are discarded.



Tal vez pueda interesarte


Compartí este artículo