QEMU VS QEMU-KVM: некоторые измерения производительности - PullRequest
16 голосов
/ 27 марта 2011

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

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

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

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

Ответы [ 3 ]

13 голосов
/ 08 октября 2012

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

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

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

0 голосов
/ 12 августа 2013

Причина в том, что происходит слишком много VMEXIT.

0 голосов
/ 15 февраля 2012

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

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

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

...