fio: измеряем IOPS и скорость диска на VPS
Что такое IOPS и чем отличается от МБ/с, как правильно замерить случайное чтение и запись блоком 4 КБ утилитой fio и посмотреть текущую нагрузку через iostat. Ubuntu, Debian, AlmaLinux.

IOPS (Input/Output Operations Per Second) — число операций чтения и записи, которые диск выполняет за секунду. Для сайта-визитки эта цифра почти не важна, а для базы данных часто становится узким местом раньше процессора и памяти. Ниже — как её измерить честно, чтобы не мерить кэш операционной системы вместо диска.
Замеры ниже делались на VPS в Германии — на tanaka.host у каждого сервера свой IPv4 и IPv6, так что проверять можно оба стека.
Кому важен IOPS, а кому — МБ/с
Высокий IOPS нужен задачам с большим числом мелких обращений:
- базы данных — MySQL, PostgreSQL, MongoDB;
- нагруженные сайты и интернет-магазины;
- почтовые серверы;
- кэши и очереди, если они на диске.
Для потокового видео, бэкапов и раздачи больших файлов важнее линейная скорость в МБ/с: данные идут сплошным потоком.
Это два разных числа. Диск может выдавать гигабайт в секунду на последовательном чтении и скромный IOPS на случайных мелких операциях. Выбирая сервер под базу, смотрите на случайный IOPS блоком 4 КБ.
От чего зависит результат
- Тип накопителя. NVMe даёт в разы больше IOPS, чем SATA SSD, и несопоставимо больше, чем HDD.
- Размер блока. Чем мельче блок, тем больше операций в секунду. Максимальный IOPS меряют блоком 4 КБ — типичный размер обращения базы данных.
- Характер доступа. Случайный разброс по всему диску тяжелее последовательного. База создаёт случайную нагрузку, бэкап — последовательную.
- Глубина очереди. Сколько запросов висит одновременно. Один поток с очередью 1 покажет задержку, очередь 32 — потолок.
На виртуальных серверах добавляется соседство: диск делится между VM, и результат может плавать в течение дня.
1. Установка fio
sudo apt update && sudo apt install -y fio
# RHEL: sudo dnf install -y fio
2. Случайное чтение 4 КБ
Главная цифра для баз данных.
Тест создаёт временный файл. В примерах — 2 ГБ. Проверьте свободное место (
df -h), запускайте в рабочей папке вроде/rootи удалитеfiotestпосле.
fio --name=randread --filename=fiotest --ioengine=libaio --direct=1 \
--rw=randread --bs=4k --iodepth=32 --numjobs=1 --size=2G \
--runtime=60 --time_based --group_reporting
Ключи:
| Ключ | Что значит |
|---|---|
--rw=randread |
Случайное чтение. randwrite — запись, randrw — смешанная |
--bs=4k |
Блок 4 КБ |
--direct=1 |
Мимо кэша ОС — мерим диск, а не память |
--iodepth=32 |
32 запроса в очереди одновременно |
--numjobs=1 |
Один поток |
--runtime=60 --time_based |
Ровно 60 секунд |
--group_reporting |
Сводный итог вместо по-потокового |
3. Другие профили
Случайная запись — важна для баз с частыми INSERT/UPDATE и для журналов:
fio --name=randwrite --filename=fiotest --ioengine=libaio --direct=1 \
--rw=randwrite --bs=4k --iodepth=32 --numjobs=1 --size=2G \
--runtime=60 --time_based --group_reporting
Смешанная 70/30 — ближе к реальной нагрузке сайта с БД:
fio --name=mixed --filename=fiotest --ioengine=libaio --direct=1 \
--rw=randrw --rwmixread=70 --bs=4k --iodepth=32 --numjobs=1 --size=2G \
--runtime=60 --time_based --group_reporting
Линейная скорость — для бэкапов и больших файлов, блок 1 МБ:
fio --name=seqread --filename=fiotest --ioengine=libaio --direct=1 \
--rw=read --bs=1M --iodepth=8 --numjobs=1 --size=2G \
--runtime=30 --time_based --group_reporting
Задержка одной операции без очереди — отзывчивость, которую «чувствует» приложение:
fio --name=lat --filename=fiotest --ioengine=libaio --direct=1 \
--rw=randread --bs=4k --iodepth=1 --numjobs=1 --size=2G \
--runtime=30 --time_based --group_reporting
После всех тестов:
rm fiotest
4. Как читать результат
В выводе найдите строку, начинающуюся с read или write:
read: IOPS=85.2k, BW=333MiB/s (349MB/s)
IOPS=85.2k— число операций в секунду, та самая цифра.BW— пропускная способность за то же время. Для 4 КБ это просто IOPS × 4 КБ.- Блок
latниже — задержка:avgсредняя,99.00thв процентилях. Для NVMe на очереди 1 нормально 50–150 мкс, для сетевого хранилища — миллисекунды.
Ориентиры для случайного чтения 4 КБ: HDD — 100–200 IOPS, SATA SSD — 20–80k, NVMe — 100k и выше. На VPS цифры ниже «железных», потому что между вами и диском гипервизор и соседи.
5. Текущая нагрузка без теста
Быстро посмотреть, что диск делает прямо сейчас, помогает iostat из пакета sysstat:
sudo apt install -y sysstat
iostat -dx 1
Колонки r/s и w/s — реальные операции в секунду от ваших приложений, %util — насколько диск занят. Если %util держится у 100 % — вы упёрлись в диск и дальнейшие замеры fio покажут только остаток.
Частые ошибки
IOPS подозрительно огромный, сотни тысяч — забыли --direct=1, меряется кэш ОС в памяти.
Результат плавает в разы от запуска к запуску — соседи по хосту или фоновая нагрузка. Проверьте iostat, повторите в другое время, возьмите медиану из трёх прогонов.
No space left on device — --size больше свободного места. Уменьшите до 1G.
Тест записи на рабочем сервере тормозит сайт — так и будет: fio забивает очередь диска. Запускайте на тихом сервере или ночью.
Чтобы оценить процессор тем же образом, есть UnixBench, а сеть — Speedtest и iperf3.