基于KVM的QEMU性能测试

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

简单点来讲,就是在鲲鹏服务器上可以做到性能倍增,同时基于测试,基本上可以1台2P机型同时运行30个左右的qemu环境,可以使用这种方式来大批量运行基于qemu的自动化测试用例。

halo,这个基于什么系统的,