KVM和TCG方案的QEMU对比(ARM架构)
1. KVM方案适配
1.1 环境准备
一台ARM架构的PC或服务器。
1.2 KVM简介
1.2.1 KVM架构图(ARM)
+-------------------+
| 用户空间应用 |
+-------------------+
|
+-------------------+
| QEMU |
+-------------------+
|
+-------------------+
| KVM模块 |
| (kvm.ko, kvm_arm) |
+-------------------+
|
+-------------------+
| Linux内核 |
+-------------------+
|
+-------------------+
| 硬件虚拟化 |
| (ARM VE / EL2) |
+-------------------+
1.2.2 ARM异常级别说明
EL0: 用户态应用 (User Application)
EL1: 内核态 (Guest OS Kernel)
EL2: 虚拟化层 (Hypervisor)
EL3: 安全监控 (Secure Monitor)
+--------+ KVM运行在EL2
| EL3 | 安全世界切换
+--------+
| EL2 | Hypervisor (Host Linux + KVM)
+--------+
| EL1 | Guest OS内核
+--------+
| EL0 | Guest应用
+--------+
1.3 QEMU使用KVM
1.3.1 在ARM架构的PC或服务器上编译QEMU
克隆QEMU仓库到本地:
git clone https://gitcode.com/openUBMC/qemu.git
cd qemu
mkdir -p build-kvm
cd build-kvm
../configure \
--target-list=aarch64-softmmu \
--enable-kvm \
--disable-docs \
--disable-werror
ninja -j"$(nproc)" qemu-system-aarch64
1.3.2 常用KVM参数
| 参数 | 说明 |
|---|---|
-enable-kvm |
启用KVM加速 |
-cpu host |
使用宿主机CPU特性(ARM上推荐) |
-cpu cortex-a57 |
指定模拟CPU型号(TCG模式) |
-machine virt,gic-version=host |
使用宿主机GIC版本 |
-smp n |
指定虚拟CPU数量 |
-m size |
指定内存大小 |
1.4 KVM方案验证
1.4.1 验证KVM是否生效
在编译出来的build目录下,执行以下指令:
./qemu-system-aarch64 -accel help
./qemu-system-aarch64 -machine help | grep hi1711
grep -E 'CONFIG_ARM_GIC_KVM|CONFIG_OPENUBMC_HI1711' aarch64-softmmu-config-devices.mak
预期输出包含:
Accelerators supported in QEMU binary:
kvm
tcg
hi1711 Hi1711 Boards (Cortex-A55)
CONFIG_ARM_GIC_KVM=y
CONFIG_OPENUBMC_HI1711=y
CONFIG_OPENUBMC_HI1711_BOARD=y
1.4.2 KVM验证流程
开始
|
v
+---------+---------+
| 检查ARM VE支持? |
+---------+---------+
|
+------+------+
| |
是 否
| |
v v
+------+-----+ +----+----+
| 继续配置 | | 提示错误 |
+------+-----+ +---------+
|
v
+------+------+
| 加载KVM模块 |
+------+------+
|
v
+------+------------------+
| 启动QEMU with -enable-kvm |
+------+------------------+
|
v
+------+-------+
| 运行状态正常? |
+------+-------+
|
+----+----+
| |
是 否
| |
v v
+----+ +--+------+
|成功| |排查问题 |
+----+ +---------+
2. TCG方案说明
2.1 TCG简介
2.1.1 什么是TCG
TCG(Tiny Code Generator)是QEMU内置的动态二进制翻译器,通过软件方式模拟CPU指令执行。
工作原理:
+------------------+
| Guest代码 |
| (ARM/AArch64) |
+------------------+
|
v
+------------------+
| TCG前端 |
| (解码ARM指令) |
+------------------+
|
v
+------------------+
| TCG中间表示 |
| (TCG Ops) |
+------------------+
|
v
+------------------+
| TCG后端 |
| (生成Host代码) |
+------------------+
|
v
+------------------+
| Host代码执行 |
| (ARM/其他架构) |
+------------------+
2.1.2 TCG特点
| 特点 | 说明 |
|---|---|
| 纯软件实现 | 无需硬件虚拟化支持 |
| 跨架构模拟 | 可在ARM上运行x86、RISC-V等 |
| 性能较低 | 相比KVM性能有明显差距 |
| 兼容性好 | 可在任何支持的平台上运行 |
| 调试友好 | 支持GDB调试、指令跟踪 |
2.1.3 ARM TCG支持的目标架构
| 目标架构 | 说明 |
|---|---|
| aarch64 | ARM64 (AArch64) |
| arm | ARM32 |
| x86_64 | x86 64位 |
| riscv64 | RISC-V 64位 |
| mips | MIPS |
2.2 TCG使用场景
2.2.1 适用场景
| 场景 | 说明 |
|---|---|
| 跨架构开发 | 在ARM Host上运行x86/RISC-V等程序 |
| 嵌入式开发 | 模拟ARM嵌入式设备环境 |
| 旧ARM硬件支持 | 在不支持VE的旧ARM CPU上运行 |
| 安全研究 | 需要精确指令模拟的安全分析 |
| 教学演示 | 虚拟化技术原理教学 |
| 内核调试 | 支持详细的指令级调试 |
2.2.2 TCG vs KVM 使用场景对比
| 对比项 | KVM | TCG |
|---|---|---|
| 性能 | 高 | 低 |
| 架构 | 同架构(ARM) | 跨架构支持 |
| 依赖 | ARM VE (EL2) | 无依赖 |
| 精确度 | 硬件级 | 指令级 |
| 调试 | 一般 | 详细支持 |
3. 性能对比
3.1 测试环境
克隆QA仓库并运行测试脚本:
git clone https://gitcode.com/openUBMC/QA.git
cd QA
bash Test_Code/Robot_Framework/run_performance.sh
3.2 测试环境与资源统计
| 指标类别 | 详情参数 | 数值/配置 |
|---|---|---|
| Host Spec | 操作系统 (OS) | Linux 5.10.0-182.0.0.95.oe2203sp3.aarch64 |
| CPU (Physical/Logical) | 160C / 320T | |
| 内存总量 (Total RAM) | 124.1 GB | |
| QEMU Usage | 峰值 CPU 使用率 | 4.54 Cores |
| 平均 CPU 使用率 | 1.01 Cores | |
| 峰值物理内存 (RSS) | 1482.32 MB | |
| 峰值虚拟内存 (VMS) | 5413.52 MB |
3.3 启动阶段耗时 (Boot Phase)
| 测试项 | KVM | TCG | 性能比 |
|---|---|---|---|
| IPMI | 94.55s | 404.71s | 4.3x |
| Redfish | 81.75s | 410.59s | 5.0x |
| SSH | 60.53s | 414.28s | 6.8x |
| Telnet | 16.25s | 56.54s | 3.5x |
| Web | 80.63s | 410.03s | 5.1x |
启动耗时对比图:
IPMI KVM ████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 94.55s
TCG ████████████████████████████████████████████ 404.71s
Redfish KVM ███████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 81.75s
TCG ████████████████████████████████████████████ 410.59s
SSH KVM ██████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 60.53s
TCG ████████████████████████████████████████████ 414.28s
Telnet KVM ██░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 16.25s
TCG █████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 56.54s
Web KVM ███████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 80.63s
TCG ████████████████████████████████████████████ 410.03s
└─────────────────────────────────────────────────
0s 100s 200s 300s 450s
3.4 接口响应耗时 (API Response)
| 测试项 | KVM | TCG | 性能比 |
|---|---|---|---|
| IPMI_Raw_0x06_0x01 | 0.012s | 0.204s | 17x |
| IPMI_Sdr_List | 0.144s | 3.239s | 22x |
| Redfish_ChassisBoards | 0.018s | 0.543s | 30x |
| Redfish_SystemOverview | 0.166s | 26.759s | 161x |
| SSH_Busctl_tree_maca | 0.05s | 0.451s | 9x |
| SSH_Ipmcget_d_v | 0.25s | 9.264s | 37x |
| Web_Info_Product | 0.015s | 0.197s | 13x |
| Web_Maintenance_Alarm | 0.003s | 0.027s | 9x |
接口响应耗时对比图:
Redfish_SystemOverview
KVM █░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 0.166s
TCG ████████████████████████████████████████████ 26.759s
SSH_Ipmcget_d_v
KVM █░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 0.25s
TCG ████████████████████████████████████████████ 9.264s
IPMI_Sdr_List
KVM █░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 0.144s
TCG ████████████████████████████████████████████ 3.239s
Redfish_ChassisBoards
KVM █░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 0.018s
TCG ████████████████████████████████████████████ 0.543s
SSH_Busctl_tree_maca
KVM █░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 0.05s
TCG ████████████████████████████████████████████ 0.451s
└─────────────────────────────────────────────────
0s 5s 10s 20s 30s
3.5 存储性能 (Storage I/O)
| 测试项 | KVM (MB/s) | TCG (MB/s) | 性能比 |
|---|---|---|---|
| /data Read | 3571.43 | 9.63 | 371x |
| /data Write | 1250.0 | 8.05 | 155x |
| /mockdata Read | 3703.7 | 10.19 | 363x |
| /mockdata Write | 1265.82 | 10.71 | 118x |
存储性能对比图:
/data Read
KVM ████████████████████████████████████████████ 3571.43 MB/s
TCG █░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 9.63 MB/s
/data Write
KVM ██████████████████████████████████░░░░░░░░░░ 1250.0 MB/s
TCG █░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 8.05 MB/s
/mockdata Read
KVM ████████████████████████████████████████████ 3703.7 MB/s
TCG █░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 10.19 MB/s
/mockdata Write
KVM ██████████████████████████████████░░░░░░░░░░ 1265.82 MB/s
TCG █░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 10.71 MB/s
└─────────────────────────────────────────────────
0 500 1000 1500 2000 3000 4000 MB/s
耗时(秒)
450 │ ██████████████
│ ██████████████
400 │ ██████████████ TCG ~400s
│ ██████████████ (IPMI/Redfish/SSH/Web)
350 │ ██████████████
│ ██████████████
300 │ ██████████████
│ ██████████████
250 │ ██████████████
│ ██████████████
200 │ ██████████████
│ ██████████████
150 │ ██████████████
│ ████████████ ██████████████
100 │ ████████████ KVM ~95s ██████████████
│ ████████████ (IPMI) ██████████████
80 │ ████████████ ██████████████
│ ████████ ████████████ ██████████████
60 │ ████████ ████████████ KVM ~60s ██████████████
│ ████████ ████████████ (SSH) ██████████████
40 │ ████████ ████████████ ██████████████
│ ████████ ████████████ ████████
20 │ ██ ████████ ████████████ ████████ TCG ~56s
│ ██ KVM ~16s ████████████ ████████ (Telnet)
10 │ ██ (Telnet) ████████████ ████████
0 │──┴───────────┴────────────┴──────────┴─────────┴───
Telnet SSH Web/IPMI/Redfish Telnet
KVM TCG
### 3.4 接口响应耗时 (API Response)
| 测试项 | KVM | TCG | 性能比 |
|--------|------|------|--------|
| IPMI_Raw_0x06_0x01 | 0.012s | 0.204s | 17x |
| IPMI_Sdr_List | 0.144s | 3.239s | 22x |
| Redfish_ChassisBoards | 0.018s | 0.543s | 30x |
| Redfish_SystemOverview | 0.166s | 26.759s | 161x |
| SSH_Busctl_tree_maca | 0.05s | 0.451s | 9x |
| SSH_Ipmcget_d_v | 0.25s | 9.264s | 37x |
| Web_Info_Product | 0.015s | 0.197s | 13x |
| Web_Maintenance_Alarm | 0.003s | 0.027s | 9x |
**接口响应耗时对比图:**
耗时(秒)
30 │ ██████████████
│ ██████████████
25 │ ██████████████ TCG ~26.8s
│ ██████████████ (Redfish_SystemOverview)
20 │ ██████████████
│ ██████████████
15 │ ██████████████
│ ██████████████
10 │ ████████████████ ██████████████
│ ████████████████ ██████████████ TCG ~9.3s
8 │ ████████████████ ██████████████ (SSH_Ipmcget_d_v)
│ ████████████████ ██████████████
5 │ ████████████████ ██████████████
│ ████████████████ ██████████████
3 │ ████████ ████████████████ ██████████████
│ ████████ TCG ~3.2s ████████████████ ██████████████ TCG ~3.2s
2 │ ████████ (IPMI_Sdr) ████████████████ ██████████████ (IPMI_Sdr_List)
│ ████████ ████████████████ ██████████████
1 │ ████████ ████████████████ ██████████████
│ ▀ ████████████████ ██████████████
0.5 │ KVM ~0.14s ████████████████ ██████████████
│ ▀ ▀
0.2 │ KVM ~0.25s KVM ~0.17s
0.0 │──┴───────────────────┴────────────────────┴────────────┴──
IPMI_Sdr_List SSH_Ipmcget_d_v Redfish_SystemOverview
### 3.5 存储性能 (Storage I/O)
| 测试项 | KVM (MB/s) | TCG (MB/s) | 性能比 |
|--------|------------|------------|--------|
| /data Read | 3571.43 | 9.63 | 371x |
| /data Write | 1250.0 | 8.05 | 155x |
| /mockdata Read | 3703.7 | 10.19 | 363x |
| /mockdata Write | 1265.82 | 10.71 | 118x |
**存储性能对比图:**
带宽(MB/s)
4000 │ ██████████████████████████████████████████████████
│ ██████████████████████████████████████████████████
3500 │ ██████████████████████████████████████████████████ KVM ~3700MB/s
│ ██████████████████████████████████████████████████ (Read)
3000 │ ██████████████████████████████████████████████████
│ ██████████████████████████████████████████████████
2500 │ ██████████████████████████████████████████████████
│ ██████████████████████████████████████████████████
2000 │ ██████████████████████████████████████████████████
│ ██████████████████████████████████████████████████
1500 │ ██████████████████████████████████████████████████
│ █████████████████████████████
1250 │ █████████████████████████████ KVM ~1250MB/s
│ █████████████████████████████ (Write)
1000 │ █████████████████████████████
│ █████████████████████████████
750 │ █████████████████████████████
│ █████████████████████████████
500 │ █████████████████████████████
│ ██
50 │ ██ TCG ~10MB/s
│ ██ (Read/Write)
10 │ ██
0 │──┴──────┴──────────────────────┴───────────────────┴──
TCG KVM(Write) KVM(Read)
### 3.6 性能对比总结
#### 性能差异原因分析
| 因素 | KVM | TCG |
|------|-----|-----|
| 指令执行 | 直接在ARM硬件上执行 | 软件翻译执行 |
| 异常级别切换 | 硬件EL1/EL2切换 | 软件模拟 |
| 中断处理 | GIC硬件加速 | 软件模拟GIC |
| 内存访问 | Stage-2页表硬件支持 | 软件管理 |
| 定时器 | ARM虚拟定时器 | 软件模拟 |
#### 性能对比汇总
| 测试类型 | KVM优势倍数 | 说明 |
|----------|-------------|------|
| 启动耗时 | 4-7倍 | 平均启动时间显著缩短 |
| 接口响应 | 9-161倍 | 复杂接口差异更明显 |
| 存储I/O | 118-371倍 | 硬件加速带来巨大优势 |
## 4. 方案选择建议
### 4.1 KVM适用场景
| 场景 | 推荐理由 |
|------|----------|
| 生产环境虚拟化 | 性能接近原生,稳定可靠 |
| ARM云服务器 | 业界主流方案 |
| 嵌入式虚拟化 | ARM VE硬件支持 |
| 高性能计算 | 硬件加速,低延迟 |
| 服务器整合 | 资源利用率高 |
| 密集型应用 | CPU/内存/IO需求高 |
### 4.2 TCG适用场景
| 场景 | 推荐理由 |
|------|----------|
| 跨架构开发 | ARM Host运行x86/RISC-V等 |
| 嵌入式模拟 | 模拟特定ARM硬件环境 |
| 安全研究 | 指令级精确控制 |
| 教学/学习 | 无需ARM VE硬件支持 |
| CI/CD测试 | 无依赖环境搭建 |
| 内核调试 | 详细的指令级调试支持 |
### 4.3 选择建议
#### 决策流程图
开始选择
|
v
+--------+--------+
| 需要跨架构模拟? |
+--------+--------+
| |
是 否
| |
v v
+-------+ +-----+------+
| TCG | | 支持ARM VE |
+-------+ +-----+------+
| |
是 否
| |
v v
+-------+ +-------+
| KVM | | TCG |
+-------+ +-------+
### 4.4 ARM虚拟化特殊考虑
| 考虑点 | KVM要求 | 说明 |
|--------|---------|------|
| GIC版本 | GICv2/v3/v4 | 中断控制器虚拟化支持 |
| SMMU | IOMMU支持 | 设备直通需要 |
| 电源管理 | PSCI支持 | 虚拟机电源管理 |
| 定时器 | 虚拟定时器 | 高精度时钟 |
## 5. 总结
### 5.1 方案对比一览表
| 对比项 | KVM | TCG |
|--------|-----|-----|
| 性能 | ★★★★★ | ★★☆☆☆ |
| 兼容性 | ★★★☆☆ | ★★★★★ |
| 易用性 | ★★★★☆ | ★★★★☆ |
| 架构支持 | ARM同架构 | 多架构支持 |
| 硬件依赖 | ARM VE (EL2) | 无 |
| 调试支持 | 一般 | 详细 |
| 适用场景 | 生产环境 | 开发测试 |
### 5.2 结论
根据测试结果,KVM方案在各项性能指标上均显著优于TCG方案:
- **启动性能**:KVM启动耗时约为TCG的1/4到1/7
- **接口响应**:KVM响应速度约为TCG的9-161倍
- **存储I/O**:KVM吞吐量约为TCG的118-371倍
**建议**:
- 生产环境优先选择KVM方案,可提供接近原生的性能体验
- 开发测试场景可选择TCG方案,无需硬件虚拟化支持,部署更灵活
- 跨架构模拟场景必须使用TCG方案
---
**参考资料:**
- QEMU官方文档: https://www.qemu.org/docs/
- KVM ARM官方文档: https://www.kernel.org/doc/Documentation/virtual/kvm/arm/
- ARM虚拟化架构: https://developer.arm.com/architectures
- TCG设计文档: https://wiki.qemu.org/Documentation/TCG