Найти в Дзене
Linux заметки

CPU планировщики Linux. Актуальная информация

Оглавление

В этой статье пойдёт разбор актуальных на 2022 год CPU планировщиков ядер Linux (vanilla and custom), которые можно разделить на производные от CFS и BFS

CFS

(«Совершенно честный планировщик»)

CFS, который стал частью ядра Linux 2.6.23 в 2007 году, является классом планирования для нормальных (в отличие от реального времени) процессов и поэтому называется SCHED_NORMAL.

CFS предназначен для интерактивных приложений, типичных для среды настольных компьютеров, но его можно настроить как SCHED_BATCH, чтобы использовать пакетные рабочие нагрузки, типичные, например, для большого объема веб-сервера. В любом случае, CFS нарушает то, что можно назвать "классическим упреждающим планированием".

Лучшее описание что я читал можно посмотреть здесь. Коротко и без вагона технических терминов.

Даже при наличии сейчас множества кастомных ядер пользователь всё равно встречается с CFS, а иногда и просто видит его версию с твиками. Специально искать ядро с этим планировщиком Вам не понадобится. К слову популярное сейчас ядро Linux Zen, как раз с теми самими твиками.

На сайте ядра Liquorix приводятся конфиг тюнинга CFS, однако в GIT ядра Zen данные надо искать в файлах.

MuQSS

Планировщик MuQSS (родившийся из "Brain Fuck Scheduler") призван улучшить отзывчивость системы для настольных компьютеров и других рабочих нагрузок. Начиная с Linux 4.20-cl1, Коливас работает над улучшением пропускной способности. MuQSS - это BFS с несколькими очередями выполнения, по одной на каждый процессор. Вместо связанных списков, очереди были реализованы как списки пропусков.

Подробное и хорошее описание (EN)

Разработка прекращена. Входит в состав Linux CK, который в стадии поддержки, по крайней мере для Arch. (AUR)

PDS-MQ

Планировщик PDS расшифровывается как "планировщик множественных очередей на основе приоритетов и дедлайнов Skiplist", который является производным от бывшего планировщика BFS Кона Коливаса с поддержкой очереди переменного выполнения (VRQ), но при этом отличается от текущего планировщика MuQSS. Принципы проектирования PDS заключаются в том, чтобы быть простым планировщиком процессов процессора, но при этом эффективным и масштабируемым.

Есть в одной из версий ядра Liquorix, доступен в AUR

BMQ "BitMap Queue"

Планировщик BMQ "BitMap Queue" был создан на основе имеющегося опыта разработки PDS и вдохновлен планировщиком, найденным в Zircon от Google, ядре, на котором работает их инициатива Fuchsia OS.

BMQ имеет простую конструкцию по сравнению с PDS и в результате дает на ~20 КБ меньше в размере патча и ~4 КБ в сжатом бинарном размере ядра.

Для Arch можно скачать файлом из репозитория, либо установить из AUR c CachyOS патчами.

Project C

В 2020 году Альфредом Ченом был анонсирован кросс-проект по рефакторингу BMQ в Project C, с пересозданием PDS на основе кодовой базы Project C. Таким образом это слияние двух проектов, с последующим обновлением PDS в виде Project C.

Доступен для установки из AUR

CacULE и его производные

CacULE

Форк CFS состоящий из набора патчей и изменений

Особенности:

  • Каждый процессор имеет свою собственную очередь выполнения.
  • NORMAL runqueue представляет собой связанный список sched_entities (вместо RB-Tree).
  • RT и другие runqueue такие же, как и у CFS.
  • Задачи пробуждения вытесняют текущие задачи, если значение показателя интерактивности выше.

Показатель интерактивности CacULE

Оценка интерактивности основана на планировщике ULE (планировщик FreeBSD). CacULE не заменяет CFS на ULE, он только изменяет механизм выбора следующей задачи CFS на механизм оценки интерактивности ULE для выбора следующей задачи для запуска.

Также имеет версию с экспериментальным балансировщиком Response Driven Balancer (RDB). Это легкий балансировщик нагрузки, который является заменой балансировщика нагрузки CFS. Он мигрирует задачи на основе баллов их интерактивности.

Бенчмарки от разрабов присутствуют. Но планировщик на стадии поддержки. К слову один из разаботчиков очень общительный и находит время на ответы пользователем в группе Телеграма, чем я и воспользовался.

Доступен для установки из AUR

Task Type (TT) scheduler

Планировщик процессора Task Type является преемником набора патчей CacULE, или планировщика, кому как удобнее. Целью планировщика Task Type (TT) является определение типов задач на основе их поведения и управление планированием на основе их типов.

Существует 5 типов:

  • REALTIME
  • INTERACTIVE
  • NO_TYPE
  • CPU_BOUND
  • BATCH

Преимущество типов задач заключается в том, что они позволяют планировщику иметь больше контроля и выбирать лучшую задачу для следующего запуска в CPU.

TT дает RT-задачам приоритет -20 при вычислении vruntime. Это повышает эффективность RT-задач по сравнению с другими задачами. Правила вытеснения являются чисто HRRN, где RT-задачи имеют приоритет, поскольку их время выполнения относительно меньше, чем у других типов. Причина использования HRRN вместо жесткого выбора уровня заключается в том, чтобы сгладить предварительное решение и предотвратить возможность голодания.

В стадии поддержки, но при этом досих пор актуален и его даже советуют. К слову кастомное ядро XanMod использует именно его, бенчмарки которого я также приложу к статье. Но сразу предупрежу, XanMod, как и другие кастомные ядра содержит набор патчей, так что всю "славу" от показателей бенчмарка не стоит визуализировать просто на один лишь планировщик.

Установить для Arch можно из AUR. Для других дистрибутивов доступен в составке кастом ядра Xanmod.

Baby

Baby Scheduler, от создателя CacULE, очень легкий и мощный для обычного использования. Пропускная способность Baby Scheduler выше благодаря балансировщику нагрузки задач, который создан для этого планировщика. Балансировка нагрузки осуществляется только на одном процессоре - CPU0, при этом CPU0 сканирует все остальные процессоры и перемещает одну задачу в каждый такт. Балансировка зависит только от количества задач (т.е. без нагрузки, веса или других факторов).

Планировщик Baby занимает всего 1036 LOC, из которых 254 LOC - это просто зависимые функции, скопированные из CFS без каких-либо изменений, чтобы позволить планировщику компилироваться и работать. Весь код Baby можно найти в bs.c, bs.h и numa_fair.h.

В настоящее время существует три варианта планировщика Baby

  • Deadline Scheduling (dl) - основной
  • Виртуальное планирование времени выполнения (vrt)
  • Round Robin Scheduling (rr).

Все три варианта имеют одинаковый метод балансировки нагрузки задач. Они отличаются только стратегией выбора следующей задачи для выполнения и другими незначительными различиями.

BORE (Burst-Oriented Response Enhancer)

BORE ещё один форк, основанный на CacULE.

Планировщик BORE сосредоточен на том, чтобы пожертвовать некоторой справедливостью ради меньшей задержки планирования интерактивных задач, он построен поверх CFS и корректируется только для обновления кода vruntime, поэтому общие изменения довольно малы по сравнению с другими неофициальными планировщиками CPU (например, CacULE, TT, Baby, Project C, MuQSS).

Результаты измерений jitterdebugger (построенные с помощью сопутствующих инструментов) представлены в виде гистограммы. Вертикальная ось - количество раз, а горизонтальная ось - распределение по времени (мкс). На графике видно, что BORE работает лучше, чем CFS, с точки зрения средней задержки планирования на CPU, а также с точки зрения хвостовой задержки (max в примере).

Для тех кто хочет провести тест. GIT AUR

sudo ./jitterdebugger -D 10m -c 'stress -c 48' -o res

Количество потоков должно быть указано больше чем у вашего процессора, там и видна вся "магия".

Установить планировщик для Arch можно из AUR

Итоги

Это лишь повторное знакомство с планировщиками, упоминания которых вы изредка могли видеть в интернете по отдельности, и актуализация информации на 2022 год. Здесь также упомянуты редко попадающие взору TT и Bore, форки CacULE. Так что данная статья не явлется чем-то радикально меняющим, но послужит вам в роли краткой заметки, включая полезные линки.

Буста ПК на много %, да и даже несколько % тоже не стоит ждать. Хотя к слову меня это не остановило и тест всё равно провёл, который к слову даже выкладывать нету смысла. Однако отзывчивость для некоторых задач можно поднять, для этого и были созданы форки, и форки форков, чтобы у пользователя было наличие выбора под его конкретные задачи.

Для тех кто желает проверить планировщики на отзывчивость системы есть небольшая утилита.

Для Arch семейства есть GUI-установщик ядер с выбором любого CPU планировщика CachyOS Kernel Manager. К слову удобный и функциональный.

P.S. на момент июня 2024 также появились (EEVDF) Earliest Eligible Virtual Deadline и (ECHO) Enhanced CPU Handling Orchestrator Scheduler by Hamad Marri

#linux schedulers