home

Производительность системы хранения для Proxmox: сервер CIFS против Ceph SSD и Ceph HDD, а также разница между использованием LXC и QEMU

Проверена скорость работы дисковой системы при хранении образов в общей хранилке с подключением по CIFS. Также она сравнивается с ранее измеренной скоростью работы Ceph.

Конфигурация[править]

Две конфигурации. Одна для FIO с тестированием NAS/HCI и вторая для SYSBENCH, где и кластер Ceph расширен с 3 до 5.

Сервер хранилища[править]

  • 2x Xeon E5-2690 (8C/16T 3ГГц на процессор)
  • 194 GB ОЗУ
  • 1G Ethernet
  • HDD: adaptec 71605Q
  • Oracle Linux 8 с ZFS и Samba
  • Хранение: на контроллере Adaptec с 1ГБ ОЗУ и 12 HDD 3 ТБ HGST экспортированы как простые тома, на них из ОС создается ZFS RAIDZ3 c ashit=12 (4к). Дополнительно на контроллере включается MaxCache3.0 на двух SSD 480 ГБ Kingstone E50 в RAID1 с writeback на контроллере (т.е. вся запись идет на SSD и лишь затем на HDD, SSD суммарным объемом 480 ГБ используется как кеш на чтение и запись для ZFS и при всем времени теста емкость тестовых данных вмещалась в SSD).

Хост[править]

5 серверов с одинаковой конфигурацией, на которых есть как локальный HDD, так и Ceph с двумя пулами, один на HDD и второй на SSD. Для тестов FIO использовались только 3 сервера в кластере с фактором репликации в 3.

  • 2x Xeon X5650 (6C/12T 2.5 ГГц на процессор);
  • 92 GB ОЗУ;
  • 1G Ethernet;
  • Proxmox 7.0-11;
  • Контроллер HP 410i без кеша на SSD, но с writeback;
  • local SSD: 1x480GB 2.5" Sata3 Kingstone 50E в качестве OSD Ceph;
  • local HDD: 3x300GB 2.5" 10k SAS в качестве OSD Ceph;
  • local HDD: 1x300GB 2.5" 10k SAS в качестве локальной системы хранения.

Виртуальная машина[править]

Oracle Linux 8 QEMU4/KVM 10 ГБ ОЗУ 100 ГБ диск qcow2 с включенным сжатием

Образ виртуальной машины находится на общей хранилке, поключенной по CIFS/Samba.

Методика тестирования[править]

С помощью fio запускаются тесты на случайные чтение и записи по 4k и последовательные чтение-запись на 1М с большой очередью в 64 операции.

Тесты запускаются на самой хранилке (local native), с хоста на удаленной хранилке (remove native) и из виртуальной машины (remote qcow2). Нас интересует средняя латентность, пропускная способность и IOPS.

Для проведения тестирования надо задать папку, в которой будут тестовые файлы. Примеры ниже.

Хранилка: TEST_DIR=/tank/proxmox/test/fio

Proxmox: TEST_DIR=/mnt/pve/cifs-storage/test/fio

ВМ: TEST_DIR=/tmp/fio

Кроме пропускной способности (bandwith) и IOPS измеряем латентность.

Также данные нормируем. local native по факту пишет со скоростью локального SSD, поэтому на эту скорость нормируем IOPS и приводим их относительно local native(но это плохо при чтении из ОЗУ). Также раз у нас пропускная способность канала 128 МБ/c, на неё нормируем пропускную способность

Результаты FIO[править]

Для учета влияния задержек в сети, латентность с хоста на хранилку пингками по 4к составила 0.3 мс.

Последовательная запись 1M[править]

fio --name=write_throughput --directory=$TEST_DIR --numjobs=8 --size=10G --time_based --runtime=60s --ramp_time=2s --ioengine=libaio --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write --group_reporting=1
system bandwith avg, (MB/s) latency avg, (msec) IOPS avg iops normalized bw / (128 MB/s)
CIFS, local native 700 732 694 1 5,47
CIFS, remote QEMU 275 2740 274 0,39 2,15
CIFS, remote native 111 4144 111 0,16 0,87
Ceph SSD, LXC 181 6624 177 0,26 1,41
Ceph HDD, LXC 133 6947 129 0,19 1,04
Local HDD, LXC 167 2632 166 0,24 1,30
Ceph SSD, QEMU 125 7074 118 0,17 0,98
Ceph HDD, QEMU 120 10690 114 0,16 0,94
Local HDD, QEMU 300 3464 296 0,43 2,34
Ceph SSD LXC/QEMU 1,50 QEMU в полтора раза медленнее на SSD
Ceph HDD LXC/QEMU 1,13 на HDD разница не существенна
Ceph LXC SSD/HDD 1,36 В Ceph SSD только на треть быстрее HDD
QEMU (CIFS remote) / (Ceph SSD) 2,32 Ceph SSD оказался медленнее удалённого CIFS в 2 раза

При последовательной записи QEMU сжала диск и поэтому пропускная способность больше пропускной способности сети (в 128 МБ/c) и видимо по этой же причине ниже латентность.

Т.е. использование сжатия на уровне образа ускоряет последовательную запись сжимаемых данных.

В целом SSD значительного преимущества не даёт, а от нативной производительности хранилки остаётся от 16 до 39%.

Случайная запись 4k[править]

fio --name=write_iops --directory=$TEST_DIR --size=10G --time_based --runtime=60s --ramp_time=2s --ioengine=libaio --direct=1 --verify=0 --bs=4K --iodepth=64 --rw=randwrite --group_reporting=1
system bandwith avg, (MB/s) latency avg, (msec) IOPS avg iops normalized bw / (128 MB/s)
CIFS, local native 26 10 6586 1 0,20
CIFS, remote QEMU 9 213 2410 0,37 0,07
CIFS, remote native 0,7 332 193 0,03 0,01
Ceph SSD, LXC 20 12 5169 0,78 0,16
Ceph HDD, LXC 21 11 5400 0,82 0,16
Local HDD, LXC 3,2 77 829 0,13 0,03
Ceph SSD, QEMU 25 80 6412 0,97 0,20
Ceph HDD, QEMU 3,2 621 829 0,13 0,03
Local HDD, QEMU 5 378 1291 0,20 0,04
Ceph SSD LXC/QEMU 0,81 видимо за счёт сжатия QEMU оказался на 20% быстрее LXC
Ceph HDD LXC/QEMU 6,51 для HDD LXC существенно быстрее QEMU
Ceph LXC SSD/HDD 0,95 в Ceph на случайное записи разницы между HDD и SSD существенной нет
QEMU (CIFS remote) / (Ceph SSD) 0,38 Ceph оказался быстрее CIFS

Случайная удалённая запись в QEMU раза в три медленнее по IOPS/MB и в 20 по латентности по сравнению с нативной скоростью общей хранилки.

Удивительно, но при случайной записи в Ceph разницы между SSD и HDD не наблюдается. Можно предположить, что это из-за записи через журнал и так как при линейной записи разница SSD/HDD не слишком велика, SSD особого прироста не даёт.

Последовательное чтение 1M[править]

fio --name=read_throughput --directory=$TEST_DIR --numjobs=8 --size=10G --time_based --runtime=60s --ramp_time=2s --ioengine=libaio --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read --group_reporting=1
system bandwith avg, (MB/s) latency avg, (msec) IOPS avg iops normalized bw / (128 MB/s)
CIFS, local native 9149 56 9149 1 72
CIFS, remote QEMU 11143 47 11137 1,22 87
CIFS, remote native 119 4661 116 0,01 0,93
Ceph SSD, LXC 18551 28 18648 2,04 145
Ceph HDD, LXC 18247 28 18242 1,99 145
Local HDD, LXC 156 2512 155 0,02 1,22
Ceph SSD, QEMU 10439 49 10435 1,14 81,55
Ceph HDD, QEMU 170 18480 164 0,02 1,33
Local HDD, QEMU 118 5111 115 0,01 0,92
Ceph SSD LXC/QEMU 1,79 Чтение из ОЗУ смысла сравнивать нет
Ceph HDD LXC/QEMU 111,23 Чтение из памяти сравнивать смысла нет
Ceph LXC SSD/HDD 1,02 Чтение из памяти сравнивать смысла нет
QEMU (CIFS remote) / (Ceph SSD) 1,07 Данные нет смысла сравнивать, а отсутствие разницы объясняется, что чтение и в том и в другом случае шло из ОЗУ

Видно, что и QEMU и нативное чтение на хранилке идут из ОЗУ. ZFS видимо игнорирует direct-чтение. Причем QEMU читает не из ОЗУ сетевой хранилки, а из собственной памяти.

А вот удаленное чтение из хоста оказывается медленным.

Случайное чтение 4k[править]

fio --name=read_iops --directory=$TEST_DIR --size=10G --time_based --runtime=60s --ramp_time=2s --ioengine=libaio --direct=1 --verify=0 --bs=4K --iodepth=64 --rw=randread --group_reporting=1
system bandwith avg, (MB/s) latency avg, (msec) IOPS avg iops normalized bw / (128 MB/s)
CIFS, local native 580 0,006 149427 1 4,53
CIFS, remote QEMU 117 11 30183 0,20 0,91
CIFS, remote native 1,2 202 318 0,0021 0,01
Ceph SSD, LXC 1216 205 311347 2,08 9,50
Ceph HDD, LXC 660 0,3 168969 1,13 5,16
Local HDD, LXC 3 85 760 0,01 0,02
Ceph SSD, QEMU 61 33 15735 0,11 0,48
Ceph HDD, QEMU 2,3 587 900 0,01 0,02
Local HDD, QEMU 1,6 1097 473 0,0032 0,01
Ceph SSD LXC/QEMU 19,79 Чтение из ОЗУ сравнивать смысла нет
Ceph HDD LXC/QEMU 187,74 Чтение из ОЗУ сравнивать смысла нет
Ceph LXC SSD/HDD 1,84 Чтение из ОЗУ сравнивать смысла нет
QEMU (CIFS remote) / (Ceph SSD) 1,92 Сравнивать смысла нет так как чтение из ОЗУ

Результаты опять неадекватные.

Выводы по FIO[править]

Тестам на чтение доверять нельзя, так как в действительности оно может идти из ОЗУ.

По записи удивительно то, что на сжимаемых данных QEMU может оказаться быстрее аналогичной записи из хоста. Это можно связать с особенностями архитекторы qcow2.

При последовательной записи Ceph в 2 раза медленнее удалённого хранения CIFS, но только если в QEMU используется сжатие. Локальный жесткий диск даёт производительность сравнимую с Ceph SSD и может превосходить запись по сети на SSD.

При случайной записи по 4k Ceph оказался быстрее удалённого хранилища по CIFS. Можно предположить, что это в результате того, что один из OSD Ceph оказывается локальным диском и оверхед Ceph при записи на локальный диск оказывается меньше оверхеда на запись по сети на CIFS. Но при случайных операциях на Ceph существенной разницы между SSD и HDD нет при использовании LXC, но есть разница в 6 раз при использовании QEMU. Можно предположить, что это из-за большого оверхеда QEMU на случайных записях.

Методика по SYSBENCH[править]

Методика вместе с результатами по Ceph взята из https://elibsystem.ru/node/546, но дополнена результатами по NAS через CIFS.

Результаты по SYSBENCH[править]

Последовательная запись 1 поток[править]

sysbench --file-total-size=1G --file-num=1 --time=100 --file-test-mode=seqwr --threads=1 fileio run 
system bandwith avg, (MB/s) latency avg, (msec) IOPS avg iops normalized bw / (128 MB/s)
CIFS, local native 355 0,05 21488 1 2,77
CIFS, remote QEMU 326 0,05 20880 0,97 2,55
CIFS, remote native 89 0,17 5722 0,27 0,70
Ceph SSD 28 0,55 1803 0,08 0,22
Ceph HDD 25 0,62 1596 0,07 0,20
local HDD 174 0,09 11129 0,52 1,36

Видимо SYSBENCH пишет хорошо сжимаемые данные и они настолько хорошо жмутся, что QEMU их пишет почти на скорости локального хранилища и запись упирается в возможности хранилки, при этом формально превышая скорость подключения к хранилке по Ethernet в 120 МБ/c.

Ceph SSD и Ceph HDD оказались малоразличимы между собой, при этом их задержка примерно в три раза больше задержки записи хоста по CIFS и во столько же раз ниже IOPS/bandwith.

Интересно, что локальный диск обогнал сетевые хранилища даже с SSD.

Последовательное чтение 1 поток[править]

sysbench --file-extra-flags=direct --file-total-size=1G --file-num=1 --time=100 --file-test-mode=seqrd --threads=1 fileio run
system bandwith avg, (MB/s) latency avg, (msec) IOPS avg iops normalized bw / (128 MB/s)
CIFS, local native 3503 0 224219 1 27,37
CIFS, remote QEMU 154 0,1 9874 0,04 1,20
CIFS, remote native 29 0,53 1886 0,01 0,23
Ceph SSD 18 0,85 1180 0,01 0,14
Ceph HDD 16 1 1003 0,0045 0,13
local HDD 151 0,1 9633 0,04 1,18

Нативная скорость чтения хранилки показала скорость обмена с ОЗУ (3.5 ГБ/c) и 224 тыс. IOPS на чтение.

QEMU опять хорошо сжался и превысил скорость канала и опять опередил в 6 раз несжатую скорость хоста.

Ceph SSD/HDD опять аутсайдеры и опять мало отличаются между собой.

Локальный диск по случайному совпадению оказался близок к работе QEMU.

Последовательная запись 10 потоков[править]

sysbench --file-extra-flags=direct --file-total-size=10G --file-num=10 --time=100 --file-test-mode=seqwr --threads=10 fileio run
system bandwith avg, (MB/s) latency avg, (msec) IOPS avg iops normalized bw / (128 MB/s)
CIFS, local native 337 0,42 21589 1 2,63
CIFS, remote QEMU 16 8,93 1018 0,05 0,13
CIFS, remote native 95 1,49 6110 0,28 0,74
Ceph SSD 5,52 25,7 353 0,02 0,04
Ceph HDD 5,37 26,3 344 0,02 0,04
local HDD 135 1,0 8647 0,40 1,05

Локальная запись на хранилке опять уперлась в 21 тыс. IOPS.

QEMU сильно просел и оказался в 6 раз медленнее скорости записи хоста по сети.

Ceph SSD/HDD опять показал самый низкий результат со смешными 350 IOPS и латентностью как у HDD.

Локальный диск опередил сетевую запись.

Последовательное чтение 10 потоков[править]

sysbench --file-extra-flags=direct --file-total-size=10G --file-num=10 --time=100 --file-test-mode=seqrd --threads=10 fileio run 
system bandwith avg, (MB/s) latency avg, (msec) IOPS avg iops normalized bw / (128 MB/s)
CIFS, local native 4179 0,04 267511 1 32
CIFS, remote QEMU 118 1,32 7591 0,03 0,92
CIFS, remote native 110 1,41 7065 0,03 0,86
Ceph SSD 170 0,9 10930 0,04 1,33
Ceph HDD 58 2,7 3714 0,01 0,45
local HDD 154 1,0 9854 0,04 1,20

Чтение на хранилище идет из ОЗУ на скорости 4 ГБ.

QEMU и чтение хоста по сети показывают близкие результаты примерно на скорости интерфейса.

Ceph SSD впервые в тесте значительно отличается от Ceph HDD (в 3 раза), но при этом Ceph SSD лишь немного опережает локальный HDD.

То, что Ceph SSD больше 120 МБ/c можно объяснить тем, что часть данных считалось с локального OSD.

Случайная запись 10 потоков[править]

sysbench --file-total-size=10G --file-num=10 --time=100 --file-test-mode=rndrw --threads=10 --file-rw-ratio=0 fileio run 
system bandwith avg, (MB/s) latency avg, (msec) IOPS avg iops normalized bw / (128 MB/s)
CIFS, local native 76 1,87 4838 1 0,59
CIFS, remote QEMU 56 2,54 3574 0,74 0,44
CIFS, remote native 61 2,32 3905 0,81 0,48
Ceph SSD 52 2,7 3337 0,69 0,41
Ceph HDD 47 3,0 3002 0,62 0,37
local HDD 24 5,9 1534 0,32 0,19

Максимальная скорость здесь у хранилища при локальном чтении дисков, но только лишь 76 МБ/c при 4838 IOPS. Т.е. уперлись в систему хранения даже не смотря на использование SSD-кеша на запись.

Производительность QEMU и хоста при работе с сетью несколько меньше и сравнимы с Ceph SSD.

Явным аутсайдером является только локальный HDD, но и он смог выдать 1.5 тыс. IOPS, что неплохо для одиночного жесткого диска.

Случайное чтение 10 потоков[править]

sysbench --file-extra-flags=direct --file-total-size=10G --file-num=10 --time=100 --file-test-mode=rndrw --threads=10 --file-rw-ratio=100 fileio run 
system bandwith avg, (MB/s) latency avg, (msec) IOPS avg iops normalized bw / (128 MB/s)
CIFS, local native 1958 0,08 125358 1 15
CIFS, remote QEMU 118 1,3 7590 0,06 0,92
CIFS, remote native 109 1,41 7000 0,06 0,85
Ceph SSD 114 1,35 8100 0,06 0,89
Ceph HDD 15 10,3 948 0,01 0,12
local HDD 6,1 23,2 391 0,0031 0,05

Для чтения с хранилки опять читаем из ОЗУ.

QEMU, чтение хоста по сети и Ceph SSD опять оказались близки друг к другу и работают примерно на скорости сети.

Чтение с HDD хоть с Ceph HDD, хоть с локального HDD оказалось очень медленным, всего 6015 МБ/c, что типично для HDD при случайных операциях.

Выводы по SYSBENCH[править]

Поведение при случайных операциях и последовательных принципиально отличается.

При случайных операциях QEMU, Ceph SSD, обращение с хоста по сети выдают близкие результаты. Локальный HDD оказывается аутсайдером, а Ceph HDD оказывается быстрее локального HDD, видимо за счет распараллеливания запросов.

При последовательном чтении такого единства нет и QEMU может читать из ОЗУ даже при флаге DIRECT, а локальный жесткий диск может превосходить сетевые по скорости и даже подключенные по сети SSD.

Для ряда задач уперлись в скорость сети, также следует обращать внимание на латентность и переход на 10G может не только снять ограничение там где скорости близки к 120 МБ/c, но и снизить латентность и повысить IOPS для случайных операций.