Проверена скорость работы дисковой системы при хранении образов в общей хранилке с подключением по 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 для случайных операций.