虚拟机锁虚实协同优化

痛点

内核有些锁在抢锁时会进行自旋等待,如果当前持有锁的vCPU被hypervisor调度到其他任务上,那么等待锁的vCPU可能会因为长时间的自旋等待而浪费大量时间,特别是在虚拟机超分场景下,这种情况会显著影响虚拟机的整体性能。

解决方案

为了解决这一问题,可以采用共享内存的方式,通过hypervisor将vCPU是否被抢占的信息传递给虚拟机。这样,当vCPU在自旋等待过程中发现持有锁的vCPU已经被抢占时,它可以及时跳出自旋等待状态,避免无谓的等待。

“preempted”状态值用于记录vCPU在Host上是否被抢占,0表示hypervisor调度了该vCPU,1表示hypervisor调度走了该vCPU。具体来说,当hypervisor调度了该vCPU时,“preempted”状态值为“0”;而当hypervisor调度走了该vCPU时,“preempted”状态值则变为“1”

图1 虚拟机锁优化原理图

应用场景

  1. 虚拟机锁优化适用于vCPU范围绑核的超分场景,即一个物理核可能会有多个vCPU线程争抢资源的情况。
  2. 本特性以前后端协同方式,获取vCPU线程的抢占状态,优化内部调度/锁的性能。在涉及到cpu调度的场景下,如mutex_spin_on_owner、mutex_can_spin_on_owner、rtmutex_spin_on_owner and osq_lock、available_idle_cpu会用到本特性。