Гипервизоры 1 и 2 типа в фокусе перформанса

Эндрю Таненбаум, автор Minix, исчерпывающе объяснил в своих работах отличие гипервизоров 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 runsysbench memory run
vmwareqemuразницаvmwareqemuразница
тест 1968.97994.61+2.5%4783.774757.06-0.5%
тест 2973.11995.48+2.2%4783.654762.45-0.4%
тест 3971.62994.66+2.3%4741.354762.03-0.5%
тест 4970.13994.68+2.4%4790.764761.68-0.6%
среднее+2.35%среднее-0.50%

Результаты сравнения тестов threads и mutex:

sysbench threads runsysbench mutex run
vmwareqemuразницаvmwareqemuразница
тест 1831.25884.90+6.1%24.6M24.5M-0.4%
тест 2826.54948.81+12.8%25.4M25.2M+0.7%
тест 3864.86911.74+5.1%24.5M24.7M-0.8%
тест 4862.94925.23+6.7%25.1M24.9M-0.8%
среднее+7.6%среднее-0.3%

Интересно, получается, что гипервизор 2 типа Qemu в режиме host-passthrough ничуть не уступил гипервизору 1 типа VMWare.

P.S. В данном исследовании допускается наличие некоторой погрешности из-за возможного перегрева ЦПУ. Чтобы исключить влияние термального режима, тесты проводились после предварительного охлаждения процессора до номинальной температуры, предотвращая активацию режима снижения частоты, и с контролем температуры через sensors на гипервизоре. Проведенные эксперименты достаточно наглядно ответили на ключевой вопрос: OpenSource гипервизоры второго типа, такие как Qemu, демонстрируют схожую производительность с гипервизорами первого типа. При этом мы оставляем в стороне вопросы, связанные с сложностью настройки, развертывания, автоматизации и точной настройки параметров.

Источник

Translate »
 
Чат Telergram

Привет, готов ответить на Ваши вопросы

Открыть чат
1
Отсканируйте код
Здравствуйте!
Возможно я могу Вам чем-то помочь?