虚拟机锁虚实协同优化
痛点
内核有些锁在抢锁时会进行自旋等待,如果当前持有锁的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 虚拟机锁优化原理图

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