---
title: 虚拟机锁虚实协同优化
description: "内核有些锁在抢锁时会进行自旋等待，如果当前持有锁的vCPU被hypervisor调度到其他任务上，那么等待锁的vCPU可能会因为长时间的自旋等待而浪费大量时间，特别是在虚拟机超分场景下，这种情况会显著影响虚拟机的整体性能。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengcpfs/twp/kunpengcpfs_19_0089.html
sourcePath: /source/zh/kunpengcpfs/twp/kunpengcpfs_19_0089.html
indexId: e23b370a2c18853c24dd1e8f12fa2cb92d02582591a015ce256856182255b54451
---
# 虚拟机锁虚实协同优化

#### 痛点

内核有些锁在抢锁时会进行自旋等待，如果当前持有锁的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等函数会用到本特性。
