В мире высоконагруженных СУБД каждый компонент системы требует пристального внимания. Подсистема ввода-вывода (IO) часто становится узким местом, напрямую влияющим на отзывчивость и стабильность работы базы данных. Данный анализ фокусируется на сердце этой подсистемы — планировщике операций ввода-вывода. Мы не просто сравниваем доступные алгоритмы (mq-deadline, kyber, bfq, none), но и проводим детальную оценку их применимости в конкретных условиях: для основного хранилища данных (vdd) и диска журнала транзакций (vdc). Цель — не слепая погоня за новыми технологиями, а взвешенное, обоснованное решение, основанное на анализе нагрузки, характеристик накопителей и архитектурных особенностей PostgreSQL.
GitHub - Комплекс pg_expecto для статистического анализа производительности и нагрузочного тестирования СУБД PostgreSQL
Глоссарий терминов | Postgres DBA | Дзен
PG_EXPECTO: Оптимизация подсистемы IO. Эксперимент-3: Параметры IO-планировщика
1. Текущая конфигурация планировщиков
vdd (данные): [mq-deadline] kyber bfq none
vdc (журнал): [mq-deadline] kyber bfq none
Текущий выбор: mq-deadline на обоих устройствах.
2. Характеристики доступных планировщиков
mq-deadline (текущий)
- Принцип работы: Гарантирует максимальное время обслуживания запросов
- Приоритеты: Чтение над записью (особенно важно для СУБД)
- Особенности: Использует "deadline" механизм для предотвращения голодания операций
- Лучше всего для: Смешанных нагрузок, особенно с преобладанием чтения
kyber
- Принцип работы: Адаптивный планировщик, оптимизированный для SSD/NVMe
- Особенности: Автоматически настраивает глубину очереди на основе целевых задержек
- Лучше всего для: Быстрых накопителей (SSD/NVMe) в виртуализированных средах
bfq (Budget Fair Queuing)
- Принцип работы: Справедливое распределение пропускной способности между процессами
- Особенности: Гарантирует пропускную способность для каждого процесса
- Лучше всего для: Интерактивных и десктопных систем, многопользовательских сред
none
- Принцип работы: Без планировщика, запросы передаются напрямую
- Особенности: Минимальные накладные расходы
- Лучше всего для: Быстрых устройств с собственными алгоритмами оптимизации
3. Анализ целесообразности изменения планировщиков
Для vdd (основное хранилище данных):
Проблемы: 100% утилизация, высокие задержки записи, OLAP-нагрузка с преобладанием чтения
Оценка альтернатив:
- Оставить mq-deadline:
- ✅ Приоритет чтения важен для OLAP
- ✅ Deadline механизм предотвращает голодание
- ❌ Не решает проблему 100% утилизации
- Перейти на kyber:
- ✅ Адаптивное управление очередями
- ✅ Хорошо для виртуализированных сред
- ❌ Разработан для быстрых SSD/NVMe (неизвестен тип накопителя)
- ❌ Меньший приоритет чтения перед записью
- Перейти на bfq:
- ❌ Большие накладные расходы
- ❌ Не оптимален для серверных нагрузок
- ❌ Может ухудшить производительность при 100% утилизации
- Перейти на none:
- ❌ Опасен при высоких очередях
- ❌ Может привести к полному захвату устройства одним процессом
- ❌ Требует тщательного мониторинга
Рекомендация для vdd: Оставить mq-deadline, но рассмотреть тонкую настройку параметров
Для vdc (журнал транзакций):
Текущее состояние: Умеренная нагрузка, только запись, хорошая производительность
Оценка альтернатив:
- Оставить mq-deadline:
- ✅ Стабильная работа подтверждена данными
- ✅ Хорошо справляется с последовательной записью
- ✅ Deadline механизм важен для журналов
- Перейти на kyber:
- ✅ Возможна оптимизация задержек
- ❌ Незначительный потенциальный выигрыш
Рекомендация для vdc: Оставить mq-deadline
4. Тонкая настройка mq-deadline для vdd
Если устройство vdd — это HDD (вероятно, учитывая высокие задержки):
# Увеличение времени дедлайна для записи (по умолчанию 5 секунд)
echo 10000 > /sys/block/vdd/queue/iosched/write_expire
# Уменьшение времени дедлайна для чтения (по умолчанию 500 мс)
echo 250 > /sys/block/vdd/queue/iosched/read_expire
# Увеличение размера пакета (может улучшить пропускную способность)
echo 16 > /sys/block/vdd/queue/iosched/fifo_batch
# Увеличение количества запросов в очереди (осторожно!)
echo 256 > /sys/block/vdd/queue/nr_requests
Если устройство vdd — это SSD:
# Уменьшение времени дедлайна для записи
echo 5000 > /sys/block/vdd/queue/iosched/write_expire
# Уменьшение времени дедлайна для чтения
echo 100 > /sys/block/vdd/queue/iosched/read_expire
# Увеличение размера пакета для SSD
echo 32 > /sys/block/vdd/queue/iosched/fifo_batch
# Рассмотреть переход на kyber
echo kyber > /sys/block/vdd/queue/scheduler
5. Мониторинг и тестирование изменений
Прежде чем вносить изменения:
# Сохранить текущие настройки
cat /sys/block/vdd/queue/iosched/* > ~/mq-deadline-backup.txt
После изменений мониторить:
# Глубина очереди
cat /sys/block/vdd/queue/nr_requests
# Статистика планировщика
cat /sys/block/vdd/queue/iosched/*
# Производительность в реальном времени
iostat -x 1
6. Выводы и рекомендации
Основной вывод:
Текущий выбор планировщика (mq-deadline) является оптимальным для текущей нагрузки, учитывая:
- Преобладание операций чтения на vdd
- Последовательную запись на vdc
- Высокую утилизацию устройств
Рекомендации по оптимизации:
Определить тип накопителя vdd:
cat /sys/block/vdd/queue/rotational
Если 1 — HDD, оставлять mq-deadline с тонкой настройкой
Если 0 — SSD, можно протестировать kyber
Настройка параметров mq-deadline для vdd:
# Для HDD
echo 10000 > /sys/block/vdd/queue/iosched/write_expire
echo 250 > /sys/block/vdd/queue/iosched/read_expire
# Проверить результат
iostat -x 1 | grep vdd
A/B тестирование (только в периоды низкой нагрузки):
# Тест kyber
echo kyber > /sys/block/vdd/queue/scheduler
# Мониторить 15-30 минут
# Вернуть обратно при ухудшении
echo mq-deadline > /sys/block/vdd/queue/scheduler
Документирование изменений:
Зафиксировать исходные параметры
Записать все изменения
Сравнить метрики "до" и "после"
Критическое предупреждение:
Основная проблема vdd — 100% утилизация и высокие задержки. Изменение планировщика не решит эту проблему кардинально.
Необходимо:
- Увеличить ресурсы (RAM, быстрые диски)
- Оптимизировать запросы СУБД
- Рассмотреть балансировку нагрузки между несколькими дисками
Планировщик — это инструмент управления очередями, а не увеличения пропускной способности устройства.
Анализ основан на данных мониторинга от 05.01.2026 и текущей конфигурации планировщиков.