Эндрю Таненбаум, автор Minix, исчерпывающе объяснил в своих работах отличие гипервизоров 1 и 2 типа, однако очень сложно найти в свободном доступе примеры работ, где показано, насколько они отличаются по производительности. Поэтому мы попробуем самостоятельно в лабораторных условиях развернуть гипервизоры 1 и 2 типа и сделать выводы.
Приведем для удобства схему:

Из этой схемы может сложиться мнение, что у гипервизора 1 типа нету операционной системы вообще, а у гипервизора 2 типа больше уровней абстракции и он медленнее. Поэтому для тестирования возьмем два популя��ных гипервизора: VmWare (1 тип) и Qemu (2 тип) и тестирование проведем на одном и том же железе.
Конфигурация лаборатории:
Intel(R) Xeon(R) CPU E3 1260L @ 2.40GHz
Samsung 8GiB 2x SODIMM DDR3 Synchronous 1333 MHz (0.8 ns)
SSD Kingston A400 960GB SA400S37960GB
План тестирования:
Установим гипервизоры
Развернем виртуальную машину на Ubuntu 22.04 LTS
Установим sysbench
Запустим sysbench на 2 часа несколько раз чтобы учесть погрешность
Сравним показатели для гипервизоров 1 и 2 типа
Версии:
# uname -a Linux lab 5.15.0-78-generic #85-Ubuntu SMP Fri Jul 7 15:25:09 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux # sysbench --version sysbench 1.0.20 (using system LuaJIT 2.1.0-beta3)
Как установить sysbench и запустить тесты:
# apt install sysbench # sysbench cpu run --time=7200 # sysbench mem run --time=7200 # sysbench threads run --time=7200 # sysbench mutex run --mutex-num=1000000
Ниже - подробности о том как выглядит вывод тестов и как его можно интерпретировать на примере коротких минутных тестов.
В тесте процессора (cpu) нас интересует показатель events per second:
# sysbench cpu run --time=60 sysbench 1.0.20 (using system LuaJIT 2.1.0-beta3) Running the test with following options: Number of threads: 1 Initializing random number generator from current time Prime numbers limit: 10000 Initializing worker threads... Threads started! CPU speed: events per second: 971.72 General statistics: total time: 60.0002s total number of events: 58308 Latency (ms): min: 1.00 avg: 1.03 max: 5.41 95th percentile: 1.08 sum: 59984.24 Threads fairness: events (avg/stddev): 58308.0000/0.00 execution time (avg/stddev): 59.9842/0.00
В тесте производительности последовательных операций чтения/записи в оперативную память (memory) нас интересует показатель Total operations per second:
# sysbench memory run --time=60 sysbench 1.0.20 (using system LuaJIT 2.1.0-beta3) Running the test with following options: Number of threads: 1 Initializing random number generator from current time Running memory speed test with the following options: block size: 1KiB total size: 102400MiB operation: write scope: global Initializing worker threads... Threads started! Total operations: 104857600 (4915856.94 per second) 102400.00 MiB transferred (4800.64 MiB/sec) General statistics: total time: 21.3283s total number of events: 104857600 Latency (ms): min: 0.00 avg: 0.00 max: 0.92 95th percentile: 0.00 sum: 9664.85 Threads fairness: events (avg/stddev): 104857600.0000/0.00 execution time (avg/stddev): 9.6648/0.00
В тесте на производительность планировщика потоков (threads) нас интересует total number of events разделенный на total time:
# sysbench threads run --time=60 sysbench 1.0.20 (using system LuaJIT 2.1.0-beta3) Running the test with following options: Number of threads: 1 Initializing random number generator from current time Initializing worker threads... Threads started! General statistics: total time: 60.0006s total number of events: 52132 Latency (ms): min: 1.12 avg: 1.15 max: 5.85 95th percentile: 1.21 sum: 59984.32 Threads fairness: events (avg/stddev): 52132.0000/0.00 execution time (avg/stddev): 59.9843/0.00
В mutex тестах нас интересует execution time на фиксированном количестве мьютексов, чтобы тест был подольше - можем увеличивать их количество в параметре mutex-num:
# sysbench mutex --mutex-num=10000000 run sysbench 1.0.20 (using system LuaJIT 2.1.0-beta3) General statistics: total time: 4.7313s total number of events: 1 Latency (ms): min: 4731.14 avg: 4731.14 max: 4731.14 95th percentile: 4768.67 sum: 4731.14 Threads fairness: events (avg/stddev): 1.0000/0.00 execution time (avg/stddev): 4.7311/0.00
Напишем скрипт и запустим его в tmux, оставим гипервизор и виртуальную машину работать на пару дней, периодически проверяя, не закончились ли тесты.
Результаты сравнения тестов cpu и memory:
sysbench cpu run | sysbench memory run | |||||
vmware | qemu | разница | vmware | qemu | разница | |
тест 1 | 968.97 | 994.61 | +2.5% | 4783.77 | 4757.06 | -0.5% |
тест 2 | 973.11 | 995.48 | +2.2% | 4783.65 | 4762.45 | -0.4% |
тест 3 | 971.62 | 994.66 | +2.3% | 4741.35 | 4762.03 | -0.5% |
тест 4 | 970.13 | 994.68 | +2.4% | 4790.76 | 4761.68 | -0.6% |
среднее | +2.35% | среднее | -0.50% | |||
Результаты сравнения тестов threads и mutex:
sysbench threads run | sysbench mutex run | |||||
vmware | qemu | разница | vmware | qemu | разница | |
тест 1 | 831.25 | 884.90 | +6.1% | 24.6M | 24.5M | -0.4% |
тест 2 | 826.54 | 948.81 | +12.8% | 25.4M | 25.2M | +0.7% |
тест 3 | 864.86 | 911.74 | +5.1% | 24.5M | 24.7M | -0.8% |
тест 4 | 862.94 | 925.23 | +6.7% | 25.1M | 24.9M | -0.8% |
среднее | +7.6% | среднее | -0.3% | |||
Интересно, получается, что гипервизор 2 типа Qemu в режиме host-passthrough ничуть не уступил гипервизору 1 типа VMWare.
P.S. Данная статья является исследованием, в котором может быть определенная погрешность от перегрева CPU (поэтому тесты выполнялись "на холодную" с предварительным охлаждением процессора до номинальной температуры чтобы избежать включения троттлинга, а также контролем температуры по sensors на гипервизоре), но проведенные тесты ответили на главный вопрос, и показывают, что OpenSource гипервизоры 2 типа Qemu не особо уступают в производительности гипервизорам 1 типа, при этом, мы не касаемся вопросов сложности их настройки, развертывания, автоматизации и тонкого тюнинга.
