// VIRTUALIZATION · REAL-TIME

虚拟化的代价
确定性

Hypervisor 在硬件和操作系统之间插入了一层抽象。这一层带来了灵活性,但也引入了新的延迟源和干扰。理解并测量这些开销,是实时虚拟化的核心挑战。

VM World Switch · 虚拟机世界切换开销 LIVE

什么是 Hypervisor 实时性?

Hypervisor 实时性是指在虚拟化环境中,为实时 Guest OS 提供可预测、低延迟的执行环境的能力。核心矛盾在于:虚拟化通过 trap-and-emulate 和时间片轮转实现资源共享,而这些机制本身就是非确定性的来源

虚拟化引入的额外软件层

每一层都意味着额外的延迟开销。中断从硬件到达 Guest ISR,必须穿过 Hypervisor 层。

Guest Application
运行在 VM 内的用户态实时应用
Ring 3 · User
+0 μs
Guest OS Kernel
Guest 操作系统内核,管理虚拟硬件
Ring 0 · Guest
+1~5 μs
↓ VM Exit
Hypervisor
截获敏感指令、模拟设备、注入中断、调度 vCPU
Root Mode
+1~50 μs
↓ Hardware
Physical Hardware
CPU、中断控制器(GIC/APIC)、IOMMU、缓存
Physical
+0.5~5 μs
// 为什么虚拟化会影响实时性?三个根本原因: // 1. Trap 开销:Guest 执行特权指令时触发 VM Exit, // Hypervisor 截获并模拟,然后 VM Entry 返回 —— 整个过程耗时 1~10μs // 2. 中断虚拟化:物理中断先到 Hypervisor,由它决定 // 何时、以何种方式注入给哪个 Guest —— 增加延迟和抖动 // 3. 资源共享干扰:多个 VM 共享 CPU 缓存、内存带宽、 // TLB —— 一个 VM 的行为可能破坏另一个 VM 的实时性

实时 Hypervisor 的三种架构

不同的虚拟化架构对实时性有根本不同的影响。分区式架构提供了最强的隔离但牺牲了灵活性;完全虚拟化则相反。

TYPE 1 · 裸金属

Hypervisor 直接运行在硬件上

Hypervisor 本身就是一个精简的内核,直接管理硬件资源。没有宿主操作系统的开销,实时性可控。这是实时虚拟化的主流选择。

代表:Xen、ACRN、PikeOS、QNX Hypervisor
实时性:★★★★☆ 取决于 Hypervisor 调度器设计
TYPE 2 · 寄宿型

Hypervisor 作为宿主 OS 的模块

Hypervisor 依赖宿主 OS 的驱动和调度。宿主 OS 的行为会直接影响实时性。通常需要 PREEMPT_RT 补丁才能接近实时。

代表:KVM (Linux)、VirtualBox
实时性:★★☆☆☆ 受宿主 OS 调度器制约
PARTITION · 静态分区

硬件资源静态划分,无共享

不做时间片调度,将 CPU 核、内存、设备物理分区给不同 Guest。Hypervisor 只做启动和隔离,运行时几乎不干预 —— 最接近裸机的实时性。

代表:Jailhouse、SCS (Safety Critical System)
实时性:★★★★★ 几乎零虚拟化开销
PARA · 半虚拟化

Guest 感知虚拟化,主动协作

Guest OS 被修改以直接与 Hypervisor 通信,避免昂贵的 trap-and-emulate。减少 VM Exit 次数,提升实时性,但要求修改 Guest 内核。

代表:Xen PV Guest、virtio
实时性:★★★★☆ 减少 trap 开销

世界切换:虚拟化的隐形成本

VM Exit/Entry(世界切换)是虚拟化的基本操作。每次 Guest 触发特权操作或收到中断时,CPU 必须从 Guest 模式切换到 Hypervisor 模式,处理完毕后再切回来。这个切换的代价通常在 1~10μs

速度
Guest 运行
Hypervisor 处理 (VM Exit)
世界切换开销
中断注入
Idle
模拟时间
0.00 ms
VM Exit 次数
0
平均 VM Exit 开销
— μs
最坏情况
— μs

VM Entry/Exit 延迟

Tswitch = Tvmexit + Thandle + Tvmentry

从 CPU 触发 VM Exit(如 Guest 执行 HLT、访问 MMIO、或外部中断到达)到 VM Entry 返回 Guest 恢复执行的总时间。硬件辅助虚拟化(Intel VT-x / ARM VHE)将切换开销降到约 1~2μs。

影响因素:CPU 架构、寄存器保存/恢复数量、TLB 刷新、中断控制器虚拟化方式。

1~10 μs/次

内存虚拟化开销(EPT/NPT)

Tmem_access = Tguest_walk + TEPT_walk

Guest 虚拟地址 → Guest 物理地址 → Host 物理地址的两次转换。EPT(Intel)/ NPT(AMD)Walk 在 TLB Miss 时需要额外 4 次内存访问。Page Fault 时的 VM Exit 开销可达 10~50μs。

这是虚拟化环境延迟抖动的主要来源之一。使用大页(HugePages)可减少 TLB Miss。

TLB Hit: ~0 / Miss: +4 次额外访存

中断注入:从物理信号到 Guest ISR

在非虚拟化环境中,中断直达 CPU 的 ISR。在虚拟化环境中,中断的路径被拉长了:物理中断 → Hypervisor 截获 → vGIC/vAPIC 处理 → VM Entry → Guest ISR。每一步都增加延迟。

点击步骤查看详情
1

物理中断到达

外设发出中断信号,到达物理中断控制器(GIC/APIC)。硬件开始仲裁。

0.1~0.5 μs
2

触发 VM Exit

CPU 从 Guest 模式退出到 Hypervisor 模式(Root Mode)。保存 Guest 寄存器状态。

0.5~2 μs
3

Hypervisor 中断处理

Hypervisor 读取中断控制器,识别中断源,决定路由到哪个 Guest vCPU。

1~5 μs
4

虚拟中断注入

Hypervisor 通过 vGIC(ARM)或 Posted Interrupt(Intel)将虚拟中断标记到 Guest 的虚拟中断控制器。

0.5~3 μs
5

VM Entry(返回 Guest)

恢复 Guest 寄存器状态,CPU 切回 Guest 模式。Guest 检测到虚拟中断挂起。

0.5~2 μs
6

Guest ISR 执行

Guest OS 中断向量分发,执行 ISR。到这里才等价于裸机环境的中断延迟起点。

0.5~2 μs
裸机中断延迟
~3 μs
虚拟化额外延迟
+3~14 μs
总中断延迟
6~17 μs
延迟倍数
2~6×

吵闹邻居:跨 VM 的隐性干扰

即使 CPU 核被独占分配(pinned),共享的硬件资源——特别是 L3 缓存和内存带宽——仍然是跨 VM 干扰的渠道。一个高负载 VM 可以通过污染缓存来破坏另一个 VM 的实时性,即使它们运行在不同的 CPU 核上。

切换隔离选项,观察 RT VM 延迟变化

隔离选项(实时可切换)

CPU 核独占(CPU Pinning) 将 RT VM 的 vCPU 绑定到专用物理核,不允许其他 VM 使用
缓存分区(Cache Coloring / CAT) 使用 Intel CAT 或 ARM MPAM 将 L3 缓存分区,防止跨 VM 缓存污染
内存带宽限制(MB throttling) 限制非 RT VM 的内存带宽使用,保证 RT VM 的带宽
中断隔离(Interrupt Remapping) 将物理设备中断直接路由到 RT VM,绕过 Hypervisor 干预
RT VM 平均延迟
— μs
RT VM 最坏延迟
— μs
抖动(max-avg)
— μs
干扰程度

干扰是如何发生的?

即使两个 VM 运行在不同的物理 CPU 核上(Core 0 和 Core 2),它们仍然共享 L3 缓存和内存控制器。Noisy VM 的密集内存访问会不断驱逐 RT VM 的缓存行,导致 RT VM 频繁遭遇缓存未命中。

⚠ 无缓存隔离

Core 0: [RT VM] ──── L1 ──┐
                      └── L3 Cache (共享) ── Memory
Core 2: [Noisy] ──── L1 ──┘
             ↑ Noisy 驱逐 RT 的数据

✓ 有缓存分区

Core 0: [RT VM] ──── L1 ──┐
                      ├── L3 Way 0-3 (RT) ── Memory
                      └── L3 Way 4-11 (Noisy) ──
Core 2: [Noisy] ──── L1 ──┘
             ↑ 各自独立,互不干扰

如何保证 RT VM 的实时性?

实时虚拟化的核心不是消除 Hypervisor 开销,而是隔离干扰。以下技术将共享资源变成专用资源,让 RT VM 尽可能接近裸机的执行环境。

CPU

CPU 核独占 + CPU亲和性

将特定物理核专用于 RT VM,Hypervisor 和其他 VM 不在这些核上调度。消除调度延迟和上下文切换开销。使用 isolcpuscpupool

CACHE

缓存着色 / CAT

Intel CAT(Cache Allocation Technology)或 ARM MPAM 将 L3 缓存按 way 分区。RT VM 独占部分 cache way,Noisy VM 无法污染。这是消除跨核干扰最有效的技术。

IRQ

中断直通(Passthrough)

使用 IRQFD / MSI 直通或 IOMMU 中断重映射,将设备中断直接路由到 Guest,绕过 Hypervisor 干预。需配合 VT-d / SMMU。

DEVICE

设备直通(VFIO / SR-IOV)

将物理 PCIe 设备直接分配给 RT VM,绕过 Hypervisor 的设备模拟层。消除 I/O 操作的 VM Exit。SR-IOV 允许设备级虚拟化分区。

MEM

内存分区 + 大页

为 RT VM 分配专用物理内存区域,使用 2MB/1GB 大页减少 TLB Miss。避免内存碎片导致的 EPT Walk 延迟。

SCHED

专用调度器(RTDS)

Xen RTDS(Real-Time Deferrable Server)调度器为 RT VM 提供保证的 CPU 时间预算。ACRN 使用基于优先级的调度。 Jailhouse 完全不做调度。

如何测量 Hypervisor 实时性?

测量 Hypervisor 实时性比裸机更复杂。你需要在 Guest 内部测量端到端延迟,同时能区分虚拟化开销干扰。核心策略:同时在 Host 和 Guest 中打时间戳。

METHOD 01

Guest 内 cyclictest

在 Guest VM 中运行标准的 cyclictest 工具。这是最简单的方法,测量 Guest 感知的端到端调度延迟,但无法区分延迟来自 Hypervisor 还是 Guest OS。

# 在 Guest VM 内运行 $ cyclictest -p 99 -m -t1 -i 1000 -d 0 -l 10000000 # 同时在 Host 和 Guest 中运行, # 对比两者的延迟差异 $ cyclictest --policy=fifo --priority=99 \ --interval=1000 --histogram=200
✓ 优势
  • 简单直接
  • 测量 Guest 感知延迟
  • 标准化工具
✗ 局限
  • 无法区分延迟来源
  • 有探针效应
  • 受 TSC 虚拟化影响
METHOD 02

GPIO 双端测量

在 Host 和 Guest 中各翻转一个 GPIO 引脚,用示波器同时测量两个信号。差值即为纯虚拟化开销。

// Host: 物理中断到达时翻转 GPIO_0 void host_irq_handler(int irq) { gpio_set(GPIO_0); inject_irq_to_guest(vcpu, irq); } // Guest: ISR 入口翻转 GPIO_1 void guest_isr(void) { gpio_set(GPIO_1); // Δt = GPIO_1 ↑ − GPIO_0 ↑ // 这就是虚拟化中断注入延迟 }
✓ 优势
  • 纳秒级精度
  • 可分离 Host/Guest 延迟
  • 零探针效应
✗ 局限
  • 需可编程 GPIO
  • 需要示波器
  • 引脚数有限
METHOD 03

干扰基准测试

在 RT VM 运行的同时,在另一个 VM 中运行内存压力测试(stress-ng/membw),测量 RT VM 延迟的变化。量化"吵闹邻居"效应。

# Noisy VM: 持续内存带宽压力 $ stress-ng --vm 4 --vm-bytes 1G \ --vm-method stream --timeout 60s & # RT VM: 同时测量延迟 $ cyclictest -p 99 -m -i 200 \ --histogram=500 -l 300000 # 对比有/无 Noisy VM 的延迟分布 # 差值即为干扰量化指标
✓ 优势
  • 量化干扰程度
  • 验证隔离效果
  • 贴近真实场景
✗ 局限
  • 耗时长
  • 干扰是概率性的
  • 难以复现极端情况
METHOD 04

硬件追踪 / 性能计数器

利用 CPU 硬件追踪功能(Intel PT / LBR、ARM CoreSight)和性能计数器(PMC)在不侵入代码的情况下精确测量 VM Exit/Entry 延迟。

# 使用 perf 测量 VM Exit 次数和耗时 $ perf stat -e 'vmx:vmexit' \ -e 'vmx:vmexit_reason' \ -e 'cache-misses' \ -- sleep 10 # Xen: 使用 xentrace 追踪调度事件 $ xentrace -e all trace.dump $ xenanalyze trace.dump > report.txt # 使用 PMC 精确计数 VM Exit 周期数 $ perf stat -e 'cycles-while-root' \ -e 'cycles-while-guest' -- sleep 10
✓ 优势
  • 周期级精度
  • 区分 Root/Guest 时间
  • 零探针效应
✗ 局限
  • 需硬件支持
  • 学习曲线陡
  • 工具链复杂

裸机 vs RTOS vs RT Hypervisor

在实时性方面,虚拟化永远无法超越裸机。但它提供了裸机无法提供的安全隔离和资源共享。关键问题不是"虚拟化有多慢",而是"虚拟化的开销是否在可接受范围内"。

指标裸机 / RTOSRT Hypervisor (优化后)标准 Hypervisor (KVM)
中断延迟1~5 μs5~20 μs50~500 μs
调度延迟< 20 μs10~50 μs100~1000+ μs
VM Exit/Entry 开销N/A1~5 μs/次5~20 μs/次
抖动(最坏情况)< 10 μs10~100 μs可达 ms 级
缓存干扰可隔离 (CAT)严重
内存访问延迟确定性EPT Walk 增加抖动显著抖动
设备 I/O直接访问直通 (VFIO)模拟/半虚拟化
隔离能力VM 级隔离VM 级隔离
安全认证依赖实现可认证 (DO-178C)难以认证
资源共享有限完整

主流实时 Hypervisor

以下是工业界使用的主要实时 Hypervisor,按隔离强度和实时性排序。

Jailhouse
PARTITION · ARM / x86 · 开源

静态分区 Hypervisor,由 Linux 启动后"分裂"CPU 核和设备。运行时 Hypervisor 几乎不运行,Guest 直接访问硬件。

中断延迟:+1~3 μs(接近裸机)
优势:极低开销、强隔离、代码量小(<10K LOC)
局限:无资源共享、需为每个 Guest 准备专用硬件
Xen + RTDS
TYPE 1 · x86 / ARM · 开源

RTDS(Real-Time Deferrable Server)调度器为 RT VM 提供保证的 CPU 预算。配合缓存着色和 CPU 绑定可获得稳定实时性。

中断延迟:+5~15 μs(优化后)
优势:成熟生态、支持直通、可调度多个 RT VM
局限:Hypervisor 仍需 CPU 时间、配置复杂
ACRN
TYPE 1 · x86 · 开源 (Intel)

Intel 为 IoT 和车载设计的轻量 Hypervisor。支持 I/O 直通、CPU 核分区、基于优先级的调度。专为混合关键性系统设计。

中断延迟:+3~10 μs
优势:Intel 深度优化、车载场景验证、支持 CAT
局限:仅限 x86、社区较小
QNX Hypervisor
TYPE 1 · ARM / x86 · 商业

BlackBerry 的实时 Hypervisor,基于 QNX Neutrino 微内核。支持安全认证(DO-178C DAL A、IEC 61508 SIL 4)。用于航空航天和汽车。

中断延迟:+5~12 μs
优势:安全认证、微内核架构、确定性调度
局限:商业许可、平台支持有限
PikeOS
TYPE 1 · ARM / x86 / SPARC · 商业

SYSGO 的分离微内核 Hypervisor,支持多级安全分区。通过最高等级安全认证(DO-178C DAL A、IEC 61508 SIL 4、Common Criteria EAL5+)。

中断延迟:+5~15 μs
优势:最高安全等级、支持 Linux/RTOS 混合
局限:商业许可、学习曲线陡
KVM + PREEMPT_RT
TYPE 2 · x86 / ARM · 开源

Linux 内核的 Hypervisor 模块,配合 PREEMPT_RT 补丁。适合"足够好"的软实时场景,但无法与 Type 1 的确定性相比。

中断延迟:+20~100 μs(优化后)
优势:生态最丰富、硬件兼容性最好、免费
局限:受 Linux 内核影响、抖动较大、难以硬实时

实时虚拟化的本质

实时 Hypervisor 不是让虚拟化变得和裸机一样快,而是在可接受的额外延迟范围内换取隔离和安全

决策框架:你什么时候需要实时 Hypervisor?

✓ 适合使用 RT Hypervisor

  • 需要在同一 SoC 上混合运行安全关键和非安全关键软件
  • 需要安全认证(汽车 ISO 26262、航空 DO-178C)
  • 需要隔离故障域(一个 VM 崩溃不影响其他 VM)
  • 额外 5~15μs 延迟在可接受范围内
  • 需要灵活的资源共享(GPU、网络、存储)

✗ 应直接使用裸机 / RTOS

  • 需要亚微秒级中断响应
  • CPU 资源极度有限(无空间运行 Hypervisor)
  • 系统功能单一,无需隔离
  • 硬实时要求且抖动必须 < 1μs
  • 极端带宽/功耗约束
// 黄金法则:分层延迟叠加 // 总中断延迟 = 物理中断传播 + VM Exit + Hypervisor 处理 + VM Entry + Guest ISR // // 裸机: IRQ → ISR = 1~5 μs // RT Hypervisor: IRQ → VMExit → Hyp → VMEntry → ISR = 6~20 μs // 标准 Hypervisor: 同上 + 调度延迟 + 缓存惩罚 = 50~500+ μs // // 每一层都必须被理解和量化。 // 实时虚拟化的艺术:在隔离和开销之间找到正确的平衡点。