内核有些锁在抢锁时会进行自旋等待,如果当前持有锁的vCPU被hypervisor调度到其他任务上,那么等待锁的vCPU可能会因为长时间的自旋等待而浪费大量时间,特别是在虚拟机超分场景下,这种情况会显著影响虚拟机的整体性能。
为了解决这一问题,可以采用共享内存的方式,通过hypervisor将vCPU是否被抢占的信息传递给虚拟机。这样,当vCPU在自旋等待过程中发现持有锁的vCPU已经被抢占时,它可以及时跳出自旋等待状态,避免无谓的等待。
“preempted”状态值用于记录vCPU在Host上是否被抢占,0表示hypervisor调度了该vCPU,1表示hypervisor调度走了该vCPU。具体来说,当hypervisor调度了该vCPU时,“preempted”状态值为“0”;而当hypervisor调度走了该vCPU时,“preempted”状态值则变为“1”。