IO_SCHEDULER_MISCONFIG
Linux / DevOps
Оптимизация дискового планировщика Linux: mq-deadline, bfq или none (NVMe)
- Низкая производительность высокоскоростных NVMe накопителей при высоких параллельных нагрузках.
- Высокая дисковая задержка в многопоточных базах данных из-за лишней очереди планировщика.
- Несправедливое распределение полосы пропускания между фоновыми и приоритетными процессами на HDD.
1. Просмотр текущего и доступных планировщиков
cat /sys/block/nvme0n1/queue/scheduler
cat /sys/block/sda/queue/schedulerПланировщик в квадратных скобках (например, [none]) является активным.
2. Рекомендации по выбору планировщика
none: Для NVMe SSD накопителей с собственной аппаратной очередью (blk-mq). Устраняет накладные расходы процессора.mq-deadline: Для SATA SSD, виртуальных дисков KVM/VMware и СУБД с гарантией времени отклика на запись.bfq: Для классических HDD и десктопных сред, где важна отзывчивость UI при фоновом копировании.kyber: Разработка Facebook для сверхбыстрых накопителей с жестким таргетом по задержкам чтения/записи.
3. Постоянная настройка через Udev Rules
Создайте файл /etc/udev/rules.d/60-io-schedulers.rules:
# NVMe накопители: none
ACTION=="add|change", KERNEL=="nvme[0-9]*n[0-9]*", ATTR{queue/scheduler}="none"
# SATA SSD накопители (non-rotational): mq-deadline
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="mq-deadline"
# SATA HDD накопители (rotational): bfq
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="bfq"4. Применение правил без перезагрузки
udevadm control --reload && udevadm trigger
Практический опыт инженера:
Для виртуальных машин под управлением KVM/Proxmox всегда устанавливайте планировщик none или mq-deadline внутри гостевой ОС, так как реальное планирование очередей выполняет хостовый гипервизор.
Частые вопросы (FAQ)
Почему для NVMe накопителей рекомендуется планировщик 'none'?
Спецификация NVMe аппаратно поддерживает до 64 000 очередей по 64 000 команд в каждой. Программные планировщики ядра создают лишнюю блокировку мьютексов и тратят такты CPU без пользы.
Где старые планировщики noop, deadline, cfq?
Начиная с ядра Linux 5.0 старый монопоточный слой блочного ввода-вывода был полностью удален в пользу мультиочередевой архитектуры blk-mq (mq-deadline, bfq, none, kyber).