RAID и RAID-контроллеры

Как тестировать производительность RAID: fio, IOPS и задержки

Практическая методика RAID benchmark: безопасный выбор target, профили fio, анализ IOPS, пропускной способности и хвостовых задержек.

16 минут
Продвинутый
абстрактная иллюстрация измерения производительности RAID-массива
Корректный RAID benchmark начинается не с команды fio, а с профиля реальной нагрузки и безопасного target. Тестируйте новый файл в специально выбранном каталоге либо пустой выделенный логический диск, несколько раз сохраняйте результаты и оценивайте не только IOPS или скорость, но и задержки, их перцентили и устойчивость после исчерпания кэшей. Тест массива показывает возможности слоя хранения при заданной нагрузке, но не заменяет нагрузочный тест СУБД, гипервизора или приложения.

Чек-лист перед RAID benchmark

  • Есть актуальная и проверенная резервная копия затрагиваемых данных. RAID не заменяет резервное копирование: подробнее — Почему RAID — не резервное копирование: защита данных сервера.
  • Массив находится в штатном состоянии: не деградирован, без предупреждений по дискам, контроллеру и защищённому кэшу.
  • Не выполняются Rebuild, фоновая инициализация, Consistency Check или Patrol Read.
  • Зафиксированы модель и прошивка контроллера, RAID-уровень, число и тип накопителей, размер stripe, политики чтения и записи, состояние защиты кэша, заполненность массива, версия ОС, ядра и fio.
  • Выбран безопасный target: новый файл или отдельный пустой логический диск. Физический диск — участник действующего RAID — никогда не является target для теста производительности массива.
  • На время теста отключены либо зафиксированы фоновые потребители: резервное копирование, индексация, репликация, антивирусная проверка, задачи СУБД, виртуальные машины и плановые операции хранения.

Тест может ухудшить работу сервиса

Даже безопасный тестовый файл создаёт реальную нагрузку на RAID-контроллер, накопители, шину и кэши. На рабочем сервере это способно увеличить задержки приложений. Планируйте benchmark на окно низкой нагрузки либо используйте отдельный стенд.

Что измеряют IOPS, bandwidth и задержки

IOPS — число завершённых операций ввода-вывода в секунду. Показатель полезен прежде всего для мелких операций фиксированного размера: например, случайного чтения по 4 KiB. Пропускная способность, которую fio обычно выводит как BW или bandwidth, показывает объём данных за секунду и важнее для последовательного чтения, резервного копирования, потоковой обработки и передачи больших файлов. Единицы нужно читать буквально: 1 MB равен 1 000 000 байт, а 1 MiB — 1 048 576 байтам. fio может показывать KiB/s, MiB/s и другие единицы, поэтому перед сравнением результаты приводят к одной системе.

Все метрики имеют смысл только вместе с параметрами профиля fio.

МетрикаЧто показываетКогда особенно важна
IOPSКоличество завершённых I/O в секунду при заданных блоке, очереди и параллелизмеСУБД, виртуальные машины, мелкие случайные операции
BandwidthПереданный объём данных за секундуПотоковое чтение и запись, бэкап, большие файлы
Средняя задержкаСреднее время выполнения I/OОбщая оценка отклика, но без оценки редких пауз
p95, p99, p99.9Задержка, ниже которой завершилась указанная доля операцийИнтерактивные сервисы, транзакции, ВМ, SLA

Среднее значение скрывает редкие, но заметные паузы. Если p99 записи составляет десятки или сотни миллисекунд, а средняя задержка мала, пользователь или СУБД всё равно могут видеть зависания. Для потоковой передачи данных обычно первична устойчивая BW; для базы данных и хранилища ВМ нужны IOPS, задержки чтения и записи по отдельности, а также хвостовые перцентили.

Сначала опишите профиль нагрузки

RAID производительность не выражается одним числом. Последовательные и случайные операции, размер блока, доля чтения, глубина очереди, число параллельных потоков и размер рабочего набора меняют результат радикально. iodepth и numjobs описывают создаваемую нагрузку, а не «скорость массива». При асинхронном движке iodepth=1 ограничивает каждый job одним незавершённым I/O, но несколько job всё равно создают несколько одновременных запросов. Сочетание iodepth=1 и numjobs=1 показывает отклик при минимальном параллелизме, а более высокие значения — работу при одновременном наплыве запросов.

1 MiB и 4 KiB — примеры стартовых блоков, а не универсальная норма.

СценарийСтартовый профиль fioЧто уточнить по приложению
Потоковое чтение или записьrw=read или rw=write, bs=1MРазмер файлов, число потоков, требуется ли подтверждённая запись
СУБД с мелкими страницамиrw=randread и rw=randwrite, bs=4kРазмер страницы СУБД, read/write ratio, фактическая очередь, fsync
Виртуальные машиныrw=randrw, bs=4k, например rwmixread=70Профиль datastore, число ВМ, пиковый параллелизм, блоки 4–64 KiB
Файловый серверОтдельно последовательный и случайный профилиРаспределение размеров файлов, SMB/NFS-клиенты, доля метаданных

Для смешанной нагрузки rw=randrw задаёт случайное чтение и запись, а rwmixread=70 означает 70% операций чтения и 30% операций записи. Если в наблюдаемой нагрузке на запись приходится 20% операций ввода-вывода, не выбирайте 70% чтений только потому, что это распространённый пример. Размер рабочего набора size должен быть сопоставим с активными данными приложения; слишком малый файл легко полностью помещается в кэш или повторно обслуживается одними областями носителя.

Выбор ioengine и очереди

На Linux для асинхронной нагрузки часто используют io_uring или libaio, но доступность и фактическая семантика зависят от версии fio, ядра и сборки. Проверьте их на тестируемом хосте командами fio --version и fio --enghelp. Синхронный движок, например sync, не обязательно создаст ожидаемое число одновременно выполняемых I/O только из-за высокого iodepth.

Безопасный тест RAID через новый файл

Тестирование нового файла fio

Этот вариант проверяет RAID вместе с файловой системой и её настройками. Он не затронет существующие файлы только при условии, что выбран новый уникальный путь и скрипт останавливается, если target уже существует. Для подготовки файла потребуется свободное физическое место на томе.

  1. 1
    Выберите отдельный каталог и проверьте место
    Создайте каталог только для benchmark на нужной файловой системе. Убедитесь, что df -h /srv/fio-benchmark показывает достаточно свободного места для size, а путь не ведёт к рабочему каталогу приложения. Для thin provisioning, снапшотов и CoW-файловых систем полная запись тестового файла может занять физическое место и увеличить расход snapshot-места сильнее, чем ожидается.
  2. 2
    Зафиксируйте версию и возможности fio
    Сохраните вывод fio --version и fio --enghelp. Синтаксис, JSON-вывод и доступность конкретного ioengine следует сверять с документацией именно установленной версии fio.
  3. 3
    Создайте и полностью запишите новый тестовый файл
    Выберите уникальное имя и до запуска проверьте, что такой файл или символическая ссылка не существуют. Полностью запишите заданный рабочий диапазон и продолжайте только после успешного завершения подготовки. Без этого чтение разрежённых или ещё не записанных областей может не отражать производительность RAID.
  4. 4
    Запустите измеряемые профили
    После подготовки выполните последовательное чтение и запись, случайные профили и смешанную нагрузку. Каждый профиль прогоните несколько раз с одинаковыми параметрами. Сохраняйте JSON отдельно для каждого запуска, включая неудачные результаты и выбросы: они могут показать влияние фоновых задач или кэша.
Подготовка каталога и проверка установленной fio. Команда не выполняет I/O benchmark.
mkdir -p /srv/fio-benchmark && df -h /srv/fio-benchmark && fio --version && fio --enghelp
fio-file-profiles.sh
set -euo pipefail

# Замените путь и размер после проверки каталога и свободного места.
TARGET=/srv/fio-benchmark/raid-bench-2026-09-25-01.dat
SIZE=100G

# Не разрешаем fio открыть и перезаписать уже существующий путь.
if [ -e "$TARGET" ] || [ -L "$TARGET" ]; then
    printf 'ОШИБКА: target уже существует: %s\n' "$TARGET" >&2
    exit 1
fi

# Полная подготовительная запись исключает чтение разрежённых или
# ещё не записанных областей. Это реальная нагрузка на весь диапазон SIZE.
fio --name=prepare-file \
    --filename="$TARGET" --size="$SIZE" \
    --rw=write --bs=1M --direct=1 \
    --ioengine=io_uring --iodepth=32 --numjobs=1 \
    --group_reporting=1 --output-format=json \
    --output=prepare-file.json

COMMON=(
    --filename="$TARGET"
    --size="$SIZE"
    --time_based=1
    --runtime=300
    --ramp_time=60
    --direct=1
    --ioengine=io_uring
    --iodepth=32
    --numjobs=1
    --group_reporting=1
    --randrepeat=0
    --output-format=json
)

# Последовательное чтение: 1 MiB
fio --name=seq-read "${COMMON[@]}" --rw=read --bs=1M \
    --output=seq-read.json

# Последовательная запись: 1 MiB; перезаписывает только тестовый файл
fio --name=seq-write "${COMMON[@]}" --rw=write --bs=1M \
    --output=seq-write.json

# Случайное чтение: 4 KiB
fio --name=rand-read-4k "${COMMON[@]}" --rw=randread --bs=4k \
    --output=rand-read-4k.json

# Случайная запись: 4 KiB; перезаписывает только тестовый файл
fio --name=rand-write-4k "${COMMON[@]}" --rw=randwrite --bs=4k \
    --output=rand-write-4k.json

# Смешанный профиль: 70% чтения, 30% записи
fio --name=rand-mix-4k "${COMMON[@]}" --rw=randrw --rwmixread=70 --bs=4k \
    --output=rand-mix-4k.json

time_based=1 заставляет fio выполнять нагрузку весь runtime, а не завершаться после однократного обхода size; ramp_time исключает начальный период из итоговой статистики. size=100G здесь одновременно задаёт рабочий диапазон файла и должен быть изменён под задачу. randrepeat=0 использует новый случайный шаблон между запусками; для строго повторяемого шаблона задайте фиксированный randseed и документируйте его.

direct=1 обычно запрашивает прямой I/O и уменьшает влияние page cache ОС, но его поведение зависит от ОС, файловой системы, драйвера и устройства. Это не универсальный обход всех кэшей: RAID-кэш, кэш контроллера накопителя и внутренние механизмы SSD остаются в пути. Не очищайте page cache штатной командой на рабочем сервере ради benchmark: это меняет состояние всей системы и может повлиять на сервисы.

Разрушающий тест выделенного логического диска

Пустой выделенный логический диск позволяет измерить блочный путь без влияния файловой системы. Это может быть отдельный Virtual Disk аппаратного RAID-контроллера или отдельное устройство программного RAID. Такой тест отвечает на другой вопрос, чем файл: он не отражает накладные расходы конкретной файловой системы, LVM, CoW или монтирования.

Запись на блочное устройство уничтожает данные

Команды fio с rw=write, rw=randwrite или rw=randrw на /dev/... разрушают прежнее содержимое указанного диапазона. Не применяйте их к системному диску, разделу с данными, LVM physical volume, устройству с файловой системой, действующему md-устройству с нужными данными и тем более к физическому диску — участнику массива.

Проверка target перед разрушающим тестом

Пример ниже ориентирован на Linux. Названия утилит и способ получения статуса аппаратного RAID зависят от производителя контроллера; до и после теста сохраните статус штатной утилитой вендора.

  1. 1
    Выберите устойчивый идентификатор
    Не используйте изменяемое имя вроде /dev/sdb. Найдите путь /dev/disk/by-id/..., соответствующий именно выделенному логическому диску, и сопоставьте его с серийным номером, WWN или идентификатором Virtual Disk в интерфейсе RAID.
  2. 2
    Проверьте дерево устройств, разделы и монтирование
    У выбранного target не должно быть разделов, точек монтирования и потомков с данными. Проверьте также, что устройство не используется LVM, device-mapper, multipath, контейнером или виртуальной машиной.
  3. 3
    Проверьте holders и сигнатуры
    Любой holder, файловая система, RAID-метаданные, LVM-метка или другая сигнатура — стоп-критерий до выяснения происхождения. Не удаляйте сигнатуры ради benchmark, если нет явного подтверждения, что устройство предназначено для уничтожающего теста.
  4. 4
    Подтвердите отсутствие нужных данных и принадлежность
    Сверьте target с конфигурацией контроллера или mdadm. Физические носители, входящие в действующий массив, исключите. Если массив, устройство или его история не ясны, не запускайте запись; при проблемах с конфигурацией RAID ориентируйтесь на Восстановление RAID после сбоя: что делать до изменений на дисках.
check-block-target.sh
# Подставьте только заранее подтверждённый устойчивый путь.
TARGET=/dev/disk/by-id/scsi-EXAMPLE_EMPTY_LOGICAL_DISK
DEV=$(readlink -f "$TARGET")

printf 'Target: %s -> %s\n' "$TARGET" "$DEV"
lsblk -o NAME,KNAME,TYPE,SIZE,FSTYPE,FSVER,LABEL,UUID,MOUNTPOINTS,PKNAME "$DEV"
findmnt -S "$DEV"
ls -la "/sys/class/block/$(basename "$DEV")/holders"
blkid "$DEV"
wipefs -n "$DEV"
cat /proc/mdstat

# Если используются device-mapper, LVM или multipath, проверьте также:
dmsetup ls --tree
pvs -o pv_name,vg_name,pv_size,pv_free

Как трактовать проверку

Пустой вывод findmnt сам по себе ничего не доказывает. Остановитесь, если lsblk показывает разделы или потомков, holders не пуст, wipefs -n или blkid находят сигнатуры, либо target фигурирует в mdadm, LVM, multipath или конфигурации работающего приложения. Состояние аппаратного RAID подтверждайте фирменной утилитой контроллера; универсальной безопасной команды для всех производителей нет.
fio-empty-logical-disk.sh
# ВНИМАНИЕ: следующие команды РАЗРУШАЮЩИЕ.
# Выполняйте только на подтверждённом пустом выделенном логическом диске.
TARGET=/dev/disk/by-id/scsi-EXAMPLE_EMPTY_LOGICAL_DISK
COMMON="--filename=$TARGET --size=100% --time_based=1 --runtime=900 --ramp_time=120 --direct=1 --ioengine=io_uring --iodepth=32 --numjobs=1 --group_reporting=1 --randrepeat=0 --output-format=json"

# Чтение без изменения содержимого устройства
fio --name=block-rand-read-4k $COMMON --rw=randread --bs=4k --output=block-rand-read-4k.json

# РАЗРУШАЮЩАЯ случайная запись по адресам во всём диапазоне target
fio --name=block-rand-write-4k $COMMON --rw=randwrite --bs=4k --output=block-rand-write-4k.json

# РАЗРУШАЮЩАЯ последовательная запись в течение runtime.
# Если времени недостаточно, fio может не пройти target целиком.
fio --name=block-seq-write $COMMON --rw=write --bs=1M --output=block-seq-write.json

Параметр invalidate=1 можно документированно добавлять в сценарии, где он поддерживается используемым движком и ОС: fio будет пытаться инвалидировать кэшированные данные файла перед запуском job. Он не заменяет direct=1, не очищает кэш всего сервера и не управляет кэшами RAID или SSD. Значения direct, invalidate, group_reporting, size, runtime, ramp_time и формат JSON сверяйте с fio --help и документацией установленной fio.

Кэши и устойчивая скорость записи

Краткий тест может измерить скорость принятия данных в RAM page cache, защищённый Write-Back кэш RAID-контроллера или SLC-кэш SSD, а не длительную скорость носителей. При исправной BBU, CacheVault или суперконденсаторе контроллер может подтверждать запись после помещения данных в защищённый кэш; при проблеме с защитой многие контроллеры переключаются в кэш со сквозной записью. Конкретная политика перехода определяется моделью и прошивкой контроллера.

  • Отделяйте burst от устойчивого результата: запускайте запись достаточно долго, стройте latency/BW-логи и проверяйте, переходит ли скорость и задержка после начального периода к другому устойчивому уровню.
  • Для проверки кэша чтения используйте рабочий набор больше кэша, влияние которого требуется оценить. Для Write-Back и SLC-кэша одного большого рабочего диапазона недостаточно: важны длительность, объём фактически записанных данных и изменение BW и задержек во времени.
  • Сравнивайте несколько запусков после одинакового состояния массива, а не один «лучший» результат.
  • Для SSD фиксируйте заполненность и свободное пространство, состояние и время последнего discard/TRIM, температуру, предыдущую нагрузку, период простоя и условия фоновой сборки мусора. Сравнивайте накопители после одинаковой подготовки: garbage collection может продолжаться внутри SSD и менять скорость и задержки без видимого процесса в ОС.
  • Не называйте любой результат после короткого ramp_time steady state: короткий прогрев может не исчерпать кэш контроллера или SLC-кэш SSD.

Предварительная полная запись иногда нужна в лабораторной методике, чтобы привести SSD к определённому состоянию перед сравнением. Но это разрушающая операция, она стирает прежнее содержимое target, вызывает дополнительный износ SSD и не должна быть обязательным шагом для рабочего массива. Метод, объём и длительность preconditioning выбирают под цель измерения и рекомендации производителя накопителей.

Если нужно моделировать подтверждённую устойчивую запись приложения, одной команды rw=write недостаточно: она может измерять передачу данных до нижележащего кэша. fio поддерживает механизмы вроде fsync, fdatasync и end_fsync, но их семантика зависит от ОС, файловой системы и стека хранения. Настраивайте их только как часть профиля приложения: например, если СУБД действительно делает fsync для журнала. Не добавляйте fsync в тест пропускной способности файлового сервера без причины.

Как читать вывод fio

В текстовом и JSON-выводе fio обычно публикует статистику чтения и записи отдельно. Для последовательного профиля сначала смотрите BW и его стабильность во времени; для randread или randwrite с блоком 4 KiB — IOPS и задержки. При group_reporting=1 fio агрегирует результаты job в отчёт группы, что удобно для общей нагрузки, но скрывает разброс между отдельными потоками.

Набор полей и единицы времени зависят от версии fio и формата вывода.

Поле fioСмыслОграничение интерпретации
slatЗадержка отправки I/O: подготовка и передача запроса движкуЗависит от CPU, ioengine и нагрузки на хост
clatЗадержка завершения I/O после отправкиОбычно ближе к задержке пути хранения, но включает не только диски
latПолная задержка fio для операции; в типичных версиях складывает submit и completion частиНе равна автоматически задержке транзакции приложения
clat_ns.percentile в JSONПерцентили completion latency, если включены и выведены данной версией fioУказывайте, что это именно clat, а не общая задержка приложения

Latency logs

Для длительного теста и поиска провалов полезны --write_bw_log=..., --write_iops_log=... и --write_lat_log=...; интервал задаётся --log_avg_msec=.... Логи могут быть объёмными. В отчёте укажите, какую метрику задержки записывали и агрегировалась ли она.

Почему RAID 5 и RAID 6 могут медленно писать мелкие блоки

В RAID 5 и RAID 6 частичная запись, не закрывающая всю полосу RAID, нередко приводит к циклу чтение-модификация-запись: нужно учесть прежние данные и контрольную информацию, пересчитать чётность и записать обновления. Поэтому мелкая случайная запись может создавать больше внутренней работы, чем чтение или последовательная запись.

Часто приводимый фиксированный «write penalty» — лишь упрощённая модель, а не точный прогноз IOPS. Реальный эффект меняется с размером I/O, выравниванием, числом дисков с данными, кэшем контроллера, политикой записи, накопителями и тем, удаётся ли контроллеру объединить операции в полную полосовую запись. Для конкретной реализации размер полной полосы обычно равен размеру элемента полосы на одном диске — strip или chunk — умноженному на число дисков с данными в полосе. Контроллеры могут называть размер элемента или всей полосы Stripe Size, поэтому значение нужно сверять с документацией конкретной реализации.

  • Измерьте мелкую случайную запись отдельно с bs=4k, 8k и 16k, если эти размеры соответствуют приложению.
  • Для проверки эффекта полной полосы сначала вычислите её точный размер. Используйте I/O такого размера только при подтверждённом выравнивании начала устройства, раздела, файловой системы и смещений fio по границе полосы; размер, лишь близкий к полной полосе, полнополосную запись не гарантирует.
  • Сравните выровненный полнополосный профиль с обычным профилем приложения. Не подменяйте профиль приложения крупными блоками только ради более высокой цифры.
  • Сравните QD1 и рабочую для приложения очередь: кэш может по-разному объединять операции.
  • Повторите тесты с документированными политиками Write Back и Write Through, только если Write Back действительно защищён.
  • Не выводите пригодность RAID 5/6 из одного коэффициента. Для настройки кэша и Stripe Size см. Кэш RAID-контроллера, Write Back и Stripe Size: выбор без лишнего риска.

Как решить, хватает ли результата реальной нагрузке

  1. Сопоставьте каждый fio-профиль с измерениями приложения: размер I/O, read/write ratio, параллелизм, активный набор данных и требования к подтверждённой записи.
  2. Проверьте, что средние IOPS и bandwidth достаточны, а p95/p99/p99.9 задержек укладываются в допустимую реакцию сервиса.
  3. Заложите обоснованный запас на рост нагрузки, фоновые задачи, заполнение SSD и изменение состояния кэшей.
  4. Отдельно оцените эксплуатационные сценарии деградации и Rebuild по документации и, если возможно, на стенде. Не переводите рабочий массив в деградированное состояние ради обычного benchmark.
  5. Подтвердите вывод нагрузочным тестом фактического потребителя: СУБД, datastore гипервизора, файлового сервера или другого приложения.

В отчёте по raid тесту производительности сохраните команды fio и JSON, версию fio и ioengine, runtime, ramp_time, size, bs, iodepth, numjobs, состояние массива до и после теста, заполненность, политики кэшей, состояние SSD и сведения о фоновых процессах. Это позволяет повторить измерение и объяснить разницу результатов, а не сравнивать несопоставимые цифры.

Термины в статье

Реализация RAID, в которой специализированный контроллер формирует логические диски и выполняет операции массива. Наличие и защита кэша зависят от модели.
Изолированная вычислительная среда с виртуальными процессорами, памятью, дисками и сетевыми адаптерами, в которой под управлением гипервизора работает гостевая ОС.
Программный слой, который абстрагирует ресурсы физического хоста, выполняет виртуальные машины и управляет ими.
Кэш со сквозной записью — режим, в котором кэш не подтверждает запись раньше нижележащего хранилища и не оставляет подтверждённые данные только в своей энергозависимой памяти.
Кэш страниц — управляемый ядром Linux кэш в оперативной памяти, хранящий данные файлов и блочных устройств для ускорения повторных чтений и буферизации записей.
Логический диск — блочное устройство, которое RAID-контроллер или программная RAID-подсистема предоставляет хосту как отдельный накопитель.
Метаданные RAID — служебные записи на дисках или контроллере, описывающие состав, уровень, состояние и параметры RAID-массива для его распознавания и сборки.
Компонент подсистемы блочного ввода-вывода ОС, который определяет порядок выдачи запросов устройству с учётом задержки, пропускной способности и справедливости.
Запись в RAID с чётностью, заменяющая все блоки данных одной полосы. Новая чётность вычисляется по поступившим данным, поэтому старые данные и чётность читать не требуется.
Полоса RAID — набор блоков одного логического диапазона, распределённых между дисками массива; в RAID 5 и RAID 6 она также включает блоки чётности.
RAID, реализованный ОС или другим программным стеком хоста без отдельного аппаратного RAID-контроллера. Использует вычислительные ресурсы сервера.
Процесс — экземпляр выполняемой программы в Linux с PID, виртуальным адресным пространством, состоянием и связанными с ним ресурсами.
Накопитель энергии высокой мощности, применяемый для кратковременного питания кэша RAID-контроллера. При сбое питания он сохраняет данные до записи во флеш-память.
Физический диск — отдельный HDD, SSD или иной накопитель, распознанный RAID-контроллером как член массива либо как независимое устройство.
Фоновая инициализация — формирование или проверка RAID-контроллером данных избыточности нового массива без отключения логического диска.
Избыточные контрольные данные, вычисляемые из блоков одной полосы RAID. Один блок чётности защищает от отказа одного диска, два независимых блока RAID 6 — от отказа двух.
Чтение-модификация-запись — цикл частичной записи RAID-полосы: контроллер читает прежние данные и контрольную информацию, пересчитывает их и записывает обновление.
Штраф записи RAID — условное число внутренних дисковых операций на одну небольшую логическую запись, обусловленное зеркалированием или обновлением чётности.
Аккумуляторный модуль, поддерживающий питание энергозависимого кэша RAID-контроллера при сбое питания до восстановления питания и записи данных на диски.
CacheVault — технология защиты кэша записи RAID-контроллера, сохраняющая во флеш-память подтверждённые хосту, но ещё не записанные на диски данные при потере питания.
Consistency Check — фоновая проверка согласованности избыточности RAID: зеркальных копий либо рассчитанной и записанной чётности; расхождения могут исправляться.
Логический контейнер хранилища в VMware для размещения файлов виртуальных машин (диски, конфигурации, логи)
IOPS — число завершённых операций ввода-вывода в секунду, которое накопитель, RAID-массив или СХД обеспечивает при заданном профиле нагрузки.
Утилита командной строки Linux для создания, сборки, мониторинга и изменения программных RAID-массивов подсистемы MD.
Patrol Read — фоновое сканирование накопителей RAID-контроллером для поиска скрытых ошибок чтения. В избыточном массиве контроллер может восстановить повреждённые блоки.
Технология объединения нескольких накопителей в логические блочные устройства для повышения производительности и/или отказоустойчивости в зависимости от RAID-уровня.
RAID 5 — уровень RAID с чередованием данных и распределённой чётностью, выдерживающий отказ одного диска. Требует минимум трёх дисков.
Уровень RAID с чередованием данных и двойной распределённой чётностью. Выдерживает отказ любых двух дисков; минимум четыре диска.
Устройство или модуль, который формирует RAID-массивы из накопителей и предоставляет ОС логические диски, управляя размещением данных, отказами и восстановлением избыточности.
Буфер быстрой памяти между хостом и накопителями RAID, используемый для кэширования чтения и записи. Может снижать задержку и повышать производительность ввода-вывода.
RAID-уровень — схема размещения данных и избыточности по накопителям массива, определяющая полезную ёмкость, отказоустойчивость и характеристики ввода-вывода.
Процесс восстановления избыточности массива после замены отказавшего диска: контроллер вычисляет и записывает на новый диск недостающие данные из остальных дисков.
Параметр чередования RAID: объём последовательных данных, размещаемых на одном диске до перехода к следующему. Значение термина stripe size зависит от вендора.
Метод предоставления логической ёмкости LUN, томам или виртуальным дискам, при котором физическое место выделяется по мере записи, а не резервируется целиком заранее.
TRIM — операция ATA, которой ОС сообщает SATA SSD, что указанные логические блоки больше не используются; немедленное стирание данных при этом не гарантируется.
Политика кэша RAID-контроллера: запись подтверждается после помещения данных в кэш, а на накопители переносится позже. Кэш требует защиты от потери питания.

Вопросы по теме

Все вопросы и ответы

Можно ли тестировать RAID через физический диск из массива?

Нет. Участник действующего RAID не является безопасным target для fio, особенно для профилей с rw=write, rw=randwrite или rw=randrw: такие операции уничтожают прежнее содержимое выбранного диапазона. Нельзя направлять тест на системный диск, раздел с данными, LVM physical volume, используемое md-устройство или физический носитель, входящий в работающий массив.

Для файлового теста выбирают новый уникальный файл в специально созданном каталоге на нужной файловой системе и заранее проверяют свободное место. Для блочного теста нужен отдельный пустой логический диск: его следует сопоставить с идентификатором Virtual Disk или серийным номером, проверить отсутствие разделов, монтирования, holders и сигнатур файловой системы, LVM или RAID. Если происхождение устройства или его принадлежность массиву не ясны, запись запускать нельзя.

Отключает ли direct=1 кэш RAID-контроллера?

Нет. direct=1 обычно запрашивает прямой I/O и уменьшает влияние page cache операционной системы, но не отключает кэш RAID-контроллера, кэш накопителей и внутренние механизмы SSD. Фактическое поведение зависит от ОС, файловой системы, драйвера и устройства, поэтому параметр не является универсальным способом измерить диски «без кэшей».

Почему RAID 5 медленно пишет мелкими блоками?

Мелкие частичные записи в RAID 5, которые не закрывают полную полосу, нередко вызывают read-modify-write. Для обновления данных контроллер должен учитывать прежние блоки и контрольную информацию, пересчитать чётность и записать изменённые данные. В RAID 6 логика аналогична, но контрольной информации больше.

Фиксированный «write penalty» нельзя считать точным прогнозом IOPS. Результат зависит от размера I/O, выравнивания, числа дисков с данными, типа накопителей, кэша и политики записи контроллера, а также от возможности объединять операции в полнополосную запись. Для проверки профиля приложения полезно отдельно измерить случайную запись с блоками 4, 8 и 16 KiB, сравнить QD1 с рабочей очередью и повторить прогоны при документированных политиках записи.

Как stripe size влияет на запись RAID 5?

Для оценки эффекта stripe size сначала нужно уточнить терминологию конкретного RAID-контроллера: разные реализации могут называть Stripe Size размер элемента на одном диске либо размер всей полосы. Обычно размер полной полосы рассчитывают как размер strip или chunk на одном диске, умноженный на число дисков с данными в полосе.

Профиль с I/O размером полной полосы имеет смысл только при подтверждённом выравнивании начала устройства, раздела, файловой системы и смещений fio по границе полосы. Размер блока, который лишь близок к полной полосе, не обеспечивает полнополосную запись. Такой тест следует сравнивать с обычным профилем приложения, а не заменять им реальную нагрузку ради большей цифры производительности.

Почему средняя задержка низкая, а p99 высокая?

Это означает, что большинство I/O завершается быстро, но небольшая доля операций испытывает заметные паузы. Среднее значение скрывает такие выбросы. Если p99 записи достигает десятков или сотен миллисекунд, пользователи, виртуальные машины или СУБД могут видеть зависания даже при хорошей средней задержке.