Перейти к содержимому
Эта страница устарела. Актуальную документацию можно найти по адресу: /configuration/sched-ext/

Руководство по sched-ext

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

  • Планировщики можно найти в пакетах scx-scheds и scx-scheds-git.

    Окно терминала
    # Стабильная ветка + утилиты scx_loader и scxctl.
    sudo pacman -S scx-scheds scx-tools
    # Передовая ветка (эта ветка включает последние изменения из ветки master) + утилиты scx_loader и scxctl.
    sudo pacman -S scx-scheds-git scx-tools-git
  • Чтобы запустить планировщик, откройте терминал и введите следующую команду:
    Пример запуска rusty
    sudo scx_rusty

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

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

Руководство по планировщикам: Профили и сценарии использования

Заголовок раздела «Руководство по планировщикам: Профили и сценарии использования»

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

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

Используйте scx_имя_планировщика --help, чтобы увидеть доступные флаги и краткое описание их функций.

Пример получения справки для scx_rusty
scx_rusty --help

Разработчик: Andrea Righi (arighi GitHub)

Готов к использованию в production?

scx_beerland — это планировщик, разработанный для приоритезации локальности данных и масштабируемости.

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

  • Сценарии использования:
    • Нагрузки, интенсивно использующие кэш
    • Системы с большим количеством ЦП
    • Игры: известно, что он на удивление хорошо работает в некоторых играх, хотя ваш опыт может отличаться
    • Сервер: хорошо подходит для серверных нагрузок общего назначения благодаря оптимизации локальности и масштабируемости.
    • Может также использоваться на настольных компьютерах.

На данный момент отсутствуют.

Разработчик: Andrea Righi (arighi GitHub)

Готов к использованию в production?

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

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

  • Сценарии использования:
    • Игры
    • Использование на настольном компьютере
    • Производство мультимедиа/аудио
    • Отличная интерактивность при интенсивных нагрузках
    • Энергосбережение
    • Сервер
  • Флаги командной строки: -m performance -w
  • Описание: Предназначен для снижения задержки за счет пропускной способности. Подходит для приложений мягкого реального времени, таких как обработка аудио и мультимедиа.
  • Флаги командной строки: -s 20000 -m powersave -I 100 -t 100
  • Описание: Приоритезирует энергоэффективность. Отдает предпочтение менее производительным ядрам (например, E-ядрам на Intel).
  • Флаги командной строки: -s 20000 -S
  • Описание: Приоритезирует задачи со строгим сродством (affinity). Эта опция может увеличить пропускную способность за счет задержки и больше подходит для серверных нагрузок.

Разработчик: RitzDaCat (RitzDaCat GitHub)

  • Готов к использованию в production?

scx_cake — это экспериментальный BPF планировщик ЦП, адаптирующий алгоритм CAKE для сетевых пакетов с помощью DRR++ (Deficit Round Robin++) для планирования ЦП.

  • 4-уровневая классификация — задачи сортируются по среднему времени выполнения EWMA на уровни Critical / Interactive / Frame / Bulk
  • Отсутствие глобальных атомиков — массивы BSS для каждого ЦП с записями под защитой MESI устраняют блокировку шины
  • Выбор простоя, делегированный ядру — scx_bpf_select_cpu_dfl() для авторитетного выбора ЦП без устаревших данных
  • Шардинг DSQ на уровне LLC — устраняет конкуренцию за блокировки между CCD на многочиплетных ЦП
  • Отслеживание дефицита DRR++ — алгоритм справедливости потоков сети CAKE, адаптированный для планирования задач ЦП

Разработан для игровых нагрузок на современном оборудовании AMD и Intel.

  • Сценарии использования:
    • Игры

scx_cake классифицирует каждую задачу по одному из четырёх уровней на основе её EWMA (экспоненциально взвешенного скользящего среднего) времени выполнения. Классификация выполняется автоматически и непрерывно — задачи перемещаются между уровнями по мере изменения их поведения.

УровеньНазваниеavg_runtimeТипичная нагрузкаКвантГолодание
T0Critical< 100µsIRQ-обработчики, драйверы ввода, аудио (PipeWire), сеть0.5ms3ms
T1Interactive< 2msКомпозиторы, физика игр, ИИ игр, короткие рабочие потоки2.0ms8ms
T2Frame< 8msПотоки рендеринга игр, кодирование видео4.0ms40ms
T3Bulk≥ 8msКомпиляция, фоновая индексация, пакетные задачи8.0ms100ms

[!TIP] Ни одна игровая задача не должна находиться в T3. Потоки рендеринга игр выполняются 2–8 мс на кадр → T2. Физика/ИИ выполняются 0,5–2 мс → T1. Обработчики ввода выполняются < 100 мкс → T0. В T3 попадают только задачи, выполняющие более 8 мс непрерывной работы ЦП (компиляция шейдеров, экраны загрузки).

  1. Начальное размещение: на основе значения nicenice < 0 → T0, nice 0-10 → T1, nice > 10 → T3
  2. Авторитет времени выполнения: после ~3 остановок EWMA avg_runtime становится авторитетным. Задача с nice -5, выполняющаяся по 50 мс, будет реклассифицирована в T3 независимо от значения nice.
  3. Гистерезис: мёртвая зона 10% предотвращает колебания на границах уровней. Повышение требует, чтобы avg_runtime был явно ниже порогового значения; понижение происходит немедленно.
  4. Постепенное снижение частоты: как только уровень остаётся стабильным в течение 3+ последовательных остановок, частота реклассификации снижается для каждого уровня: T0 проверяется каждую 1024-ю остановку, T3 — каждую 16-ю. Нестабильность сбрасывает до полной частоты проверок.

Адаптировано из алгоритма справедливости потоков сети CAKE:

  • Каждая задача начинает с дефицита (квант + бонус нового потока ≈ 10 мс кредита)
  • Каждое исполнение потребляет дефицит пропорционально времени выполнения
  • При исчерпании дефицита → бонус нового потока удаляется → задача конкурирует в обычном режиме
  • Это даёт вновь порождённым потокам (игра, запускающая рабочий поток) мгновенную отзывчивость, которая естественным образом затухает

Каждый уровень отображается на целевую производительность ЦП через таблицу поиска RODATA:

УровеньЦельОбоснование
T0-T2100% (максимальная частота)Игровые нагрузки требуют полной производительности
T375%Фоновая работа может выполняться немного медленнее для экономии энергии

На гибридных ЦП Intel (has_hybrid = true) цели масштабируются по cpuperf_cap каждого ядра для предотвращения избыточного запроса частоты на E-ядрах.

ПрофильКвантГолоданиеСценарий использования
gaming2ms100ms(По умолчанию) Сбалансирован для большинства игр
esports1ms50msСоревновательный шутер от первого лица, сверхнизкая задержка
legacy4ms200msСтарые ЦП, экономия заряда батареи
default2ms100msПсевдоним для gaming
АргументПо умолчаниюОписание
--profile, -p <PROFILE>gamingВыбрать предустановленный профиль
--quantum <µs>профильБазовый временной срез в микросекундах
--new-flow-bonus <µs>профильДополнительный дефицит для только что разбуженных задач
--starvation <µs>профильМаксимальное время выполнения до принудительного вытеснения
--verbose, -vfalseВключить отображение статистики TUI в реальном времени
--interval <secs>1Интервал обновления TUI

Тонкая настройка по уровням (игровой профиль)

Заголовок раздела «Тонкая настройка по уровням (игровой профиль)»
УровеньМножитель квантаЭффективный срезЛимит голодания
T0 Critical0.75x1.5ms3ms
T1 Interactive1.0x2.0ms8ms
T2 Frame1.2x2.4ms40ms
T3 Bulk1.4x2.8ms100ms

Разработчик: Andrea Righi (arighi GitHub)

  • Готов к использованию в production?

Легковесный планировщик, оптимизированный для сохранения локальности «задача-ЦП».

Когда система не насыщена, планировщик отдает приоритет удержанию задач на одном и том же ЦП с помощью локальных DSQ. Это не только сохраняет локальность, но и снижает конфликты блокировок по сравнению с общими DSQ, обеспечивая хорошую масштабируемость на многих ЦП.

  • Сценарии использования:
    • Планировщик общего назначения: планировщик должен адаптироваться как для серверных, так и для настольных рабочих нагрузок.
  • Флаги командной строки: -s 20000 -d -c 0 -p 0
  • Описание: Жертвует локальностью кэша и энергоэффективностью ради равномерного распределения по всем ЦП. Больше ориентирован на интерактивные нагрузки.
  • Флаги командной строки: -c 0 -p 0
  • Описание: Отключает отслеживание загрузки ЦП и всегда применяет планирование на основе крайних сроков для улучшения отзывчивости.
  • Флаги командной строки: -m powersave -d -p 5000
  • Описание: Приоритезирует энергоэффективность. Отдает предпочтение менее производительным ядрам (например, E-ядрам на Intel) и отключает отложенные пробуждения, снижая пропускную способность при одновременном повышении энергоэффективности. Интервал опроса загрузки ЦП увеличен до 5 мс.
  • Флаги командной строки: -m performance -c 0 -p 0 -w
  • Описание: Предназначен для снижения задержки за счет пропускной способности. Подходит для приложений мягкого реального времени, таких как обработка аудио и мультимедиа. Всегда применяет планирование на основе крайних сроков и синхронные оптимизации пробуждения для улучшения предсказуемости производительности.
  • Флаги командной строки: -s 20000
  • Описание: Включает сродство к адресному пространству для улучшения локальности и производительности в некоторых нагрузках, чувствительных к кэшу. Интервал опроса увеличен до 20 мс.

Разработчик: Andrea Righi (arighi GitHub)

Готов к использованию в production?

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

Он работает по политике earliest deadline first (EDF), где каждой задаче присваивается весовой коэффициент «задержки». Этот вес динамически корректируется в зависимости от того, как часто задача освобождает ЦП до истечения полного временного кванта.

Задачи, которые освобождают ЦП раньше, получают более высокий весовой коэффициент задержки, что дает им приоритет перед задачами, которые полностью используют свой временной квант.

  • Сценарии использования:
    • Игры
    • Нагрузки, чувствительные к задержкам, такие как мультимедиа или обработка аудио в реальном времени
    • Необходимость отзывчивости в условиях перегрузки
    • Стабильность производительности
    • Сервер
  • Флаги командной строки: -m performance -w -C 0
  • Описание: Предназначен для снижения задержки за счет пропускной способности. Подходит для приложений мягкого реального времени, таких как обработка аудио и мультимедиа.
  • Флаги командной строки: -m all
  • Описание: Оптимизирует для высокой производительности в играх.
  • Флаги командной строки: -m powersave -I 10000 -t 10000 -s 10000 -S 1000
  • Описание: Приоритезирует энергоэффективность. Отдает предпочтение менее производительным ядрам (например, E-ядрам на Intel) и вводит принудительный цикл простоя каждые 10 мс для увеличения энергосбережения.
  • Флаги командной строки: -m all -s 20000 -S 1000 -I -1 -D -L
  • Описание: Настроен для серверных нагрузок. Жертвует отзывчивостью ради пропускной способности.

Разработчик: Changwoo Min (multics69 GitHub).

  • Готов к использованию в production?

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

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

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

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

  • Флаги командной строки: --performance
  • Описание: Максимизирует производительность за счет использования всех доступных ядер, отдавая приоритет физическим ядрам.
  • Флаги командной строки: --powersave
  • Описание: Минимизирует энергопотребление, сохраняя при этом приемлемую производительность. Отдает приоритет эффективным ядрам и потокам перед физическими ядрами.

Разработчик: Will Clingan (willclngn GitHub)

Планировщик с поведенческой классификацией, использующий оценку на основе EWMA (частота пробуждений, скорость переключения контекста, дисперсия времени выполнения) для сортировки задач по трём уровням диспетчеризации — LAT_CRITICAL, INTERACTIVE и BATCH — каждый из которых имеет свой временной срез, правила вытеснения и маршрутизацию DSQ. Механизм восстановления задержавшихся задач под вдохновением CoDel отслеживает время ожидания в пакетной очереди и восстанавливает стареющие задачи до их зависания, с пороговыми значениями, адаптированными к скорости диспетчеризации и количеству ядер. Двойное обнаружение всплесков (точка изменения CUSUM + счётчик частоты пробуждений) обрабатывает шторм форков, а адаптивный управляющий цикл Rust регулирует параметры планирования раз в секунду на основе обнаружения режима нагрузки и телеметрии гистограмм BPF.

Композиторы (KWin, GNOME Shell, Hyprland, Sway и другие) автоматически повышаются до LAT_CRITICAL. Постоянная база данных процессов изучает классификации задач между перезагрузками.

  • Сценарии использования:
    • Игры
    • Использование на настольном компьютере
    • Производство мультимедиа/аудио
    • Компиляция кодовой базы
    • Интерактивность при интенсивных нагрузках
    • Смешанные нагрузки
  • Флаги командной строки: (нет — адаптивный режим по умолчанию)
  • Описание: Полный адаптивный режим. Управляющий цикл Rust определяет режим нагрузки (LIGHT / MIXED / HEAVY) и регулирует параметры планирования в реальном времени. Лучший выбор для общего использования рабочего стола и игр.
  • Флаги командной строки: --no-adaptive
  • Описание: Отключает адаптивный управляющий цикл Rust. Планировщик BPF работает со статическими параметрами настройки. Меньше накладных расходов, полезно для бенчмаркинга или если адаптивный слой перекорректирует вашу нагрузку.
  • Флаги командной строки: -v или --verbose
  • Описание: Включает подробный вывод телеметрии, включая счётчики диспетчеризации по уровням, времена ожидания и статистику поведенческой классификации. Полезно для диагностики поведения планировщика.
  • Готов к использованию в production?
    • Да. Если правильно настроен для вашей конкретной нагрузки и оборудования.

Разработчик: Дэниел Ходжес (Daniel Hodges) (hodgesds GitHub)

Планировщик общего назначения, который фокусируется на балансировке нагрузки “выбери два” (pick two) между LLC. Сохраняет высокую локальность кэша и консервацию работы, обеспечивая при этом приемлемую задержку.

  • Сценарии использования:
    • Сервер
    • Настольные окружения
    • Игры (с некоторой ручной настройкой)
  • Флаги командной строки: --task-slice true -f --sched-mode performance
  • Описание: Улучшает стабильность производительности в играх и увеличивает смещение в сторону планирования на более производительных ядрах.
  • Флаги командной строки: -y -f --task-slice true
  • Описание: Снижает задержку за счет того, что интерактивные задачи сильнее “прилипают” к назначенному им ЦП, и увеличивает стабильность временного кванта.
  • Флаги командной строки: --sched-mode efficiency
  • Описание: Повышает энергоэффективность за счет приоритезации энергоэффективных ядер.
  • Флаги командной строки: --keep-running
  • Описание: Улучшает производительность серверных нагрузок, позволяя задачам выполняться дольше своего кванта времени, если ЦП простаивает.

Разработчик: Andrea Righi (arighi Github)

  • Готов к использованию в production?
    • Этот планировщик все еще является экспериментальным и не рекомендуется для использования в production.

scx_tickless — это ориентированный на серверы планировщик, разработанный для облачных вычислений, виртуализации и высокопроизводительных вычислений.

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

  • Сценарии использования:
    • Облачные вычисления
    • Виртуализация
    • Высокопроизводительные вычисления
    • Сервер
  • Флаги командной строки: -f 5000 -s 5000
  • Описание: Повышает производительность в играх за счет увеличения частоты обнаружения планировщиком конфликтов на ЦП и запуска переключений контекста с более коротким временным квантом.
  • Флаги командной строки: -f 50
  • Описание: Повышает энергоэффективность за счет снижения частоты проверок на конфликты.
  • Флаги командной строки: -f 5000 -s 1000
  • Описание: Аналогично игровому профилю, но с еще более коротким квантом времени.
  • Флаги командной строки: -f 100
  • Описание: Снижена частота проверок планировщиком на конфликты ЦП для улучшения пропускной способности за счет отзывчивости.

Разработчик: Andrea Righi (arighi GitHub)

Готов к использованию в production?

Для критически важных к производительности сценариев в production другие планировщики, вероятно, покажут лучшую производительность, так как перенос всех решений по планированию в пользовательское пространство имеет свою цену (пусть и минимальную).

Однако планировщик, полностью реализованный в пользовательском пространстве, обладает потенциалом для бесшовной интеграции со сложными библиотеками, инструментами трассировки, внешними сервисами (например, ИИ) и т. д.

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

Имеет сходства с bpfland, создан с целью быть легким для чтения и понимания его работы благодаря реализации в пользовательском пространстве.

Имейте в виду, что при использовании планировщика в пользовательском пространстве наблюдается небольшое снижение пропускной способности.

  • Сценарии использования:
    • Нагрузки с низкой задержкой (игры, видеоконференции и прямые трансляции)
    • Использование на настольном компьютере

Разработчик: Дэвид Вернет (David Vernet) (Byte-Lab GitHub)

  • Готов к использованию в production?
    • Да. При правильной настройке.

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

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

Конфигурация и тестирование производительности

Заголовок раздела «Конфигурация и тестирование производительности»

Цитаты от Changwoo Min:

  • В режиме автопилота планировщик регулирует свой режим энергопотребления — Powersave, Balanced или Performance — в зависимости от нагрузки на систему, а именно от загрузки ЦП.

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

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

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

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

Переключение профилей производительности scx_loader

Заголовок раздела «Переключение профилей производительности scx_loader»

Реализовано в пакете power-profiles-daemon, предоставляемом CachyOS, который включает в себя пользовательский патч для поддержки переключения профилей производительности scx_loader.

  • Если scx_loader запущен, то при использовании game-performance он автоматически переключит активный планировщик на профиль Gaming при запуске игры и вернется к профилю по умолчанию после ее закрытия.
  • При смене профилей производительности, например, в KDE Plasma или GNOME с помощью переключателя профилей, scx_loader автоматически переключится на соответствующий профиль планировщика:
Power ProfileScheduler Profile
Power SaverPower Save
BalancedAuto
PerformanceGaming

Бенчмаркинг и сравнение планировщиков с помощью cachyos-benchmarker

Заголовок раздела «Бенчмаркинг и сравнение планировщиков с помощью cachyos-benchmarker»

Инструмент cachyos-benchmarker предоставляет простой способ оценки и сравнения производительности различных планировщиков ЦП.

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

Включены следующие тесты:

ТестЧто измеряетИнструмент
stress-ng cpu-cache-memПроизводительность ЦП, кэша и памятиstress-ng
Компиляция FFmpegПроизводительность параллельной сборкиmake
Кодирование x265Пропускная способность кодирования видеоx265
Хеширование argon2Многопоточное хеширование паролейargon2
perf sched msgПереключение контекста и производительность IPCperf
perf memcpyПропускная способность памяти memcpy()perf
Вычисление простых чиселЦелочисленная арифметика и параллелизмprimesieve
NAMDМолекулярная динамика (научная нагрузка)namd3
Рендеринг в Blender3D-рендеринг только на ЦПblender
Сжатие xzПропускная способность сжатияxz
Сборка Kernel defconfigПроизводительность компиляции ядраmake
y-cruncherМатематическая точность и нагрузка на памятьy-cruncher

cachyos-benchmarker можно использовать для нескольких целей, в том числе:

  • Тестирование стабильности планировщика Запустите полный набор тестов для обнаружения зависаний, сбоев или регрессий, вызванных изменениями в планировщике. Если вы используете scx_loader, вы можете собрать логи в случае зависания или сбоя с помощью:
    Окно терминала
    journalctl --unit scx_loader.service --boot 0 > crash.log
    Это создаст файл с именем crash.log в вашем текущем каталоге.
  • Сравнение производительности планировщиков
    • Оцените различия в производительности между планировщиками. Например, BPFLAND против LAVD.
  • Измерение влияния обновлений ядра или планировщика
    • Сравните запуски до и после применения патчей или изменений версий, чтобы проверить наличие регрессий или улучшений производительности.
  • Тестирование настроек конфигурации
    • Оцените влияние изменений, таких как настройки регулятора ЦП, переключение SMT или изменённые флаги планировщика.
  • 4 ГБ ОЗУ или более
  • Не менее 8 ГБ свободного места на диске
  • Время и терпение — полный тест может занять более часа на медленных системах

Для установки cachyos-benchmarker выполните следующую команду:

Окно терминала
sudo pacman -S cachyos-benchmarker
  1. Выполните cachyos-benchmarker:
    Окно терминала
    cachyos-benchmarker ~/cachyos-benchmarker/
    # Вы можете заменить ~/cachyos-benchmarker/ на любой каталог, в который вы хотите сохранять логи.
  2. Подождите, пока завершатся подготовительные шаги.
  3. Следуйте подсказкам:
    • Do you want to drop page cache now? Root privileges needed! (y/N) y (Хотите сбросить кэш страниц сейчас? Требуются права root! (д/Н) д)
    • Please enter a name for this run, or leave empty for default: (Пожалуйста, введите имя для этого запуска или оставьте поле пустым для значения по умолчанию:)
  4. Дождитесь окончания тестов.
  5. После завершения произойдёт следующее:
    • Создание лог-файла с именем вида benchie_<имя>_<ДАТА>.log, который содержит подробную информацию о запуске теста.
      • Пример: benchie_p2dq_2025-09-29-2115.log
      • Скрипт benchmark_scraper.py будет автоматически выполнен для создания сводного отчёта в формате HTML.
      • Что делает скрипт?:
        • Читает все файлы benchie_*.log в указанном каталоге.
        • Извлекает названия тестов, время и оценки.
        • Сортирует или агрегирует их.
        • Выводит в терминал краткую сводку результатов и создаёт HTML-файл, который можно открыть в браузере.
          Пример вывода в терминале:
          stress-ng cpu-cache-mem: 15.26
          y-cruncher pi 1b: 31.23
          perf sched msg fork thread: 8.892
          perf memcpy: 13.53
          namd 92K atoms: 53.54
          calculating prime numbers: 11.126
          argon2 hashing: 6.62
          ffmpeg compilation: 53.38
          xz compression: 61.13
          kernel defconfig: 130.73
          blender render: 96.29
          x265 encoding: 24.99
          Total time (s): 506.72
          Total score: 70.71
          Name: p2dq
          Date: 2025-09-29-2115
          System: Kernel: 6.17.0-1.1-cachyos-p2dq arch: x86_64 bits: 64
          Desktop: KDE Plasma v: 6.4.5 Distro: CachyOS
          Memory: System RAM: total: 32 GiB available: 30.61 GiB used: 7.54 GiB (24.6%)
          Device-1: Channel-A DIMM 0 type: LPDDR5 size: 8 GiB speed: 7500 MT/s
          Device-2: Channel-B DIMM 0 type: LPDDR5 size: 8 GiB speed: 7500 MT/s
          Device-3: Channel-C DIMM 0 type: LPDDR5 size: 8 GiB speed: 7500 MT/s
          Device-4: Channel-D DIMM 0 type: LPDDR5 size: 8 GiB speed: 7500 MT/s
          CPU: Info: 8-core model: AMD Ryzen 7 8845HS w/ Radeon 780M Graphics bits: 64 type: MT MCP cache: L2: 8 MiB
          Speed (MHz): avg: 3366 min/max: 419/5138 cores: 1: 3366 2: 3366 3: 3366 4: 3366 5: 3366 6: 3366 7: 3366 8: 3366 9: 3366 10: 3366 11: 3366 12: 3366 13: 3366 14: 3366 15: 3366 16: 3366
          SCX Scheduler: p2dq_1.0.21_gf90c2aa1_dirty_x86_64_unknown_linux_gnu
          SCX Version: p2dq_1.0.21_gf90c2aa1_dirty_x86_64_unknown_linux_gnu
          Version : 0.5.1-1
          Пример HTML-отчёта с результатами теста, сравнивающего две разные ветки одного и того же планировщика:
  6. Чтобы сравнить два или более запуска, поместите файлы .log в один и тот же каталог перед запуском benchmark_scraper.py. Инструмент автоматически обнаружит и сравнит их в HTML-отчёте.

Тестирование задержек планировщика с помощью schbench

Заголовок раздела «Тестирование задержек планировщика с помощью schbench»

schbench — это бенчмарк для планировщиков, предназначенный для измерения задержек планировщика при симулированной рабочей нагрузке в стиле сервера. Он создаёт настраиваемое количество потоков-«обработчиков» и потоков-«сообщений», где сообщения многократно пробуждают обработчиков. Измеряя распределение задержек от пробуждения до выполнения этих потоков-обработчиков, он предоставляет критически важную информацию о способности ядра обрабатывать пробуждения потоков, балансировку и конкуренцию за ЦП, особенно под нагрузкой.

Вы можете использовать schbench для:

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

schbench доступен в репозиториях CachyOS:

Окно терминала
sudo pacman -S schbench

Простой способ запустить schbench для общего теста задержек:

Окно терминала
schbench -m 2 -t 8 -r 60

В этом примере запускается:

  • 2 потока сообщений (-m 2)
  • 8 потоков-обработчиков на каждый поток сообщений (-t 8)
  • на общее время выполнения 60 секунд (-r 60)

Вы можете настроить эти значения в зависимости от количества ядер вашего ЦП и желаемого уровня нагрузки.

Вот таблица, объясняющая некоторые из ключевых опций:

ОпцияОписание
-C, --calibrateЗапустить калибровку и сообщить о времени (без теста).
-L, --no-lockingОтключить спин-блокировки во время работы ЦП (по умолчанию: блокировки включены).
-m, --message-threads <n>Количество потоков сообщений (по умолчанию: 1).
-t, --threads <n>Потоки-обработчики на каждый поток сообщений (по умолчанию: количество ЦП).
-r, --runtime <sec>Продолжительность теста (по умолчанию: 30).
-F, --cache_footprint <KB>Размер занимаемой кэш-памяти (по умолчанию: 256).
-n, --operations <count>Количество операций “времени на раздумье” (по умолчанию: 5).
-A, --auto-rpsАвтоматически увеличивать RPS до достижения целевой загрузки ЦП.
-R, --rps <count>Режим запросов в секунду.
-p, --pipe <bytes>Симулировать тест передачи данных через pipe.
-w, --warmuptime <sec>Время разогрева перед сбором статистики (по умолчанию: 0).
-i, --intervaltime <sec>Интервал для вывода задержек (по умолчанию: 10).
-z, --zerotime <sec>Интервал для обнуления статистики задержек (по умолчанию: никогда).

После каждого запуска schbench выводит перцентили задержек, например:

Пример вывода
Окно терминала
Wakeup Latencies percentiles (usec) runtime 10 (s) (2406 total samples)
50.0th: 60 (648 samples)
90.0th: 2034 (968 samples)
* 99.0th: 4104 (211 samples)
99.9th: 10128 (22 samples)
min=1, max=10308
Request Latencies percentiles (usec) runtime 10 (s) (2394 total samples)
50.0th: 49216 (726 samples)
90.0th: 69760 (954 samples)
* 99.0th: 166656 (212 samples)
99.9th: 273920 (21 samples)
min=11770, max=334247
RPS percentiles (requests) runtime 10 (s) (11 total samples)
20.0th: 234 (3 samples)
* 50.0th: 238 (3 samples)
90.0th: 241 (4 samples)
min=230, max=248
current rps: 230.99
Wakeup Latencies percentiles (usec) runtime 10 (s) (2406 total samples)
50.0th: 60 (648 samples)
90.0th: 2034 (968 samples)
* 99.0th: 4104 (211 samples)
99.9th: 10128 (22 samples)
min=1, max=10308
Request Latencies percentiles (usec) runtime 10 (s) (2406 total samples)
50.0th: 49216 (729 samples)
90.0th: 69760 (956 samples)
* 99.0th: 165632 (212 samples)
99.9th: 273920 (22 samples)
min=11770, max=334247
RPS percentiles (requests) runtime 10 (s) (11 total samples)
20.0th: 234 (3 samples)
* 50.0th: 238 (3 samples)
90.0th: 241 (4 samples)
min=230, max=248
average rps: 240.60
  • Wakeup Latencies (Задержки пробуждения):
    • Измеряет, как быстро потоки пробуждаются после получения сигнала.
      • Более низкие значения здесь (особенно 99-й перцентиль) означают, что планировщик более отзывчив.
  • Request Latencies (Задержки запросов):
    • Представляет время, затраченное на выполнение запросов между потоками.
      • Более низкая задержка указывает на лучшую межпоточную коммуникацию и эффективность планирования.
  • RPS (Requests Per Second - Запросов в секунду):
    • Показывает устойчивую пропускную способность:
      • Более высокий средний RPS указывает на то, что планировщик может обрабатывать больше работы в секунду при данной конфигурации.

В заключение:

  • Хороший планировщик будет показывать низкие задержки пробуждения и запросов при стабильном RPS.
  • Менее эффективный планировщик может демонстрировать высокие скачки задержек или нестабильные значения RPS с течением времени.

Если вы хотите провести тестирование игр для сравнения производительности различных планировщиков, вот несколько советов, чтобы получить наиболее точные результаты:

  • Используйте встроенные бенчмарки: Многие современные игры поставляются со встроенными инструментами для тестирования. Они предназначены для получения согласованных результатов путём выполнения одной и той же последовательности событий каждый раз.
    • Посмотрите на этом сайте список игр, включающих встроенные бенчмарки.
  • Согласованные настройки: Убедитесь, что настройки игры (разрешение, качество графики и т. д.) одинаковы для каждого тестового запуска.
  • Закройте фоновые приложения: Другие приложения, работающие в фоновом режиме, могут влиять на производительность. Закройте ненужные программы, чтобы минимизировать их влияние.
  • Если вы не используете встроенный бенчмарк, старайтесь выполнять одни и те же действия в игре для каждого тестового запуска. Это может включать прохождение одного и того же пути, участие в похожих боевых сценариях или выполнение одних и тех же задач.
    • Даже прицеливание в разные точки может привести к разным результатам производительности.
  • Множественные запуски: Выполните несколько запусков теста и возьмите среднее значение, чтобы учесть вариативность.
  • Используйте инструменты мониторинга производительности: Инструменты, такие как MangoHud или GOverlay, могут предоставлять метрики производительности в реальном времени, такие как FPS, время кадра и загрузка ЦП/ГП.
  • Используйте сочетания клавиш или макросы:
    • Один из примеров — создать сочетание клавиш, с помощью которого можно переключаться между различными планировщиками или изменять их режимы прямо в игре.
      • Это можно сделать с помощью такого инструмента, как scxctl, или создав собственные скрипты, которые изменяют активный планировщик и его режим.

Загрузка и обмен вашими результатами тестов

Заголовок раздела «Загрузка и обмен вашими результатами тестов»

Этот сайт содержит список тестов, проведённых сообществом с использованием различных планировщиков или тестированием различных настроек.

Чтобы загрузить свои собственные тесты, вам нужно будет привязать свою учётную запись Discord к веб-сайту, и после этого вы сможете отправлять свои собственные результаты.

Затем нажмите на кнопку New benchmark (Новый тест) и заполните необходимую информацию.

  • Вы можете загружать несколько результатов для одной и той же игры, используя разные планировщики или настройки.
  • Принимаются логи как от MangoHud, так и от Afterburner.
  • Позволяет искать по названию или описанию.

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

Заголовок раздела «Переход с scx.service на scx_loader: подробное руководство»

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

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

Структура файла scx.service
# Список scx_планировщиков: 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 будет загружать и запускать нужный планировщик.
  • Проверка статуса службы
    systemctl status scx_loader.service
  • Просмотр всех записей журнала службы
    journalctl -u scx_loader.service
  • Просмотр логов только текущей сессии
    journalctl -u scx_loader.service -b 0

Так много вариантов… почему нельзя просто сделать один планировщик, который хорош во всём?

Заголовок раздела «Так много вариантов… почему нельзя просто сделать один планировщик, который хорош во всём?»

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

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

В этом и заключается магия sched-ext. Ограничения больше не являются проблемой.

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

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

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

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

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

Заголовок раздела «Сценарии использования этих планировщиков довольно похожи… почему так?»

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

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

Почему у меня отсутствует планировщик, который некоторые пользователи упоминают или тестируют на Discord-сервере CachyOS?

Заголовок раздела «Почему у меня отсутствует планировщик, который некоторые пользователи упоминают или тестируют на Discord-сервере CachyOS?»

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

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

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

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

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

Заголовок раздела «Я ранее использовал scx_loader в графическом интерфейсе Kernel Manager. Нужно ли мне все равно выполнять шаги по переходу?»
  • В данном конкретном случае нет, это не обязательно, потому что Kernel Manager уже выполняет процесс перехода.
    • За исключением случаев, когда вы ранее добавляли пользовательские флаги в /etc/default/scx и все еще хотите их использовать.