В ядре Linux появится возможность использования eBPF для создания планировщиков задач

Линус Торвальдс выразил готовность принять в состав ядра Linux 6.11, релиз которого ожидается в конце сентября, патчей с реализацией механизма «sched_ext» (SCX), позволяющего использовать eBPF для создания планировщиков CPU, охватывающих практически все аспекты планирования выполнения задач и распределения ресурсов CPU. Подобные планировщики могут загружаться динамически и выполняться внутри ядра Linux в виртуальной машине eBPF, в которой благодаря применению JIT-компиляции байткод транслируется в машинные инструкции и выполняется с производительностью скомпилированного кода.

Предложенные патчи реализуют новый класс планирования SCHED_EXT, для которого выставлен приоритет вызова ядром между классами SCHED_IDLE и SCHED_NORMAL, что не позволяет в BPF-обработчиках, привязанных к SCHED_EXT, повлиять на задачи, уже прикреплённые к штатному планировщику задач (SCHED_NORMAL), но даёт возможность прикрепления к SCHED_EXT отдельных задач или перемещения для обработки с его помощью всех процессов, имеющих приоритет ниже выполнения в режиме реального времени. Если к SCHED_EXT не привязаны BPF-обработчики, то все процессы, перемещённые в класс SCHED_EXT, будут обрабатываться при помощи планировщика SCHED_NORMAL. Работа BPF-обработчиков сводится с разбору очередей задач, ожидающих выполнения на CPU (одна глобальная очередь и по одной очереди на ядро CPU), и выбора задачи, которой следует предоставить ресурсы CPU при освобождении очередного ядра CPU.

Механизм sched_ext упрощает создание специфичных для определённых задач планировщиков, даёт возможность экспериментировать с различными техниками и стратегиями планирования, а также позволяет быстро создавать рабочие прототипы и заменять планировщики на лету в рабочих инфраструктурах. Например, при помощи sched_ext можно создать планировщик, учитывающий специфику определённого приложения и динамически меняющий стратегию планирования его выполнения в зависимости от состояния системы и каких-то дополнительных факторов.

В настоящее время уже развивается около десятка планировщиков на базе sched_ext, логика планирования задач в которых определяется в пространстве пользователя и загружается в ядро в форме BPF-программ:

  • scx_layered — гибридный планировщик задач, разделяющий задачи на слои, для каждого из которых применяется своя стратегия планирования. Например, scx_layered позволяет выделить в отдельный слой некоторые задачи, для которых будет предоставлены определённые гарантированные ресурсы CPU, или повысить приоритет отдельных приложений. Планировщик развивается компанией Meta. Работающая в пространстве пользователя логика генерации BPF написана на языке Rust.
  • scx_rustland — планировщик оптимизирован для повышения приоритета интерактивных задач на фоне задач, интенсивно нагружающих CPU. Например, в тесте запуска игрового приложения Terraria одновременно со сборкой ядра планировщик scx_rustland позволил добиться в игре более высокого FPS, чем при использовании штатного планировщика EEVDF. Проект развивается сотрудником компании Canonical. Работающая в пространстве пользователя логика генерации BPF написана на языке Rust.
  • scx_lavd — реализации алгоритма планирования задач LAVD (Latency-criticality Aware Virtual Deadline), учитывающего актуальность снижения задержек для конкретных задач и использующего информацию о ходе выполнения процессов при принятии решений о распределении ресурсов CPU. Планировщик развивается компаниями Igalia и Valve для снижения задержек в компьютерных играх и интерактивных задачах. Работающая в пространстве пользователя логика генерации BPF написана на языке Rust.
  • scx_rusty, scx_rlfifo, scx_mitosis — примеры планировщиков с компонентами в пространстве пользователя на языке Rust, реализующие балансировку между группами задач в зависимости от нагрузки, простейший FIFO-планировщик и планировщик для привязки групп задач к ядрам CPU.
  • scx_central, scx_flatcg, scx_nest, scx_pair, scx_qmap, scx_simple, scx_userland — примеры планировщиков c компонентами в пространстве пользователя на языке Си, иллюстрирующие различные возможности sched-ext.

Изначально механизм sched_ext был предложен для рассмотрения разработчиками ядра в 2022 году, после чего было опубликовано шесть редакций патча. Несмотря на отсутствие поддержки в основном составе ядра, для дистрибутивов Ubuntu, Arch Linux, Fedora и NixOS предоставлена возможность установки sched_ext через дополнительные пакеты. Компания Canonical рассматривает возможность включения компонентов sched-ext в состав Ubuntu 24.10, а компания Valve работает над интеграцией sched_ext в Steam Deck. В компании Meta планировщик на базе sched_ext уже применяется в рабочей инфраструктуре.

Компания Google экспериментирует с использованием собственного фреймворка ghOSt, позволяющего влиять на решения планировщика задач при помощи BPF-программ. В настоящее время началась работа по портированию ghOSt на sched_ext. Google также развивает порт sched_ext для ChromeOS с намерением использовать его для задействования гибридного планировщика scx_layered для сокращения задержек без использования расширений для работы в режиме реального времени. Компания Oculus развивает порт sched_ext для Android.

Источник: http://www.opennet.ru/opennews/art.shtml?num=61354