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

Приведем для удобства схему:

Гипервизоры 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

План тестирования:

  1. Установим гипервизоры

  2. Развернем виртуальную машину на Ubuntu 22.04 LTS

  3. Установим sysbench

  4. Запустим sysbench на 2 часа несколько раз чтобы учесть погрешность

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

Комментарии (13)


  1. Speccyfan
    23.08.2023 07:53
    +2

    Вы проверяли ваше железо на совместимость по VMware Compatibility Guide ?
    Какая версия ESXi использовалась ?
    Не указана модель материнсокй платы.
    Нет никаких тестов дисковой подсистемы, а в этом чаще больше проблем чем с CPU/RAM.


    1. dima_lvs Автор
      23.08.2023 07:53
      -1

      Согласен, что производительность дисковой подсистемы влияет на приложения сильнее, чем CPU/RAM, для тестов дисков потребовалось найти ещё железа, и когда я их прогнал (задействовав fio), то понял, что для одной статьи будет многовато. И с точки зрения чисел интересно прогнать не только диски, но и тесты баз данных, а также прогнать их не только на железе, но и на нескольких облачных площадках с разными типами "упакованных к продаже" виртуальных ресурсов, заглянув, в том числе, в финансовую сторону вопроса.

      По VMware Compatibility Guide проверялось, совместимо, а вот с точными версиями VMWare 6 и моделью я поспешил, отдав любезно предоставленное тестовое железо и решив, что эти данные не будут представлять практического интереса ;(


  1. mrobespierre
    23.08.2023 07:53
    +1

    Больше 15 лет назад устарело разделение на типы. Собственно тестирование это и подтвердило. Дело в том, что при поддержке на стороне железа (VT-x, AMD-V, iommu и т.д.) гости сразу работают с хостовым железом, даже если они гости гостей, вне зависимостей от уровня работы. Хотя рекламные брошюрки vmware со мной могут и не согласиться.


    1. dima_lvs Автор
      23.08.2023 07:53

      Да, один из вопросов, на который и хотелось получить ответ, и заключался в том, что производительнее, и правда ли 1 тип производительнее, как везде пишут, в том числе брошюрки VmWare. Хотелось получить числа, факты :)


  1. cat_chi
    23.08.2023 07:53
    +3

    Во-первых, QEMU – не гипервизор. Это платформа для эмуляции железа. Полагаю, вы его использовали в связке с KVM. А следовательно, вы сравнили производительность двух гипервизоров первого типа.

    Во-вторых... А к во-вторых мы перейдём, когда вы немного подтянете знания предметной области, извините.


    1. dima_lvs Автор
      23.08.2023 07:53
      -2

      Есть также мнение, что книги Таненбаума вредны, потому что всё очень быстро устаревает. Но перед тем как что-то сравнивать, я вынужден определить систему понятий, чтобы на это опираться, а у нас есть хост-система, внутри которой можно делать что угодно. Так что один раз с Таненбаумом уже кое-то поспорил, получился Linux.


      1. cat_chi
        23.08.2023 07:53

        Есть также мнение, что книги Таненбаума вредны, потому что всё очень быстро устаревает

        База какая-то нужна. Поэтому нет, не вредны.

        Но опираться только на них – ошибка. Как и в принципе опираться только на какую-то одну книгу.

        Хотите сравнить гипервизоры 1-го и 2-го типа – сравните, ну, с VirtualBox. Только убедитесь, что он не использует под капотом тот же KVM (я не знаю, умеет ли он вообще, но время не стоит на месте однако и он вроде развивается). И для надёжности отключите виртуализацию в биосе...


  1. Lazhu
    23.08.2023 07:53

    А теперь, взяв с полки пирожок, сравните весь этот зоопарк с bare metal


    1. dima_lvs Автор
      23.08.2023 07:53

      Да, это тоже сравнивалось, но показалось, что многовато для одной статьи, поэтому решил поделиться этими результатами в следующий раз, и не замешивать. Чтобы bare metal сравнить - нужен и более широкий диапазон тестов, и разные типы дисковых ресуров, чтобы прям получилось хорошо, да и за неделю такое не протестировать :)


  1. JohnSelfiedarum
    23.08.2023 07:53
    +3

    Товарищи учёные! Вы что-то путаете: согласно приведённой же картинке выше перечисленные гипервизоры оба первого типа. Второго типа - это получается контейнеры, LXC, docker и кубер впридачу. Ещё можно упомянуть такие штуки как Colinux и Stratovirt.


    1. dima_lvs Автор
      23.08.2023 07:53
      -1

      Мы просто продолжаем копаться дальше, используя классификацию, которая предложена Таненбаумом, Современные операционные системы 4 издания, стр. 535. K8s касаться не будем пока что вообще, сначала упоремся в вопрос наличия хост-системы, а также, в понятие гибридных гипервизоров, обладающих признаками как 1 так и 2 типа.


      1. cat_chi
        23.08.2023 07:53

        сначала упоремся в вопрос наличия хост-системы, а также, в понятие гибридных гипервизоров, обладающих признаками как 1 так и 2 типа

        Потом ещё паравиртуализацию вспомните. А потом забудьте всю эту информацию как бесполезную для чего-либо кроме истории ;)

        Классифицировать по наличию хост-системы – ошибка, т.к. этот фактор сейчас вообще ни на что не влияет. Это просто классификация по ложному критерию. Что-то полезное на ней построить не получится.


  1. mikegordan
    23.08.2023 07:53

    Я скажу свой "бенчмарк" , только у Vmware и двух последних версий ubuntu идеально работает графическое ускорение, тоесть развертка как у твоего монитора, плавная анимация и т.д. Тестировал две последние версии ubuntu на VB, абсолютно не то...