Эндрю Таненбаум, автор 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 типа, при этом, мы не касаемся вопросов сложности их настройки, развертывания, автоматизации и тонкого тюнинга.