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

Ответ

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

Основные типы планировщиков:

  • CFQ (Completely Fair Queuing): Старый планировщик по умолчанию для HDD. Создает отдельные очереди для каждого процесса, пытаясь справедливо распределить пропускную способность диска.
  • Deadline: Гарантирует, что запрос будет обработан в течение заданного времени (дедлайна). Сортирует запросы по LBA (логическому адресу блока) для минимизации seek time, но приоритезирует запросы, у которых истекает дедлайн. Хорош для баз данных.
  • NOOP (No Operation): Простая очередь FIFO (First In, First Out). Не выполняет сортировку. Идеален для SSD и виртуальных дисков в облаке, где нет механических задержек на позиционирование.
  • Kyber: Современный планировщик, появившийся в ядре 4.12. Адаптируется к характеристикам устройства, управляя глубиной очереди для контроля задержек (latency). Хорошо подходит как для быстрых NVMe, так и для медленных дисков.

Практическое использование:

  1. Проверить текущий планировщик для диска /dev/sda:
    cat /sys/block/sda/queue/scheduler
    # Вывод: [mq-deadline] kyber bfq none
    # Активный планировщик указан в квадратных скобках — mq-deadline.
  2. Временно изменить планировщик на kyber:
    echo kyber | sudo tee /sys/block/sda/queue/scheduler
  3. Выбор планировщика в инфраструктуре:
    • Для HDD и гибридных систем: deadline или bfq (Budget Fair Queueing).
    • Для SSD/NVMe в серверах и облаке: none (аналог NOOP для multiqueue) или kyber.
    • Для десктопов с SSD: bfq для лучшей интерактивности.

Правильный выбор планировщика — это часть тюнинга производительности дисковой подсистемы, особенно под высокую нагрузку (базы данных, веб-серверы).

Ответ 18+ 🔞

А, ну это же про планировщики ввода-вывода в Линуксе! Ёпта, история древняя, как мир. Представь себе, что твой жёсткий диск — это охуенно ленивый мужик, который не хочет головой мотать туда-сюда. А ему постоянно кричат: «Дай файл отсюда! А теперь отсюда!». Так вот, планировщик — это такой начальник цеха, который кричит: «Э, сабака сука, э бошка думай! Не бегай как угорелый, собери все заказы с одного района, а потом вали в другой!».

Основные типы этих самых начальников:

  • CFQ (Completely Fair Queuing): Это старый пердун, который пытался всех рассадить по справедливости. Каждому процессу — своя очередь, всем сестрам по серьгам. Для древних HDD норм было, но сейчас он уже, бля, как будто на дворе 2002-й год. Накрылся медным тазом в новых ядрах, его выпилили.
  • Deadline: А вот это уже хитрая жопа. Он говорит: «Ладно, я всё отсортирую по адресам, чтобы голова меньше моталась, НО! Если какой-то запрос слишком долго ждёт — ему пизда рулю, он идёт вне очереди, чтоб дедлайн не проёбан». Для баз данных — самое то.
  • NOOP (No Operation): А это похуист. Его девиз — «Да похуй». Пришёл запрос — встал в хвост очереди. Первый пришёл — первый ушёл. Никакой сортировки. Зачем она, если у тебя SSD, где нет этой ебаной механики? Идеально для облаков и быстрых дисков.
  • Kyber: Это уже современный умник. Он не просто сортирует, он ещё и подозрение ебать чувствует. Смотрит, как устройство откликается, и сам на лету регулирует глубину очереди, чтобы задержки не зашкаливали. Универсальный солдат, подходит и для быстрых NVMe, и для медленных дисков.

Ну и как этим пользоваться, чувак?

  1. Глянуть, какой у тебя сейчас начальник на диске /dev/sda (а то мало ли, пидарас шерстяной какой-нибудь стоит):

    cat /sys/block/sda/queue/scheduler
    # Вывод: [mq-deadline] kyber bfq none
    # Кто в квадратных скобках — тот у руля. Тут `mq-deadline`.

    Видишь mq-deadline? Это современная версия старого deadline для новых систем.

  2. Быстренько поменять его на kyber (временно, до перезагрузки):

    echo kyber | sudo tee /sys/block/sda/queue/scheduler

    Всё, хитрая жопа сменила дедлайнового пердуна.

  3. А какой вообще ставить?

    • Если коптишь старый HDD или гибридную систему — mq-deadline или bfq (это такой потомок CFQ, но поумнее).
    • Если у тебя SSD/NVMe в сервере — либо none (это и есть NOOP для новых систем), либо kyber. Доверия ебать ноль к сложным алгоритмам, когда железо и так быстрое.
    • Для домашнего компа с SSD, где ты и в игрушки играешь, и фильмы качаешь — bfq может быть лучше, он интерактивность поднимает.

Короче, выбор планировщика — это такая тонкая ебля колотить, часть настройки производительности. Если у тестя база данных жрёт ресурсов овердохуища, а ты поставил не тот — будет тебе хиросима и нигерсраки с дисковыми задержками.