Что такое планировщик ввода-вывода (I/O scheduler) в Linux?

«Что такое планировщик ввода-вывода (I/O scheduler) в Linux?» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Планировщик ввода-вывода (I/O Scheduler) — это компонент ядра Linux, который определяет порядок выполнения операций чтения/записи (I/O requests), отправляемых на блочное устройство (HDD, SSD). Его главная цель — оптимизировать общую производительность диска и сократить задержки (latency).

Почему это важно для DevOps? Неправильный выбор планировщика может убить производительность базы данных, виртуальной машины или дискового массива.

Основные алгоритмы и когда их использовать:

Планировщик Принцип работы Оптимальное использование
mq-deadline Гарантирует время выполнения для запросов (deadline). Сортирует запросы по LBA (адресу на диске) для минимизации скидинга головки HDD. HDD-диски, гибридные системы. Хороший компромисс между пропускной способностью и задержкой. Часто выбор по умолчанию.
bfq (Budget Fair Queuing) Справедливо распределяет пропускную способность диска между процессами. Полезен для интерактивных десктопов или когда нужно гарантировать время отклика для конкретного приложения. Десктопы, системы, где важна отзывчивость (например, медиа-сервер).
none (или noop для старых ядер) Простая FIFO-очередь. Не выполняет сортировку или переупорядочивание. SSD и NVMe-накопители. У SSD нет механической головки, поэтому сложные алгоритмы сортировки не нужны и только добавляют накладные расходы.
kyber Адаптивный планировщик, фокусируется на сокращении задержек (latency). Разделяет запросы на синхронные (чтение) и асинхронные (запись) и управляет их очередями отдельно. Низколатентные SSD, системы реального времени.

Управление планировщиком:

# 1. Посмотреть доступные и активный планировщик для диска (например, sda)
cat /sys/block/sda/queue/scheduler
# Вывод: [mq-deadline] kyber bfq none
# В квадратных скобках — текущий.

# 2. Изменить планировщик (например, на 'none' для SSD)
echo 'none' | sudo tee /sys/block/sda/queue/scheduler

# 3. Сделать изменение постоянным (через udev правило или параметр ядра)
# Например, добавить в /etc/default/grub: GRUB_CMDLINE_LINUX="scsi_mod.use_blk_mq=1 elevator=none"

Рекомендация: Для серверов с SSD в продакшене часто оптимален none или mq-deadline. Выбор должен подтверждаться бенчмарками под конкретную нагрузку (fio).