Перейти к содержимому

Учебник по sched-ext

Расширяемый класс планировщика, более известный как sched-ext, — это функция ядра Linux, которая позволяет реализовывать планировщики потоков ядра в BPF (Berkeley Package Filter) и динамически загружать их. По сути, это позволяет конечным пользователям изменять свои планировщики в пользовательском пространстве без необходимости собирать другое ядро только для того, чтобы иметь другой планировщик.

Методы запуска и управления планировщиками

  • Планировщики можно найти в пакетах scx-scheds и scx-scheds-git.
    Окно терминала
    # Стабильная ветка
    sudo pacman -S scx-scheds
    # Экспериментальная ветка (Эта ветка включает последние изменения
    # и может содержать планировщик, который еще не был выпущен.)
    sudo pacman -S scx-scheds-git

Запуск планировщика в терминале

  • Чтобы запустить планировщик, откройте терминал и введите следующую команду:
    Пример запуска rusty
    sudo scx_rusty

Это запустит планировщик rusty и отключит планировщик по умолчанию.

Чтобы остановить планировщик, нажмите CTRL + C, и планировщик будет остановлен, а планировщик ядра по умолчанию снова вступит в силу.

Служба Systemd

Пакет scx включает службу systemd, которая использует конфигурацию, указанную в файле /etc/default/scx.

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

  • Если вы хотите изменить планировщик, запускаемый службой, просто измените строку SCX_SCHEDULER= на планировщик, который вы хотите запускать по умолчанию.

    • Пример
      SCX_SCHEDULER=scx_lavd
  • Добавление флагов

    • Раскомментируйте SCX_FLAGS и добавьте нужные флаги.
      Пример
      SCX_FLAGS='--performance'

Теперь вы можете запускать/включать/останавливать планировщик, как если бы это была любая другая служба systemd.

Ознакомьтесь с кратким руководством по управлению им ниже.

Включение и запуск службы systemd
sudo systemctl enable --now scx
Запуск планировщика один раз через службу systemd
sudo systemctl start scx
Остановка планировщика SCX с помощью службы systemd
sudo systemctl stop scx

Для получения дополнительной информации об этой службе: Служба Sched-ext systemd

scx_loader

Как следует из названия, это утилита, которая функционирует как загрузчик и менеджер для фреймворка sched-ext, использующая интерфейс D-Bus.

Хотя она не требует systemd, ее все равно можно использовать вместе с ней. Ознакомьтесь с руководством по переходу для справки)

  • Имеет возможность останавливать, запускать, перезапускать, считывать информацию о планировщике scx и многое другое.
    • Вы можете использовать такие инструменты, как dbus-send или gdbus, для связи с ним.
  • В этом руководстве объясняется, как использовать scx_loader с командой dbus-send.
    • Запуск scx_rusty с аргументами по умолчанию
      dbus-send --system --print-reply --dest=org.scx.Loader /org/scx/Loader org.scx.Loader.StartScheduler string:scx_rusty uint32:0
    • Запуск планировщика с аргументами
      # В этом примере запускается scx_bpfland со следующими флагами: -k -c 0
      dbus-send --system --print-reply --dest=org.scx.Loader /org/scx/Loader org.scx.Loader.StartSchedulerWithArgs string:scx_bpfland array:string:"-k","-c","0"
    • Остановка текущего запущенного планировщика
      dbus-send --system --print-reply --dest=org.scx.Loader /org/scx/Loader org.scx.Loader.StopScheduler
    • Переключение на другой планировщик в режиме 2
      dbus-send --system --print-reply --dest=org.scx.Loader /org/scx/Loader org.scx.Loader.SwitchScheduler string:scx_lavd uint32:2
      # Это переключает на scx_lavd с режимом планировщика 2, что означает, что LAVD запускается в режиме энергосбережения
    • Переключение на другой планировщик с аргументами
      dbus-send --system --print-reply --dest=org.scx.Loader /org/scx/Loader org.scx.Loader.SwitchSchedulerWithArgs string:scx_bpfland array:string:"-k","-c","0"
    • Получение текущего запущенного планировщика
      dbus-send --system --print-reply --dest=org.scx.Loader /org/scx/Loader org.freedesktop.DBus.Properties.Get string:org.scx.Loader string:CurrentScheduler
    • Получение списка поддерживаемых планировщиков
      dbus-send --system --print-reply --dest=org.scx.Loader /org/scx/Loader org.freedesktop.DBus.Properties.Get string:org.scx.Loader string:SupportedSchedulers

Менеджер ядра CachyOS

Доступ к планировщикам scx и их настройка можно получить с помощью нового scx_loader.

Введение в основные планировщики

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

Не стесняйтесь сообщать о любых проблемах или отзывах на их GitHub, указанном ниже.

scx_bpfland

Разработано: Andrea Righi (arighi GitHub)

Планировщик sched_ext на основе vruntime, который отдает приоритет интерактивным рабочим нагрузкам. Очень гибкий и легко адаптируемый.

При принятии решений о том, какие ядра использовать, Bpfland учитывает их кэш-макет и то, какие ядра имеют общий кэш L2/L3, что приводит к меньшему количеству промахов кэша = большей производительности.

Варианты использования:

  • Игры
  • Использование на рабочем столе
  • Мультимедиа/Аудиопроизводство
  • Отличная интерактивность при интенсивных рабочих нагрузках
  • Экономия энергии
  • Серверные рабочие нагрузки

scx_flash

Разработано: Andrea Righi (arighi GitHub)

Планировщик, который фокусируется на обеспечении справедливости между задачами и предсказуемости производительности. Этот планировщик представлен в качестве замены режима “lowlatency” в scx_bpfland.

Варианты использования:

  • Игры
  • Рабочие нагрузки, чувствительные к задержкам, такие как мультимедиа или обработка звука в реальном времени
  • Необходимость реагировать в перегруженных ситуациях
  • Стабильность производительности

scx_lavd

Разработано: Changwoo Min (multics69 GitHub).

Краткое введение в LAVD от Changwoo:

LAVD — это новый алгоритм планирования, который все еще находится в разработке. Он мотивирован игровыми рабочими нагрузками, которые критичны к задержкам и требуют интенсивного обмена данными. Он направлен на минимизацию скачков задержек при сохранении общей хорошей пропускной способности и справедливого использования времени ЦП между задачами.

Варианты использования:

  • Игры
  • Аудиопроизводство
  • Рабочие нагрузки, чувствительные к задержкам
  • Использование на рабочем столе
  • Отличная интерактивность при интенсивных рабочих нагрузках
  • Экономия энергии

Одной из основных и замечательных возможностей, которые включает LAVD, является Core Compaction. которая, не вдаваясь в технические подробности: Когда использование ЦП < 50%, в настоящее время активные ядра будут работать дольше и на более высокой частоте. Между тем, неактивные ядра будут оставаться в C-состоянии (Сон) в течение гораздо более длительного времени, что приведет к меньшему общему энергопотреблению.

scx_rusty

Разработано: David Vernet (Byte-Lab GitHub)

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

Варианты использования:

  • Игры
  • Рабочие нагрузки, чувствительные к задержкам
  • Использование на рабочем столе
  • Мультимедиа/Аудиопроизводство
  • Рабочие нагрузки, чувствительные к задержкам
  • Отличная интерактивность при интенсивных рабочих нагрузках
  • Экономия энергии

Для более подробного ознакомления с тем, что можно настроить для Rusty. Ознакомьтесь со справочной страницей

scx_rusty --help

Общие рекомендации

LAVD Autopilot & Autopower

Цитаты Changwoo Min:

  • В режиме автопилота планировщик регулирует свой режим питания Экономия энергии, Сбалансированный или Производительность в зависимости от нагрузки системы, в частности от использования ЦП

  • Autopower: Автоматически определяет режим питания планировщика на основе энергетического профиля системы, то есть EPP (Energy Performance Preference).

Окно терминала
# Autopower можно активировать с помощью следующего флага:
--autopower
# например:
scx_lavd --autopower

Отключить ananicy-cpp

Чтобы отключить/остановить ananicy-cpp, выполните следующую команду:

Окно терминала
systemctl disable --now ananicy-cpp

Переход от scx.service к scx_loader: Подробное руководство

Начнем с подробного сравнения структуры файла scx.service со структурой файла конфигурации scx_loader.

Если у вас ранее был запущен LAVD со старым scx.service, как в примере ниже:

Структура файла scx.service
# Список scx_schedulers: scx_bpfland scx_central scx_flash scx_lavd scx_layered scx_nest scx_qmap scx_rlfifo scx_rustland scx_rusty scx_simple scx_userland
SCX_SCHEDULER=scx_lavd
# Установите пользовательские флаги для планировщика
SCX_FLAGS='--performance'

Тогда эквивалент в файле конфигурации scx_loader будет выглядеть так:

Структура файла scx_loader
default_sched = "scx_lavd"
default_mode = "Auto"
[scheds.scx_lavd]
auto_mode = ["--performance"]

Для получения дополнительной информации о том, как настроить файл scx_loader

Следуйте приведенному ниже руководству для простого перехода от службы systemd scx к новой утилите scx_loader.

  1. Отключение scx.service в пользу scx_loader.service
    systemctl disable --now scx.service && systemctl enable --now scx_loader.service
  2. Создание файла конфигурации для scx_loader и добавление структуры по умолчанию
    # Редактор Micro собирается создать новый файл.
    sudo micro /etc/scx_loader.toml
    # Добавьте следующие строки:
    default_sched = "scx_bpfland" # Измените эту строку на планировщик, который вы хотите, чтобы scx_loader запускал при загрузке
    default_mode = "Auto" # Возможные значения: "Auto", "Gaming", "LowLatency", "PowerSave".
    # Нажмите CTRL + S, чтобы сохранить изменения, и CTRL + Q, чтобы выйти из Micro.
  3. Перезапуск scx_loader
    systemctl restart scx_loader.service
    • Готово, scx_loader теперь загрузит и запустит желаемый планировщик.

Отладка в scx_loader

  • Проверка статуса сервиса
    systemctl status scx_loader.service
  • Просмотр всех записей журнала сервиса
    journalctl -u scx_loader.service
  • Просмотр только журналов текущего сеанса.
    journalctl -u scx_loader.service -b 0
  • Расширенное ведение журнала

Чтобы получить более подробный журнал, выполните следующие действия.

  1. Редактировать файл сервиса
    sudo systemctl edit scx_loader.service
  2. Добавьте следующую строку в раздел [Service]
    Environment=RUST_LOG=trace
  3. Перезапустите сервис
    sudo systemctl restart scx_loader.service
  • Снова проверьте журналы для получения более подробной информации об отладке.

FAQ

Почему планировщик X работает хуже, чем другие?

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

Почему все говорят, что этот планировщик X лучше всего подходит для X случая, но у меня он работает не так хорошо?

  • Как и в предыдущем ответе, выбор ЦП и его конструкция, такая как расположение ядер, то, как они совместно используют кэш между ядрами, и другие связанные факторы, могут привести к менее эффективной работе планировщика.
  • Вот почему наличие выбора является одним из основных преимуществ фреймворка sched-ext, поэтому не бойтесь попробовать и посмотреть, какой из них лучше всего подходит для вашего случая использования. Примеры: стабильность FPS, максимальная производительность, отзывчивость при интенсивных нагрузках и т. д.

Варианты использования этих планировщиков довольно похожи… почему так?

  • В первую очередь потому, что это многоцелевые планировщики, а это означает, что они могут справляться с различными рабочими нагрузками, даже если они не преуспевают во всех областях.

  • Чтобы определить, какой планировщик подходит вам лучше всего, нет лучшего совета, чем попробовать его самостоятельно.

Мне не хватает планировщика, о котором упоминают или тестируют некоторые пользователи на сервере CachyOS Discord.

Убедитесь, что вы используете самую новую версию пакета scx-scheds под названием scx-scheds-git

  • Одна из причин заключается в том, что этот планировщик очень новый и в настоящее время тестируется пользователями, поэтому он еще не добавлен в пакет scx-scheds-git.

Почему планировщик внезапно упал? Он нестабилен?

  • Этому может быть несколько причин:
    • Одна из самых распространенных причин заключается в том, что вы использовали ananicy-cpp вместе с планировщиком. Именно поэтому мы добавили это предупреждение
    • Другой причиной может быть то, что рабочая нагрузка, которую вы выполняли, превысила лимиты и возможности планировщика, что привело к его остановке.
      • Пример необоснованной рабочей нагрузки: hackbench
    • Или более очевидная причина: вы обнаружили ошибку в планировщике, если это так. Пожалуйста, сообщите об этом как о проблеме в их GitHub или сообщите им об этом в канале CachyOS Discord sched-ext

Я ранее использовал scx_loader в графическом интерфейсе Kernel Manager. Нужно ли мне все еще выполнять шаги перехода?

  • В этом конкретном случае нет, это не обязательно, потому что Kernel Manager уже обрабатывает процесс перехода.
    • Если вы ранее не добавляли пользовательские флаги в /etc/default/scx и все еще хотите их использовать.

Узнать больше

Если вы хотите узнать больше о фреймворке sched-ext. Посмотрите на ссылки ниже.