Как работает Linux I/O scheduler и когда его стоит менять

6 минут чтения
Средний рейтинг статьи — 4.7

Диск — один из самых медленных ресурсов в системе. Когда несколько процессов одновременно выполняют операции чтения и записи, ядру Linux нужно решить, в каком порядке и с каким приоритетом обслуживать I/O-запросы.

За это отвечает I/O scheduler (планировщик ввода-вывода). От его работы зависит:

  • latency операций,
  • пропускная способность диска,
  • предсказуемость нагрузки,
  • поведение системы под I/O-стрессом.

В этой статье разберём, как работает I/O scheduler в Linux, какие бывают типы и в каких случаях имеет смысл его менять.

Что такое I/O scheduler

I/O scheduler — это компонент ядра Linux, который:

  • принимает запросы на чтение и запись,
  • упорядочивает их,
  • объединяет,
  • и отправляет на блочное устройство.

Он работает между файловой системой и драйвером устройства, скрывая сложность реального диска от приложений.

Зачем вообще нужен scheduler

Если отправлять I/O-запросы «как есть»:

  • головка HDD будет постоянно прыгать,
  • SSD будет получать хаотичные операции,
  • высокоприоритетные процессы будут страдать из-за фоновых задач.

Scheduler позволяет:

  • уменьшать seek на HDD,
  • сглаживать нагрузку,
  • обеспечивать fair sharing между процессами,
  • контролировать latency.

Классические I/O scheduler’ы

CFQ (Completely Fair Queuing)

Исторически самый популярный scheduler.

Особенности:

  • выделяет каждому процессу свою очередь;
  • старается распределять диск «справедливо»;
  • хорошо подходит для десктопов.

Минусы:

  • лишний overhead;
  • плохо подходит для SSD;
  • убран по умолчанию в новых ядрах.

Deadline

Ориентирован на минимизацию задержек.

Как работает:

  • каждому запросу задаётся дедлайн;
  • если дедлайн истёк — запрос выполняется немедленно;
  • предотвращает starvation.

Подходит:

  • для серверов,
  • баз данных,
  • предсказуемой нагрузки.

NOOP

Самый простой scheduler.

Особенности:

  • почти не сортирует запросы;
  • передаёт их дальше как есть.

Используется:

  • для виртуальных дисков,
  • когда реальный scheduler уже есть на другом уровне.

Современные scheduler’ы

MQ-deadline

Эволюция Deadline под multi-queue (blk-mq) архитектуру.

Плюсы:

  • низкая latency;
  • хорошо масштабируется;
  • стабилен под нагрузкой.

Часто используется по умолчанию для серверов.

BFQ (Budget Fair Queuing)

Scheduler, ориентированный на интерактивность.

Особенности:

  • выделяет бюджет I/O каждому процессу;
  • предсказуемая latency;
  • отличен для десктопов.

Минус:

  • более сложный;
  • редко нужен на серверах

None

Фактически отключает scheduler.

Используется:

  • для NVMe;
  • в виртуалках;
  • когда устройство само управляет очередями.

Как узнать текущий scheduler

cat /sys/block/sda/queue/scheduler

Пример вывода:

none mq-deadline [bfq]

Текущий scheduler отмечен квадратными скобками.

Как изменить I/O scheduler

Временно (до перезагрузки)

echo mq-deadline | sudo tee /sys/block/sda/queue/scheduler

Постоянно (через параметры ядра)

В GRUB:

GRUB_CMDLINE_LINUX="elevator=mq-deadline"

После этого:

sudo update-grub
sudo reboot

Когда имеет смысл менять scheduler

Оставить как есть, если:

  • используется NVMe;
  • система в облаке;
  • нагрузка стандартная.

Стоит поменять, если:

  • высокая I/O latency;
  • база данных тормозит под нагрузкой;
  • HDD с большим количеством random I/O;
  • важна предсказуемость отклика.

Типовые рекомендации

СценарийScheduler
NVMenone
SSDmq-deadline
HDDmq-deadline
Desktopbfq
VMnone / mq-deadline

Важный момент: scheduler ≠ cgroups

I/O scheduler управляет очередью запросов,
а cgroups управляют распределением ресурсов между процессами.

Это разные уровни, которые дополняют, а не заменяют друг друга.

Итоги

  • I/O scheduler — ключевой компонент дисковой подсистемы Linux.
  • В новых ядрах используется multi-queue архитектура.
  • Для большинства серверов лучше подходит mq-deadline.
  • Для NVMe чаще всего scheduler не нужен.
  • Менять scheduler стоит только при реальной необходимости и после замеров.

Грамотно выбранный I/O scheduler может заметно снизить latency и сделать систему предсказуемее — без апгрейда железа.

6 минут чтения
Средний рейтинг статьи — 4.7

Настроить мониторинг за 30 секунд

Надежные оповещения о даунтаймах. Без ложных срабатываний