Тест производительности HDD, SSD и NVMe SSD с помощью fio

21 Jul 2026, 15:00:13
Для измерения реальной производительности дисковых устройств в операционных системах семейства Linux используется утилита fio (Flexible I/O Tester). На данный момент она является стандартом индустрии среди системных администраторов. Утилита выполняет два действия: имитирует реальную нагрузку на заданном устройстве и измеряет необходимые метрики.
С помощью fio возможно воссоздать разные типы нагрузки:
  • Случайное чтение или запись
  • Последовательное чтение или запись
  • Многопоточную работу
  • Смешанную нагрузку в заданной пропорции
Мы рассмотрим базовые примеры для тестирования разных типов накопителей и обсудим нормальные значения этих тестов.

Установка fio

Утилита fio давно завоевала хорошую репутацию и присутствует в системных репозиториях многих Linux-дистрибутивов. Все команды в статье выполняются на выделенном сервере от компании Virterion.com от имени пользователя root. Если вы работаете в системе под обычным пользователем, вам может потребоваться использовать sudo для выполнения команд.

Debian и Ubuntu

apt install fio

RHEL, AlmaLinux, Rocky Linux

dnf install fio

Arch Linux

pacman -S fio

FreeBSD

pkg install fio
Проверка установленной версии:
fio --version20260722_D0FQwBpO

Запуск тестов

Преимущество fio в том, что мы сами можем задать тип и интенсивность нагрузки. Сейчас мы рассмотрим некоторые варианты тестов, в том числе проверим диск на соответствие заявленным производителем характеристикам.
Сперва необходимо создать директорию, в которую утилита будет записывать файлы для работы. Эта директория должна быть на тестируемом диске. Создать её можно стандартной командой:
mkdir /fio

Случайное чтение

Многие производители указывают четыре типа параметров производительности, которым соответствует устройство: максимальное количество операций случайного чтения и записи, скорость последовательного чтения и записи.
Начнём с первого, поскольку для рабочего сервера именно количество IOPS зачастую является узким местом.
Заявленные производителем характеристики:
20260722_JMMt5wOK
Команда под эти же параметры (размер блока 4k, случайное чтение, очередь в 32 запроса):
fio --name=4k-rnd-read --rw=randread --directory=/fio --direct=1 --bs=4k --ioengine=libaio --iodepth=32 --runtime=60 --numjobs=1 --time_based --size=5G
  • --name=4k-rnd-read - наименование теста
  • --rw=randread - тип теста (randread - случайное чтение)
  • --directory=/fio - рабочая директория
  • --direct=1 - прямая работа с диском, обход кэширования системы
  • --bs=4k - размер блока
  • --ioengine=libaio - механизм взаимодействия с ядром системы
  • --iodepth=32 - глубина очереди
  • --runtime=60 - время на выполнение теста
  • --numjobs=1 - количество потоков теста
  • --time_based - завершить тест по истечении заданного времени
  • --size=5G - размер тестового файла
Некоторое время займёт её выполнение. Вывод будет иметь вид:
20260722_4U7n8YuS
Разберём некоторые отображаемые результаты:

IOPS=96.9kколичество операций чтения в секунду (как видим, эта характеристика полностью соответствует заявленной)
BW=379MiB/sпропускная способность (397 MB/s)
22.2GiB/60001msecпрочитано 22.2 ГиБ данных за 60 секунд теста
slat (Submission Latency)время, затраченное процессором на подготовку запроса
clat (Completion Latency)время от отправки запроса в драйвер до получения ответа от диска
lat (Total Latency)фактическое время получения данных (slat + clat)
clat percentilesпроцент запросов, выполненных в указанную задержку (в примере 90% запросов были выполнены в 404 мкс., 50% - 318 мкс.)
IO depthsглубина очереди (в примере все 100% времени очередь составляла 32 запроса)
Disk stats (read/write)статистика из самой ОС
ios=5808259/56количество выполненных операций чтения/записи
ticks=1883947/34суммарное время операций чтения/записи
util=60.67%утилизация диска (процент времени, когда диск был активен)
В конкретном тесте видно, что диск соответствует указанной производителем характеристике случайного чтения. Также все задержки (slat, clat, lat, clat percentiles) имеют отличный диапазон значений, указывающий на хорошее состояние SSD диска. Более того, утилизация диска в ходе теста (util) говорит о том, что диск "простаивал" почти половину времени теста. Мы делаем тест с очередью в 32 запроса поскольку очередь из одного запроса, которая также указана производителем, не имеет практического смысла на серверах.

Случайная запись

Команда для тестирования случайной записи:
fio --name=4k-rnd-write --rw=randwrite --directory=/fio --direct=1 --bs=4k --ioengine=libaio --iodepth=32 --runtime=60 --numjobs=1 --time_based --size=5G
  • --name=4k-rnd-write - наименование теста
  • --rw=randwrite - тип теста (randwrite - случайная запись)
  • --directory=/fio - рабочая директория
  • --direct=1 - прямая работа с диском, обход кэширования системы
  • --bs=4k - размер блока
  • --ioengine=libaio - механизм взаимодействия с ядром системы
  • --iodepth=32 - глубина очереди
  • --runtime=60 - время на выполнение теста
  • --numjobs=1 - количество потоков теста
  • --time_based - завершить тест по истечении заданного времени
  • --size=5G - размер тестового файла
20260722_xHYGsRkk
Основные показатели:
IOPS=80.5kколичество операций записи в секунду
BW=315MiB/sскорость записи (330 МБ/с)
18.4GiB/60001msecзаписано 18.4 ГиБ за 60 секунд
slatвремя на подготовку запроса процессором
clatзадержка на обработку запроса самим диском
clat percentilesкакое количество запросов в процентном соотношении было выполнено за то или иное время
IO depthsглубина очереди (в примере все 100% времени очередь составляла 32 запроса)
Все параметры точно такие же, как и при тесте случайного чтения. Но в этот раз мы видим отличие от заявленных производителем характеристик (80.5k IOPS вместо заявленных 88k IOPS). Скорее всего производитель делал тесты, которые задействовали кэш устройства. Наша задача протестировать саму память носителя, поэтому в примере указан размер тестового файла 5 Гб, для обхода кэша. Ситуация вполне нормальная, ведь все производители стараются показать как можно более интересные цифры.
Другие показатели: время задержки, утилизация устройства вполне нормальные для SATA SSD этого класса.

Последовательное чтение

Для измерения максимальной линейной скорости и пропускной способности накопителя используются тесты последовательного чтения и последовательной записи. Команда для запуска теста последовательного чтения:
fio --name=seq-read --rw=read --directory=/fio --ioengine=libaio --bs=1M --size=5G --iodepth=32 --numjobs=1 --direct=1 --runtime=60 --time_based
  • --name=seq-read - наименование теста
  • --rw=read - тип теста (read - последовательное чтение)
  • --directory=/fio - рабочая директория
  • --direct=1 - прямая работа с диском, обход кэширования системы
  • --bs=1M - размер блока
  • --ioengine=libaio - механизм взаимодействия с ядром системы
  • --iodepth=32 - глубина очереди
  • --runtime=60 - время на выполнение теста
  • --numjobs=1 - количество потоков теста
  • --time_based - завершить тест по истечении заданного времени
  • --size=5G - размер тестового файла
Размер блока (bs) отличается в большую сторону, по сравнению с тестами случайного чтения и записи, чтобы уменьшить накладные расходы по обработке запросов и измерить именно скорость, пропускную способность носителя. Параметры ioengine и iodepth могут быть упущены, если вы тестируете HDD. Объём тестируемого файла (size) может быть увеличен, если вы тестируете NVMe SSD, для обхода кэша.
20260722_18p0X4n5
Важные показатели:

IOPS=521количество операций чтения в секунду во время теста
BW=522MiB/sскорость чтения (547 MB/s)
30.6GiB/60063msecпрочитано 30.6 ГиБ за 60 секунд
clatзадержка выполнения
clat percentilesкакое количество запросов в процентном соотношении было выполнено за то или иное время
ios=61515/229количество операций чтения/записи
ticks=3731315диск был активен ~3.73 секунды
in_queue=3746449общее время в очереди
util=90.91%утилизация диска за время теста
Результат теста подтвердил заявленные производителем характеристики последовательной скорости чтения (540 MB/s заявлено, 547 MB/s результат теста).

Последовательная запись

Команда для тестирования скорости последовательной записи:
fio --name=seq-write --rw=write --directory=/fio --bs=1M --ioengine=libaio --size=5G --iodepth=32 --numjobs=1 --direct=1 --runtime=60 --time_based
  • --name=seq-write - наименование теста
  • --rw=write - тип теста (write - последовательная запись)
  • --directory=/fio - рабочая директория
  • --direct=1 - прямая работа с диском, обход кэширования системы
  • --bs=1M - размер блока
  • --ioengine=libaio - асинхронный ввод-вывод
  • --iodepth=32 - глубина очереди
  • --runtime=60 - время на выполнение теста
  • --numjobs=1 - количество потоков теста
  • --time_based - завершить тест по истечении заданного времени
  • --size=5G - размер тестового файла
Для HDD очередь (iodepth) можно убрать или уменьшить до 4. Для NVMe SSD очередь (iodepth) можно увеличить до 64, файл (size) до 20-30 Гб (в зависимости от размера кэша) и количество потоков (numjobs) до 4.
20260722_tlYx7Fm1
Все поля и их значения такие же, как и при последовательном чтении. Самый интересный показатель - непосредственно скорость записи (407 MB/s). Сильно отличается от заявленной (520 MB/s), но не зря производитель указал две звёздочки у этой характеристики:
20260722_MVfAZqpj
Если смотреть в общем, то 407 MB/s последовательной записи для SATA SSD этого класса - хороший показатель.

Заключение

Для объективной оценки производительности накопителей отраслевым стандартом стала утилита fio. Её ценность в гибкости сценариев: утилита позволяет моделировать различные рабочие нагрузки любой сложности, включая случайный доступ, многопоточность, вариативные размеры блоков и глубину очереди запросов. Именно благодаря этой функциональности fio применяется профессионалами. Теперь вы можете самостоятельно оценить производительность, скорость и пропускную способность ваших накопителей.