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:
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":