Слияние кода завершено, страница обновится автоматически
# 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 )