论文解读:Mitigating Excessive vCPU Spinning in VM-Agnostic KVM

论文《Mitigating Excessive vCPU Spinning in VM-Agnostic KVM》系统性地研究了 KVM 虚拟化环境中因 vCPU 过度自旋 (excessive spinning)的问题,并提出了轻量级、高效的解决方案。以下是对其核心问题创新点的解析:


一、主要解决的问题

vCPU 超售(oversubscription,即物理 CPU 少于虚拟 CPU)场景下,会出现以下恶性循环:

  1. 锁持有者被抢占(Lock-Holder Preemption, LHP)

    • 持有自旋锁的 vCPU 被 hypervisor 抢占;
    • 其他等待锁的 vCPU 进入忙等待循环 (spin-wait loop),不断执行 PAUSE 指令。
  2. 硬件 PLE 触发但无效

    • Intel 的 **Pause-Loop Exiting **(PLE) 硬件特性会检测到长时间自旋,触发 VM-Exit,将控制权交还 KVM;
    • KVM 尝试调度"可能持有锁或需响应中断"的 vCPU(称为 boost);
    • 但现有机制经常失败 ,导致 PLE 连续触发数百次(>600 次),性能严重下降(最高达 45%)。

作者通过深入分析,识别出 三大根本原因

1. Scheduler Mismatch(调度器不匹配)
  • 问题 :KVM 作为 Linux 内核模块,不能直接调度 vCPU,只能通过 yield_to()CFS 调度器 发出"提升某 vCPU 优先级"的请求。
  • 但 CFS 坚持公平性原则:如果目标 vCPU 的虚拟运行时间(virtual runtime)较长(如刚用完时间片的 resource-waiter),CFS 会拒绝切换,认为"现在切过去不公平"。
  • 结果:自旋 vCPU 被反复调度 → 持续触发 PLE。
2. Lost Opportunity(错失良机)
  • 问题 :KVM 原始设计只针对 内核态自旋锁 (LHP),因此只 boost 处于内核态的 vCPU
  • 但 TLB shootdown 场景中 ,IPI 接收者可能处于 用户态,KVM 不会将其加入候选列表。
  • 结果:IPI 发送者持续自旋等待 ACK,但接收者 never 被调度 → PLE 不断发生。
3. Overboost(过度提升)
  • 问题 :KVM 对所有 halted 且收到 IPI 的 vCPU 都视为候选。
  • 但在自旋锁场景中,IPI 可能是异步的(如 reschedule IPI),与当前自旋无关。
  • 结果:KVM 错误地 boost 了无关 vCPU,浪费调度机会,未能解决真正瓶颈。

本质 :这些问题都源于 hypervisor 与 guest OS / host scheduler 之间的语义鸿沟(semantic gap)------ KVM 无法准确知道"谁该被调度"。


二、核心创新点

作者提出两种仅需 41 行代码修改 的轻量级机制,在不破坏 VM-agnostic(无需修改 Guest OS)的前提下,精准解决上述问题:

✅ 创新点 1:vCPU Debooster (降级器)→ 解决 Scheduler Mismatch
  • 思想 :不是强行提升目标 vCPU,而是临时降低自旋 vCPU 的优先级
  • 实现
    • 当 PLE 触发时,若目标 vCPU 因 virtual runtime 过大被 CFS 忽略,
    • Debooster 人为增加自旋 vCPU 的 virtual runtime,使其"看起来更不值得运行";
    • CFS 自然会选择目标 vCPU。
  • 优势
    • 不违反 CFS 公平性(未提升任何人,只降级无用者);
    • 避免 CPU 时间浪费在无意义的自旋上。
✅ 创新点 2:Strict Boost (严格提升)→ 解决 Lost Opportunity + Overboost
  • 思想区分自旋原因(spinlock vs TLB shootdown),动态调整候选策略。
  • 关键改进
    • 对 TLB shootdown
      • boost 所有收到 IPI 的 vCPU(无论用户态/内核态/是否 halted);
      • 通过 KVM 的 虚拟 IPI handler 精确记录 IPI 发送关系。
    • 对 spinlock
      • 仅当自旋由 IPI 发送者引起时,才 boost IPI 接收者;
      • 避免对无关 halted vCPU 的 overboost。
  • 优势
    • 精准定位根因,避免盲目提升;
    • 兼容现有 KVM 架构,无需 guest 修改。

三、效果与意义

全屏复制

指标 效果
PLE 事件减少 最高 87.7%
应用性能提升 最高 80%(如 ebizzy)
系统公平性 共存 VM(swaptions)性能无损,甚至因减少干扰而提升
代码侵入性 41 行内核修改,完全 VM-agnostic
适用场景 vCPU 超售越严重(VM 越多),效果越显著

💡 核心贡献

证明了即使在 VM-agnostic (无 guest 协作)的限制下,

通过精细利用硬件信号 (PLE)+ 巧妙协调 host scheduler

也能高效解决 vCPU 自旋问题,打破"必须依赖 paravirt 或 co-scheduling"的固有思路


总结

全屏复制

维度 内容
问题 KVM 在 vCPU 超售下因 PLE 无效循环导致性能严重下降
根因 Scheduler Mismatch + Lost Opportunity + Overboost
创新 Debooster(降级自旋者) + Strict Boost(按场景精准提升)
优势 轻量(41 LOC)、VM-agnostic、高性能、保公平
意义 为通用虚拟化平台提供了一种实用、可落地的调度优化范式

📌 一句话概括
"不靠 guest 配合,不改调度器核心,仅用 41 行代码,就让 KVM 的 PLE 从'频繁误报'变成'精准打击'。"

gemini 解读:

主要问题:

在虚拟化环境中,为了提高CPU资源利用率,通常会超额订阅物理CPU(pCPU)上的虚拟CPU(vCPU)。然而,当一个vCPU等待另一个已被调度出去的vCPU产生的事件时,会发生过度vCPU自旋。这种自旋等待会导致严重的性能下降。

尽管现代KVM等虚拟机监控器(hypervisor)已经尝试通过硬件虚拟化支持(如Pause Loop Exit, PLE)来检测并缓解vCPU过度自旋,但论文指出KVM的vCPU调度器在很多情况下未能有效避免过度自旋。

论文深入分析后,识别出KVM vCPU调度器在解决过度自旋问题时存在的三个具体问题:

  1. 调度器不匹配(Scheduler Mismatch):KVM vCPU调度器与Linux宿主机调度器之间存在不匹配。KVM会向宿主机调度器提供调度提示(如提升vCPU优先级),但宿主机调度器可能基于自身的策略(例如公平调度)忽略这些提示,导致被提升的vCPU未能及时调度,而引起PLE的vCPU反而被重复调度。
  2. 机会丢失(Lost Opportunity):KVM vCPU调度器在选择下一个要提升的vCPU时不够精确。有时,它未能提升真正能解决问题的vCPU,例如,如果IPI接收者vCPU处于用户模式,KVM调度器可能不会将其唤醒,即使它需要响应IPI以解决TLB Shootdown导致的自旋。
  3. 过度提升(Overboost):KVM vCPU调度器有时会错误地提升那些不应被提升的vCPU,例如,当一个vCPU因等待锁持有者而退出时,KVM可能会提升一个被暂停的IPI接收者vCPU,即使这个IPI与当前自旋事件无关。这引入了不必要的提升和PLE事件。

这些问题导致即使在KVM尝试缓解过度自旋的情况下,一些基准测试的性能仍会下降高达45%,并且PLE事件会持续不断地在高频率发生。

创新点:

论文提出了对KVM进行简单修改(仅41行代码)以优雅地解决上述问题,其创新点在于:

  1. vCPU降优先级器(vCPU Debooster)

    • 解决问题:主要缓解"调度器不匹配"问题。
    • 机制:当一个vCPU因PLE而被抢占时,降优先级器会降低其优先级。具体来说,它会调整PLE引发vCPU的"虚拟运行时"(virtual runtime),使其与被提升vCPU的虚拟运行时之间的差值小于一个阈值。这样,宿主机调度器(如CFS)更有可能选择被提升的vCPU,而不是重复调度引起PLE的vCPU,从而避免了宿主机调度器因追求公平性而忽略KVM提示的问题。
    • 优点:不干预宿主机调度器的核心公平性策略,允许宿主机调度器继续管理负载均衡,同时有效缓解了调度器不匹配带来的性能问题。
  2. 严格vCPU提升(Strict vCPU Boosting)

    • 解决问题:主要缓解"机会丢失"和"过度提升"问题。
    • 机制 :通过更严格地收集信息并选择候选vCPU进行提升。
      • IPI接收者提升:对于TLB Shootdown导致的自旋,它不仅提升已暂停的vCPU,还提升处于用户模式的IPI接收者vCPU,解决了"机会丢失"。
      • 精确提升:只有当IPI发送vCPU引起PLE事件时才提升IPI接收者,并且如果IPI接收者很可能已经响应了IPI,则不提升它,从而避免了"过度提升"。
      • 根据PLE原因选择:针对自旋锁和TLB Shootdown两种主要PLE原因,采用不同的候选vCPU选择规则,提升了选择的精确性。
    • 优点:通过更精细的控制,确保只有真正能解决当前自旋问题的vCPU才会被提升,大大减少了不必要的提升和因此带来的开销。

整体优势和效果:

  • 极小的代码修改量:仅41行代码的修改,体现了解决方案的优雅和高效。
  • 显著的性能提升:在某些PLE密集型基准测试中,性能提升高达80%。
  • 不影响公平性:解决方案不会损害KVM与其他应用程序以及不同VM之间的调度公平性。
  • 减少PLE事件:有效减少了vCPU过度自旋的发生次数。
  • VM无关(VM-agnostic):解决方案不需要修改客户机操作系统代码,保持了KVM作为VM无关虚拟机监控器的特性。

简而言之,该论文通过识别KVM调度器在应对vCPU过度自旋时的具体缺陷,并提出了两个轻量级但高度有效的机制(vCPU Debooster和Strict vCPU Boosting),从根本上解决了调度器不匹配、机会丢失和过度提升问题,从而显著提升了虚拟化环境下的性能。

相关推荐
Songxwn3 天前
VMware NSX 身份防火墙 - 基于终端用户的安全策略
vmware·虚拟化
段帅龙呀4 天前
vmware-vsphere 7.03部署流程
虚拟化·vsphere
sea_baby5 天前
虚拟交换机发展历程
网络·虚拟化·交换机
DeeplyMind19 天前
Guest → QEMU → Virglrenderer 调用逻辑分析
linux·驱动开发·虚拟化·virtio-gpu·virglrenderer
李一帆'23 天前
【Win11配置wsl2构建跨平台开发环境】
虚拟化·wsl
虚伪的空想家1 个月前
华为A800I A2 arm64架构鲲鹏920cpu的ubuntu22.04 tls配置直通的grub配置
ubuntu·华为·架构·虚拟化·kvm·npu·国产化适配
好记忆不如烂笔头abc2 个月前
虚拟机所需的硬件功能在目标主机上不受支持或已禁用:*长模式:对于支持64位客户机操作系统而言是必需的。
虚拟化
漫谈网络2 个月前
KVM创建的虚拟机,虚拟机的网卡是如何生成的
运维·服务器·网络·qemu·虚拟化·kvm
forestqq3 个月前
华为L420国产笔记本(统信UOS桌面专业版1070)安装openEuler2403虚拟机
运维·虚拟化·统信