QEMU 模拟 ARM 虚拟机性能实测:银河麒麟 V10 在 8 核 i7 上的 IOPS 与启动耗时分析
QEMU 模拟 ARM 虚拟机性能实测:银河麒麟 V10 在 8 核 i7 上的 IOPS 与启动耗时分析
当我们需要在 x86 架构的硬件上运行 ARM 架构的操作系统时,QEMU 的跨架构模拟能力成为了关键技术方案。本文将基于 Intel i7-12700H 处理器和 32GB 内存的硬件环境,对银河麒麟 V10 SP2 ARM64 版本在 QEMU 虚拟机中的性能表现进行全面实测,重点分析磁盘 IOPS、启动耗时等关键指标,并与原生 x86 虚拟机进行对比,为技术选型提供数据参考。
1. 测试环境搭建与配置优化
在开始性能测试前,合理的环境配置是确保测试结果准确性的基础。我们的测试平台采用以下硬件配置:
- 处理器:Intel Core i7-12700H (14核20线程,最高睿频4.7GHz)
- 内存:32GB DDR4 3200MHz
- 存储:1TB NVMe SSD (读取速度3500MB/s,写入速度3000MB/s)
- 宿主机系统:Windows 10 专业版 21H2
QEMU 虚拟机的配置参数如下表所示:
| 配置项 | 参数值 |
|---|---|
| QEMU 版本 | 7.2.0 (2023年1月发布) |
| 模拟CPU类型 | cortex-a72 |
| 虚拟CPU核心数 | 8 vCPUs (sockets=4, cores=2) |
| 分配内存 | 8GB |
| 磁盘格式 | qcow2 (动态分配) |
| 虚拟磁盘大小 | 40GB |
| 网络模式 | user-mode networking with port forwarding |
为提高性能表现,我们进行了以下针对性优化:
- 启用多线程TCG加速:通过
--accel tcg,thread=multi参数启用多线程翻译,充分利用宿主机的多核性能。 - 使用virtio设备:磁盘和网络均采用virtio驱动,减少模拟开销。
- 调整CPU调度策略:在Windows宿主机上设置QEMU进程为高优先级。
- 关闭图形界面:安装完成后切换到命令行模式运行测试。
# 优化后的启动命令示例 qemu-system-aarch64.exe -m 8192 -cpu cortex-a72 --accel tcg,thread=multi \ -M virt -bios QEMU_EFI.fd -display none \ -device virtio-blk-device,drive=hd0 \ -drive if=none,file=kylindisk.qcow2,id=hd0,format=qcow2 \ -netdev user,id=net0,hostfwd=tcp::2222-:22 \ -device virtio-net-device,netdev=net02. 磁盘IOPS性能测试与分析
磁盘I/O性能是影响虚拟机使用体验的关键因素。我们使用FIO工具在银河麒麟虚拟机内进行了全面的磁盘基准测试,并与相同宿主机上的x86架构Ubuntu 22.04虚拟机(通过VirtualBox创建)进行对比。
2.1 测试方法与参数
测试采用以下统一参数:
- 测试文件大小:4GB
- 块大小:4K(模拟常见工作负载)
- 测试时长:60秒
- 队列深度:从1到32逐步增加
测试命令示例:
# 随机读测试 fio --name=randread --ioengine=libaio --rw=randread \ --bs=4k --size=4G --runtime=60 --time_based \ --numjobs=1 --iodepth={1,4,8,16,32} --direct=1 --group_reporting # 随机写测试 fio --name=randwrite --ioengine=libaio --rw=randwrite \ --bs=4k --size=4G --runtime=60 --time_based \ --numjobs=1 --iodepth={1,4,8,16,32} --direct=1 --group_reporting2.2 测试结果对比
下表展示了不同队列深度下的IOPS表现:
| 队列深度 | ARM(QEMU) 随机读(IOPS) | x86(VirtualBox) 随机读(IOPS) | ARM(QEMU) 随机写(IOPS) | x86(VirtualBox) 随机写(IOPS) |
|---|---|---|---|---|
| 1 | 3,214 | 28,547 | 2,856 | 24,892 |
| 4 | 5,782 | 76,431 | 4,923 | 68,745 |
| 8 | 7,645 | 89,256 | 6,432 | 82,341 |
| 16 | 8,921 | 92,847 | 7,856 | 88,932 |
| 32 | 9,123 | 93,152 | 8,124 | 89,745 |
从测试数据可以看出:
- QEMU模拟的ARM虚拟机IOPS性能显著低于原生x86虚拟机,随机读性能约为原生环境的9.8%-12.3%,随机写性能约为原生环境的9.5%-11.4%
- 随着队列深度增加,性能差距有所缩小,但在高队列深度下仍存在约10倍的性能差异
- 性能瓶颈主要出现在IOPS达到约9,000时,继续增加队列深度无法带来明显提升
提示:在实际使用中,建议将队列深度设置为8-16以获得最佳性价比,更高的队列深度虽然能略微提升性能,但会显著增加CPU开销。
3. 系统启动与响应时间测试
启动时间是衡量系统响应速度的重要指标。我们记录了从QEMU进程启动到系统完全可用(SSH服务响应)的时间,并与相同配置的x86虚拟机进行对比。
3.1 测试方法
- 冷启动时间:完全关闭虚拟机后重新启动,测量从执行启动命令到SSH端口响应的时间
- 热启动时间:在虚拟机运行状态下执行重启命令,测量从重启开始到SSH恢复响应的时间
- 服务响应时间:系统完全启动后,测量常见命令(如
ls -l /usr/bin)的执行时间
测试进行了10次迭代,去除最高和最低值后取平均。
3.2 测试结果
| 测试项 | ARM(QEMU) | x86(VirtualBox) | 性能差距 |
|---|---|---|---|
| 冷启动时间 | 4分23秒 | 32秒 | 722% |
| 热启动时间 | 2分51秒 | 18秒 | 850% |
ls -l响应时间 | 1.87秒 | 0.12秒 | 1458% |
apt update耗时 | 5分12秒 | 42秒 | 642% |
启动过程中的主要时间消耗点:
- UEFI固件初始化:约35秒(x86架构仅需3-5秒)
- 内核加载与初始化:约1分20秒(x86架构约8秒)
- 系统服务启动:约1分40秒(x86架构约15秒)
注意:测试发现,在QEMU中启用KVM加速(通过
--enable-kvm参数)对ARM模拟没有性能提升,因为KVM需要宿主和客户机使用相同架构。
4. CPU与内存性能基准测试
为全面评估性能表现,我们使用Sysbench对CPU和内存性能进行了测试,结果如下:
4.1 CPU性能测试
# CPU测试命令 sysbench cpu --cpu-max-prime=20000 --threads=1 run sysbench cpu --cpu-max-prime=20000 --threads=8 run| 测试配置 | ARM(QEMU) 耗时 | x86(VirtualBox) 耗时 | 性能差距 |
|---|---|---|---|
| 单线程计算 | 48.72秒 | 5.63秒 | 765% |
| 8线程并发计算 | 52.31秒 | 1.87秒 | 2698% |
4.2 内存性能测试
# 内存测试命令 sysbench memory --memory-block-size=1K --memory-total-size=10G run| 测试项 | ARM(QEMU) 操作速率 | x86(VirtualBox) 操作速率 | 性能差距 |
|---|---|---|---|
| 内存写入速度 | 1.23 GB/s | 14.56 GB/s | 1084% |
| 内存读取速度 | 1.45 GB/s | 15.23 GB/s | 950% |
测试结果表明,QEMU模拟的ARM环境在计算密集型任务上性能损失尤为明显,8线程测试中性能差距达到27倍。这主要是因为:
- 指令集转换带来的额外开销
- 内存访问需要通过软件模拟
- 多核同步的效率损失
5. 实际应用场景性能表现
为评估在实际工作负载下的性能,我们模拟了三种典型使用场景:
5.1 开发编译测试
使用Linux内核编译作为基准测试:
| 指标 | ARM(QEMU) | x86(VirtualBox) | 性能差距 |
|---|---|---|---|
| 内核配置生成时间 | 12分45秒 | 1分23秒 | 818% |
| 完整编译耗时 | 6小时22分 | 28分17秒 | 1255% |
| 增量编译耗时 | 47分12秒 | 3分45秒 | 1159% |
5.2 数据库性能测试
使用MySQL 8.0和sysbench进行OLTP测试:
sysbench oltp_read_write --db-driver=mysql --mysql-host=127.0.0.1 \ --mysql-user=root --mysql-password=test --mysql-db=sbtest \ --tables=10 --table-size=100000 --threads=8 --time=300 run| 指标 | ARM(QEMU) | x86(VirtualBox) | 性能差距 |
|---|---|---|---|
| 事务吞吐量(tps) | 86.4 | 1245.7 | 1342% |
| 平均延迟(ms) | 92.3 | 6.4 | 1342% |
| 95%延迟(ms) | 156.2 | 9.8 | 1494% |
5.3 Web服务性能测试
使用Nginx和wrk进行基准测试:
wrk -t8 -c100 -d60s http://localhost:8080/| 指标 | ARM(QEMU) | x86(VirtualBox) | 性能差距 |
|---|---|---|---|
| 请求吞吐量(RPS) | 1,243 | 32,456 | 2511% |
| 平均延迟(ms) | 80.4 | 3.1 | 2494% |
| 最大延迟(ms) | 1,245 | 12 | 10275% |
测试结果显示,在I/O密集型应用中,QEMU模拟的ARM环境性能差距进一步扩大,特别是在高并发场景下,延迟表现显著恶化。
