Как работает Linux I/O scheduler и когда его стоит менять
Диск — один из самых медленных ресурсов в системе. Когда несколько процессов одновременно выполняют операции чтения и записи, ядру 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 |
|---|---|
| NVMe | none |
| SSD | mq-deadline |
| HDD | mq-deadline |
| Desktop | bfq |
| VM | none / mq-deadline |
Важный момент: scheduler ≠ cgroups
I/O scheduler управляет очередью запросов,
а cgroups управляют распределением ресурсов между процессами.
Это разные уровни, которые дополняют, а не заменяют друг друга.
Итоги
- I/O scheduler — ключевой компонент дисковой подсистемы Linux.
- В новых ядрах используется multi-queue архитектура.
- Для большинства серверов лучше подходит
mq-deadline. - Для NVMe чаще всего scheduler не нужен.
- Менять scheduler стоит только при реальной необходимости и после замеров.
Грамотно выбранный I/O scheduler может заметно снизить latency и сделать систему предсказуемее — без апгрейда железа.
Настроить мониторинг за 30 секунд
Надежные оповещения о даунтаймах. Без ложных срабатываний