Qué es el "stolen time"

Si observan cuidadosamente la salida de vmstat o top, hay una columna llamada "st" (o %st en top) que indica la cantidad de "stolen time", esto supuestamente es la cantidad de tiempo de CPU que el hypervisor le "robó" a los procesadores virtuales (si es que tenían algo para ejecutar, no cuenta si estaban "idle") ejecutando cualquier otra cosa en lugar de código perteneciente al guest virtual.

En otras palabras, es la cantidad de tiempo que los procesadores virtuales tuvieron código para ejecutar pero no se les asignó un CPU físico, debido a la planificación o sobrecarga en el host. El % de CPU que no estuvo disponible para la VM debido a la sobrecarga de la virtualización.



Los man page tanto para vmstat como para top no explican demasiado en profundidad de qué se trata esto del "steal time" o "stolen time":

man vmstat

"st: Time stolen from a virtual machine. Prior to Linux 2.6.11, unknown."

man top

"st = steal (time given to other DomU instances)"

En Internet no encontré mucha información al respecto. Mi duda era: ¿esto cuenta sólo para XEN? Porque KVM utiliza full virtualization. Viendo el manual de top, éste habla de dominios (DomU)...

Debatiendo con colegas amigos surgió la idea de que el ST debería estar disponible para todo SO paravirtualizado (kernel reescrito para ser "consciente" de la virtualización, como por ejemplo Xen...

Leyendo más documentación y manuales logré entender que el steal time se mide en los guests, no en el host. Es la cantidad de tiempo que el CPU virtual tenía trabajo por hacer, pero permaneció esperando que el hypervisor le asignara un CPU físico. Por lo tanto, a pesar de que se mide en el OS guest, ¿será necesario alguna interacción con el hypervisor? ¿Cómo hace el kernel guest para detectar que el CPU virtual estaba esperando CPU físico sin interactuar con el hypervisor?

Luego de disipar mis dudas, logré entender que para calcular el "steal time" es necesario sí o sí ayuda del hypervisor y depende de la tecnología de virtualización utilizada.

De la documentación de KVM obtuve la respuesta. La tecnología de virtualización (en este caso KVM) agrega registros específicos del modelo (model-specific registers más conocidos como MSR) a los VCPU. Uno de estos MSR es utilizado por el hypervisor como un contador de la cantidad de tiempo que le robó a la VM (suponiendo que el hypervisor es honesto :D). Es decir, el hypervisor va actualizando periódicamente un registro de CPU que contiene un contador con la cantidad de stolen time, luego el kernel guest lee el contador y determina cuanto tiempo le fue robado, para así poder calcular el uso de CPU real (en espacio kernel y usuario). 

En la siguiente captura se observa una máquina virtual KVM con un %st mayor a cero:

En la documentación oficial del kernel Linux se encuentra explicado en detalle el "steal time" y los registros MSR con los que KVM lo implementa:

https://github.com/torvalds/linux/blob/master/Documentation/virtual/kvm/msr.txt

Extracto:

MSR_KVM_STEAL_TIME: 0x4b564d03
 
data: 64-byte alignment physical address of a memory area which must be
in guest RAM, plus an enable bit in bit 0. This memory is expected to
hold a copy of the following structure:
 
struct kvm_steal_time {
__u64 steal;
__u32 version;
__u32 flags;
__u32 pad[12];
}
 
whose data will be filled in by the hypervisor periodically. Only one
write, or registration, is needed for each VCPU. The interval between
updates of this structure is arbitrary and implementation-dependent.
The hypervisor may update this structure at any time it sees fit until
anything with bit0 == 0 is written to it. Guest is required to make sure
this structure is initialized to zero.
 
Fields have the following meanings:
 
version: a sequence counter. In other words, guest has to check
this field before and after grabbing time information and make
sure they are both equal and even. An odd version indicates an
in-progress update.
 
flags: At this point, always zero. May be used to indicate
changes in this structure in the future.
 
steal: the amount of time in which this vCPU did not run, in
nanoseconds. Time during which the vcpu is idle, will not be
reported as steal time.

 

La técnica para contabilizar el ST es utilizando un timer virtual, y contabilizando el tiempo de CPU utilizando el timer virtual en lugar de basándose en ticks (como se hacía tradicionalmente en el kernel Linux). Estas slides de IBM explican cómo se hace:

Finalmente un toque de humor, la posible causa de tener un alto "steal time":

"...a high steal percentage may mean that your hosting company is overselling virtual machines on your particular server."



 

Suscribirse

    Registrate para recibir las novedades y artículos por correo electrónico.

Linuxito en G+