qemu 中文文档 下载 App

KVM 硬件加速原理与性能为什么好

KVM 是什么

KVM(Kernel-based Virtual Machine)是 Linux 内核提供的硬件虚拟化接口。它把 Linux 内核变成了一个虚拟机监控器(VMM),QEMU 通过 KVM 把 CPU 指令直接丢给硬件执行。

在 KVM 模式下,QEMU 的角色发生了根本性变化:它不再模拟 CPU,而是变成了设备管理器 + 状态协调器。这就是 KVM 模式下性能接近原生的根本原因。

三个组件

KVM 虚拟化涉及三个协作组件:

┌──────────┐    ioctl     ┌──────────┐   VMLAUNCH/VMXON   ┌────────────┐
│   QEMU   │ ──────────→ │ KVM 内核 │ ──────────────────→ │ CPU VT-x   │
│ (用户态)  │ ←────────── │  (内核态) │ ←────────────────── │ (硬件扩展)  │
└──────────┘              └──────────┘                    └────────────┘
  1. QEMU(用户态):创建设备、处理 I/O、管理虚拟机状态
  2. KVM 内核模块:暴露 /dev/kvm 设备文件,通过 ioctl 与 QEMU 交互
  3. CPU 硬件虚拟化扩展(VT-x/AMD-V):提供 VMXON、VMLAUNCH、VMEXIT 等指令

虚拟 CPU 运行流程

KVM 模式下的虚拟 CPU 执行流程:

  1. QEMU 通过 KVM_CREATE_VM ioctl 创建虚拟机
  2. 通过 KVM_CREATE_VCPU 创建虚拟 CPU 实例
  3. 通过 KVM_RUN ioctl 让 CPU 进入 VMXON 模式
  4. Guest 指令直接在物理 CPU 上执行(原生速度)
  5. 遇到敏感操作(IO、中断、页表修改)触发 VMEXIT
  6. CPU 回到宿主模式,QEMU + KVM 处理该事件
  7. 处理完后重新进入 VMXON,继续执行

关键洞察:Guest 的普通 CPU 指令(算术、内存访问、函数调用)完全不经过 QEMU——它们直接跑在物理核心上。只有涉及 I/O 和特权操作时才需要 QEMU 介入。

/dev/kvm 权限检查

KVM 能否工作,首先看 /dev/kvm 这个设备文件。

ls -la /dev/kvm
# crw-rw---- 1 root kvm 10, 232 Jun 15 10:23 /dev/kvm

任何一项不满足,KVM 就用不了。检查命令:

kvm-ok
# KVM acceleration can be used        ← 成功
# INFO: /dev/kvm does not exist        ← BIOS 没开 VT-x 或内核没装 kvm 模块
# Permission denied                    ← 用户不在 kvm 组

KVM 性能为什么好

用 KVM 的虚拟化性能通常是物理机的 85%~95%,原因有三点:

  1. CPU 指令原生执行:Guest 的算术/内存指令完全不翻译,直接跑在物理核心上
  2. 轻量 VMEXIT:现代 CPU 的 VMEXIT 延迟已降到微秒级
  3. VirtIO 设备:半虚拟化设备减少了 I/O 模拟开销

对比 TCG 模式,KVM 最大的优势是指令执行本身——TCG 每条指令都要翻译,KVM 直接执行。在计算密集型工作负载下,差距可以达到 10 倍以上。

何时 KVM 不可用

以下场景 KVM 不可用,会回退到 TCG:

回退到 TCG 会慢很多,但 QEMU 会自动处理,不会报错。

调优要点

mac 的 HVF 和 Windows 的 WHPX

macOS 的 Hypervisor.framework 和 Windows 的 WHPX 与 KVM 原理相同——都是操作系统提供的硬件虚拟化接口,QEMU 通过它们实现加速。

平台加速器内核模块说明
LinuxKVMkvm.ko + kvm-intel.ko / kvm-amd.ko最成熟,功能最全
macOSHVF内置于系统Apple Silicon 和 Intel 都支持
WindowsWHPXWindows 虚拟机平台功能需要 1803+ 版本
WindowsHAXMIntel 独立驱动Intel 已停止维护,不推荐

下一步

想把 KVM 跑起来?去 Linux 安装指南 一步步配置。