MAATRIX / Блог / Как тестировать диск через fio

Как тестировать диск через fio

Как тестировать диск через fio: IOPS и латентность VPS
Блог MAATRIX · 2026-07-07

fio — стандартный инструмент, которым измеряют реальную производительность диска. Покажем готовые команды для случайных и последовательных операций, объясним каждый флаг и научим читать вывод, чтобы понять, что за диск вам достался.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Зачем тестировать диск и что даёт fio

После заказа VPS полезно проверить диск на деле, а не верить описанию тарифа. fio (Flexible I/O tester) моделирует любую нагрузку: случайное или последовательное чтение и запись, разный размер блока, разную глубину очереди. В отличие от простых утилит вроде hdparm, он показывает именно то, что важно серверу — случайные IOPS и латентность.

Установка занимает секунды:

sudo apt update && sudo apt install -y fio

Тесты создают временный файл в текущей папке. Запускайте их в разделе, где есть свободное место, и удаляйте файл после теста.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.

Арендовать VPS на NVMe

Ключевые флаги fio

Прежде чем запускать, разберём параметры — от них зависит, что именно вы измеряете.

  • --rw — режим: randread, randwrite (случайные), read, write (последовательные), randrw (смешанный).
  • --bs — размер блока: 4k для баз, 1M для линейной нагрузки.
  • --direct=1 — обход кэша ОС, тест реального диска, а не памяти.
  • --iodepth — глубина очереди: 1 для латентности, 32-64 для максимума IOPS.
  • --numjobs — число параллельных потоков нагрузки.
  • --runtime + --time_based — длительность теста в секундах.

Флаг --direct=1 критичен: без него вы измеряете скорость кэша в RAM, а не диска, и получите нереально красивые цифры.

Тест случайного чтения — главный для баз

Случайное чтение блоками 4К — нагрузка, максимально похожая на работу базы данных. Именно она показывает реальный потолок IOPS диска.

fio --name=randread --filename=./fiotest --size=1G \
  --rw=randread --bs=4k --direct=1 --ioengine=libaio \
  --iodepth=64 --numjobs=1 --runtime=30 --time_based
rm -f ./fiotest

В выводе главное — строка вида read: IOPS=250k, BW=980MiB/s. IOPS — число операций в секунду, BW — пропускная способность. На NVMe вы увидите сотни тысяч IOPS, на SATA SSD — десятки тысяч, на HDD — сотни. Ниже в блоке clat указана латентность — задержка операции в микросекундах.

Тест записи и смешанной нагрузки

Запись тестируют отдельно — она обычно тяжелее чтения. Осторожно: тест записи нагружает диск реально, не запускайте его на важных данных.

# случайная запись 4к
fio --name=randwrite --filename=./ft --size=1G \
  --rw=randwrite --bs=4k --direct=1 --ioengine=libaio \
  --iodepth=64 --numjobs=1 --runtime=30 --time_based

# смешанная нагрузка 70/30 чтение/запись — как у реального сервиса
fio --name=mixed --filename=./ft --size=1G \
  --rw=randrw --rwmixread=70 --bs=4k --direct=1 \
  --ioengine=libaio --iodepth=32 --runtime=30 --time_based
rm -f ./ft

Смешанный тест (randrw) ближе всего к реальности: сервер редко только читает или только пишет. Соотношение 70/30 типично для веб-приложения с базой.

Тест латентности и последовательной скорости

Чтобы измерить честную задержку одной операции, ставят глубину очереди 1 — так видно, за сколько диск отвечает без накопления запросов.

# латентность одиночной операции
fio --name=lat --filename=./ft --size=512M --rw=randread \
  --bs=4k --direct=1 --ioengine=libaio --iodepth=1 \
  --runtime=20 --time_based

# последовательное чтение большими блоками — максимальные МБ/с
fio --name=seqread --filename=./ft --size=2G --rw=read \
  --bs=1M --direct=1 --ioengine=libaio --iodepth=16 \
  --runtime=20 --time_based
rm -f ./ft

При iodepth=1 задержка NVMe — десятки микросекунд, у HDD — миллисекунды, разница в сотни раз. Последовательный тест блоками 1М покажет максимальную линейную скорость в МБ/с.

Как читать вывод и делать выводы

Соберём воедино, на что смотреть. В выводе fio ключевые поля:

  • IOPS — число операций в секунду, главный показатель для баз и веба.
  • BW (bandwidth) — пропускная способность в МБ/с, важна для линейных задач.
  • clat / lat — задержка операции, чем меньше и стабильнее, тем лучше.
  • percentiles — 99-й перцентиль латентности показывает худшие случаи, а не среднее.

Ориентиры: NVMe — сотни тысяч случайных IOPS при задержке в десятки микросекунд; SATA SSD — десятки тысяч IOPS; HDD — сотни IOPS и миллисекундные задержки. Если ваш тест дал сотни IOPS — под капотом медленный диск, и базу на нём держать нельзя.

На тарифах MAATRIX диски NVMe в связке с AMD EPYC — прогоните fio после заказа и увидите сотни тысяч IOPS сами. Оплата возможна картой РФ, СБП, криптой или токеном MAAT, что удобно для аудитории из России.

Частые ошибки при тестировании

  • Забыть --direct=1 — измеряете кэш в RAM, а не диск, цифры завышены в разы.
  • Тестировать блоком 1M и радоваться МБ/с — для сервера важны случайные 4к IOPS.
  • Слишком маленький --size — тест целиком влезает в кэш, результат нереальный.
  • Запускать тест записи на боевых данных — fio реально пишет на диск, используйте отдельный файл.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.

Арендовать VPS на NVMe

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Частые вопросы

Зачем нужен флаг --direct=1 в fio?

Он заставляет fio обходить кэш операционной системы и тестировать реальный диск. Без него вы измеряете скорость RAM и получаете завышенные цифры.

Какой тест fio показывает производительность базы?

Случайное чтение и запись блоками 4к (--rw=randread/randwrite --bs=4k) или смешанный randrw. Именно так работает СУБД под нагрузкой.

Какие IOPS считаются хорошими?

NVMe выдаёт сотни тысяч случайных IOPS, SATA SSD — десятки тысяч, HDD — лишь сотни. Для базы данных нужен NVMe.