qemu与qemu-kvm:一些性能测量

17

我在qemu和qemu-kvm上进行了以下基准测试,使用了以下配置:

CPU: AMD 4400 process dual core with svm enabled, 2G RAM
Host OS: OpenSUSE 11.3 with latest Patch, running with kde4
Guest OS: FreeDos
Emulated Memory: 256M
Network: Nil
Language: Turbo C 2.0
Benchmark Program: Count from 0000000 to 9999999. Display the counter on the screen
     by direct accessing the screen memory (i.e. 0xb800:xxxx)

在QEMU中运行只需要6秒。

但是在QEMU-KVM中运行需要89秒。

我一个一个地运行了基准测试,没有并行运行。

我整夜都在苦思冥想,但仍然不知道为什么会出现这种情况。谁能给我一些提示吗?


这只是我的想法,客户机操作系统是FreeDos。根据理论,qemu使用TCG将发送给客户机操作系统的每个指令转换为主机操作系统可以理解的指令。另一方面,带有kvm的qemu直接向主机操作系统发送指令并执行它们,因此在理论上,带有kvm的qemu必须更快。但我认为这也取决于所使用的客户机操作系统。可能kvm正在尝试直接将指令发送到主机操作系统以执行,但实际上没有这样做,而是通过TCG路由进行,就像计划中的qemu命令一样。请更新。 - Vinay Prabhakaran
3个回答

15

KVM使用qemu作为设备模拟器,任何设备操作都是通过用户空间的QEMU程序来模拟的。当您写入0xB8000时,图形显示被激活,这涉及到客户机从客户机模式执行CPU“vmexit”并返回到KVM模块,后者再将设备模拟请求发送给用户空间的QEMU后端。

相比之下,没有KVM的QEMU在统一进程中完成所有工作,除了通常的系统调用外,CPU上下文切换更少。同时,您的基准代码是一个简单的循环,只需要进行一次代码块翻译,与KVM情况下每次迭代的vmexit和内核用户通信相比,成本几乎为零。

这应该是最可能的原因。


1

你的基准测试是一个IO密集型的基准测试,对于qemu和qemu-kvm来说,所有的io设备实际上都是相同的。在qemu的源代码中,这可以在hw/*中找到。

这解释了为什么qemu-kvm与qemu相比不必太快。然而,我对这种减速没有特别的答案。我有以下解释,我认为在很大程度上是正确的。

“qemu-kvm模块使用linux内核中的kvm内核模块。这在x86客户机模式下运行客户机,这会导致每个特权指令都会触发陷阱。相反,qemu使用非常高效的TCG,它会在第一次看到指令时翻译它们。我认为,陷阱的高成本在你的基准测试中表现出来了。”虽然这并不适用于所有的io设备。Apache基准测试在qemu-kvm上运行得更好,因为该库进行缓冲并使用最少数量的特权指令来执行IO。


0
原因是发生了太多的VMEXIT。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接