1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/anolis-plugsched

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md
# yum install yum-utils podman kernel-debuginfo-$(uname -r) kernel-devel-$(uname -r) --enablerepo=Plus-debuginfo --enablerepo=Plus -y
# mkdir /tmp/work && cd /tmp/work
# yumdownloader --source kernel-$(uname -r) --enablerepo=Plus
# podman run -itd --name=plugsched -v /tmp/work:/tmp/work -v /usr/src/kernels:/usr/src/kernels -v /usr/lib/debug/lib/modules:/usr/lib/debug/lib/modules plugsched-registry.cn-hangzhou.cr.aliyuncs.com/plugsched/plugsched-sdk
# podman exec -it plugsched bash
# cd /tmp/work
# uname_r=$(uname -r)
# plugsched-cli extract_src kernel-${uname_r%.*}.src.rpm ./kernel
# plugsched-cli init $(uname -r) ./kernel ./scheduler
diff --git a/scheduler/kernel/sched/mod/core.c b/scheduler/kernel/sched/mod/core.c
index 9f16b72..21262fd 100644
--- a/scheduler/kernel/sched/mod/core.c
+++ b/scheduler/kernel/sched/mod/core.c
@@ -3234,6 +3234,9 @@ static void __sched notrace __schedule(bool preempt)
    struct rq *rq;
    int cpu;
 
+   if (sched_feat(PLUGSCHED_TEST))
+       printk_once("I am the new scheduler: __schedule\n");
+
    cpu = smp_processor_id();
    rq = cpu_rq(cpu);
    prev = rq->curr;
diff --git a/scheduler/kernel/sched/mod/features.h b/scheduler/kernel/sched/mod/features.h
index 4c40fac..8d1eafd 100644
--- a/scheduler/kernel/sched/mod/features.h
+++ b/scheduler/kernel/sched/mod/features.h
@@ -1,4 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0 */
+SCHED_FEAT(PLUGSCHED_TEST, false)
+
 /*
  * Only give sleepers 50% of their service deficit. This allows
  * them to run sooner, but does not allow tons of sleepers to
# plugsched-cli build /tmp/work/scheduler
# uname_r=$(uname -r)
# cp /tmp/work/scheduler/working/rpmbuild/RPMS/x86_64/scheduler-xxx-${uname_r%.*}.yyy.x86_64.rpm /tmp/work/scheduler-xxx.rpm
# exit
exit
# cat /sys/kernel/debug/sched_features
GENTLE_FAIR_SLEEPERS START_DEBIT NO_NEXT_BUDDY LAST_BUDDY CACHE_HOT_BUDDY WAKEUP_PREEMPTION NO_HRTICK NO_DOUBLE_TICK NONTASK_CAPACITY TTWU_QUEUE NO_SIS_AVG_CPU SIS_PROP NO_WARN_DOUBLE_CLOCK RT_PUSH_IPI RT_RUNTIME_SHARE NO_LB_MIN ATTACH_AGE_LOAD WA_IDLE WA_WEIGHT WA_BIAS NO_WA_STATIC_WEIGHT UTIL_EST ID_IDLE_AVG ID_RESCUE_EXPELLEE NO_ID_EXPELLEE_NEVER_HOT NO_ID_LOOSE_EXPEL ID_LAST_HIGHCLASS_STAY
# rpm -ivh /tmp/work/scheduler-xxx.rpm
# lsmod | grep scheduler
scheduler             503808  1
# dmesg | tail -n 10
[ 2186.213916] cni-podman0: port 1(vethfe1a04fa) entered forwarding state
[ 6092.916180] Hi, scheduler mod is installing!
[ 6092.923037] scheduler: total initialization time is        6855921 ns
[ 6092.923038] scheduler module is loading
[ 6092.924136] scheduler load: current cpu number is               64
[ 6092.924137] scheduler load: current thread number is           667
[ 6092.924138] scheduler load: stop machine time is            249471 ns
[ 6092.924138] scheduler load: stop handler time is            160616 ns
[ 6092.924138] scheduler load: stack check time is              85916 ns
[ 6092.924139] scheduler load: all the time is                1097321 ns
# cat /sys/kernel/debug/sched_features
NO_PLUGSCHED_TEST GENTLE_FAIR_SLEEPERS START_DEBT NO_NEXT_BUDDY LAST_BUDDY CACHE_HOT_BUDDY WAKEUP_PREEMP NO_HRTICK NO_DOUBLE_TICK NONTASK_CAPACITY TTWU_QUEUE NO_SIS_AVG_CPU SIS_PROP NO_WARN_DOUBLE_CLOCK RT_PUSH_IPI RT_RUNTIME_SHARE NO_LB_MIN ATTACH_AGE_LOAD WA_IDLE WA_WEIGHT WA_BIAS NO_WA_STATIC_WEIGHT UTIL_EST ID_IDLE_AVG ID_RESCUE_EXPELLEE NO_ID_EXPELLEE_NEVER_HOT NO_ID_LOOSE_EXPEL ID_LAST_HIGHCLASS_STAY
NO_PLUGSCHED_TEST GENTLE_FAIR_SLEEPERS START_DEBIT NO_NEXT_BUDDY LAST_BUDDY CACHE_HOT_BUDDY WAKEUP_PREEMPTION NO_HRTICK NO_DOUBLE_TICK NONTASK_CAPACITY TTWU_QUEUE NO_SIS_AVG_CPU SIS_PROP NO_WARN_DOUBLE_CLOCK RT_PUSH_IPI RT_RUNTIME_SHARE NO_LB_MIN ATTACH_AGE_LOAD WA_IDLE WA_WEIGHT WA_BIAS NO_WA_STATIC_WEIGHT UTIL_EST ID_IDLE_AVG ID_RESCUE_EXPELLEE NO_ID_EXPELLEE_NEVER_HOT NO_ID_LOOSE_EXPEL ID_LAST_HIGHCLASS_STAY
``` **Примечание: Невозможно выгрузить модуль планировщика напрямую с помощью команды «rmmod»! Следует использовать стандартную команду «rpm или yum» для удаления пакета планировщика.**

**FAQ:**

Q: Что содержит планировщик после извлечения границы при конфигурации по умолчанию?

Содержит следующее:
* autogroup;
* cpuacct;
* cputime;
* sched debug;
* sched stats;
* cfs rt deadline idle stop sched class;
* sched domain topology;
* sched tick;
* scheduler core.

Q: Какие функции можно изменить?

После извлечения границы все функции, определённые в файлах в каталоге kernel/sched/mod, могут быть изменены. Например, в примере быстрого старта можно изменить более 1000 функций планировщика. Однако есть некоторые меры предосторожности, пожалуйста, обратитесь к разделу «Ограничения».

Q: Можно ли изменить границу планировщика?

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

Q: Какие версии ядра поддерживает plugsched?

Теоретически plugsched отделён от версии ядра. Версии ядра, которые мы протестировали, — это 3.10 и 4.19. Другие версии должны быть адаптированы и протестированы разработчиками.

Q: Можно ли изменять функции, определённые в заголовочных файлах?

Да. Анализатор границ также работает с заголовочными файлами. Функции в kernel/sched/mod/*h можно изменять, кроме тех, которые сопровождаются комментарием «DON'T MODIFY INLINE EXTERNAL FUNCTION».

Q: Можно ли модифицировать структуры?

Нельзя произвольно изменять размер структур и семантику их членов. Зарезервированные поля можно изменять, если они предопределены в структурах.

Q: Будет ли регресс производительности при замене планировщика ядра?

Накладные расходы, связанные с plugsched, можно игнорировать, а регресс производительности в основном зависит от кода, изменённого разработчиками. После теста производительности новый планировщик не влияет на производительность, если модификация не применялась.

Q: Есть ли простои при загрузке модулей планировщика? Сколько?

Это зависит от текущей загрузки системы и количества потоков. В наших тестах у нас было более 10 000 процессов, работающих на машине с 104 логическими процессорами. И время простоя составляет менее 10 мс.

Q: В чём разница между plugsched и kpatch? Достигаем ли мы того же? **Цель оптимизации Kpatch?**

Kpatch — это обновление функций в реальном времени, а plugsched — для всей подсистемы. Некоторые возможности не могут быть достигнуты путём оптимизации Kpatch. Например, Kpatch не может модифицировать функцию __schedule и не может одновременно изменять тысячи функций.

**Вопрос: конфликтует ли plugsched с «горячим» исправлением Kpatch?** 

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

**Вопрос: могу ли я изменить функцию вне границы планировщика?**

Да. Мы предоставляем механизм sidecar (боковой коляски), чтобы модифицировать функции за пределами границы. Например, если мы хотим изменить как планировщик, так и cpuacct, мы можем использовать sidecar для изменения cpuacct.

## Поддерживаемые архитектуры
- [X] x86-64
- [X] aarch64

## Ограничения
* Нельзя модифицировать функции инициализации, потому что они были выпущены после перезагрузки. Если вам нужно, пожалуйста, сделайте это при инициализации модуля.
* Не может быть изменена сигнатура интерфейсной функции. И интерфейсную функцию нельзя удалить, но вы можете изменить её, чтобы сделать пустой функцией.
* Нельзя изменять функции с комментарием «НЕ МОДИФИЦИРОВАТЬ ВНЕШНЮЮ ФУНКЦИЮ»;
* Также не рекомендуется модифицировать структуры и семантику их членов. Если вам действительно нужно, обратитесь к документации working/boundary_doc.yaml.
* После загрузки модуля планировщика вы не можете напрямую подключить функцию ядра внутри границы планировщика, например инструменты perf или ftrace. Если вам это нужно, укажите модуль scheduler.ko в команде.

## Лицензия
plugsched — это SDK горячего подключения планировщика Linux-ядра, разработанный Alibaba и лицензированный по лицензии GPLv2+ или BSD-3-Clause. Этот продукт содержит различные сторонние компоненты под другими лицензиями с открытым исходным кодом. Дополнительную информацию см. в файле NOTICE.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
GPL-2.0
Отмена

Обновления (4)

все

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/anolis-plugsched.git
git@api.gitlife.ru:oschina-mirror/anolis-plugsched.git
oschina-mirror
anolis-plugsched
anolis-plugsched
master