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 秒。

我一个一个地运行基准测试,而不是并行运行。

我整晚都在挠头,但仍然不知道为什么会发生这种情况。有人会给我一些提示吗?

4

3 回答 3

15

KVM 使用 qemu 作为他的设备模拟器,任何设备操作都是由用户空间的 QEMU 程序模拟的。当您写入 0xB8000 时,图形显示被操作,这涉及到客户从客户模式执行 CPU `vmexit' 并返回到 KVM 模块,然后 KVM 模块将设备模拟请求发送到用户空间 QEMU 后端。

相比之下,QEMU w/o KVM 除了通常的系统调用外,在统一进程中完成所有工作,CPU 上下文切换更少。同时,您的基准代码是一个简单的循环,只需要code block translation一次。vmexit与KVM 案例中每次迭代的内核-用户通信相比,这没有任何成本。

这应该是最可能的原因。

于 2012-10-08T09:31:11.180 回答
1

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

这说明 qemu-kvm 与 qemu 相比一定不会很快。但是,对于经济放缓,我没有特别的答案。我对此有以下解释,我认为在很大程度上是正确的。

“qemu-kvm 模块使用 linux 内核中的 kvm 内核模块。这会在 x86 来宾模式下运行来宾,这会导致每个特权指令陷入陷阱。相反,qemu 使用非常高效的 TCG 来翻译它在“第一次。我认为陷阱的高成本正在你的基准测试中出现。” 但并非所有 io 设备都是如此。Apache 基准测试将在 qemu-kvm 上运行得更好,因为该库执行缓冲并使用最少数量的特权指令来执行 IO。

于 2012-02-15T11:32:53.343 回答
0

原因是发生了太多的VMEXIT。

于 2013-08-12T03:43:02.547 回答