Qemu vs qemu-kvm: некоторые измерения производительности

Я провел следующий тест в 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)

Это занимает всего 6 секунд при работе в qemu.

Но при работе в qemu-kvm требуется 89 секунд.

Я запускал тест один за другим, а не параллельно.

Я почесал голову всю ночь, но до сих пор не знаю, почему это происходит. Кто-нибудь даст мне несколько советов?

Ответ 1

KVM использует qemu в качестве своего симулятора своего устройства, любая операция устройства имитируется программой QEMU пользовательского пространства. Когда вы пишете 0xB8000, работает графический дисплей, который включает в себя гостевой режим, выполняющий CPU `vmexit 'из гостевого режима и возвращающийся в модуль KVM, который, в свою очередь, отправляет запросы моделирования моделирования на пространство пользователя QEMU.

Напротив, QEMU без KVM выполняет все задания в унифицированном процессе, за исключением обычных системных вызовов, меньше коммутаторов контекста процессора. Между тем, ваш тестовый код представляет собой простой цикл, который требует только code block translation всего один раз. Это ничего не стоит по сравнению с vmexit и связью ядра с каждой итерацией в случае KVM.

Это должна быть самая вероятная причина.

Ответ 2

Ваш бенчмарк - это интенсивный тест уровня ввода-вывода, и все io-устройства на самом деле одинаковы для qemu и qemu-kvm. В исходном коде qemu это можно найти в hw/*.

Это объясняет, что qemu-kvm не должен быть очень быстрым по сравнению с qemu. Однако у меня нет конкретного ответа на замедление. У меня есть следующее объяснение для этого, и я думаю, что это правильно в значительной степени.

"Модуль qemu-kvm использует модуль ядра kvm в ядре linux. Это запускает гостевой режим в гостевом режиме x86, который вызывает ловушку для каждой привилегированной инструкции. Наоборот, qemu использует очень эффективный TCG, который переводит инструкции, которые он видит в первый раз. думаю, что высокая стоимость ловушки проявляется в ваших тестах". Однако это не относится ко всем io-устройствам. Тест Apache будет работать лучше на qemu-kvm, потому что библиотека выполняет буферизацию и использует наименьшее количество привилегированных инструкций для ввода IO.

Ответ 3

Причиной является слишком много VMEXIT.