项目说明书
本项目面向 openEuler 24.03-LTS-SP4,围绕“基于用户态调度的资源管控 Agent”这一赛题,实现一个能够感知 workload、选择调度策略、调用 sched_ext/scx 调度器并结合 eBPF hook 扩展 OS 策略能力的 Agent 框架。
传统 Linux 调度策略主要由内核静态实现,用户态难以根据业务 workload 的实时状态快速调整调度行为。sched_ext 提供了一条新的路径:将调度策略通过 BPF scheduler 暴露给用户态,使 Agent 可以根据 workload 类型、CPU 使用率、上下文切换、线程数、cgroup 状态等信号,动态选择合适的调度策略。
本项目的目标不是只写一个 demo 脚本,而是形成一套可扩展的 Agent 框架:
项目采用分层架构:
oe-agent CLI -> Workload Monitor -> Policy Engine -> Skills Interface -> ScxSkill -> NiceSkill -> AffinitySkill -> CgroupCpuSkill -> EbpfHookSkill -> Extension Agents -> NetworkPolicyAgent -> SecurityPolicyAgent -> ResourceControlAgent
核心思想是将资源管控能力抽象为标准 Skill,并由策略引擎根据 workload profile 统一调度。
命令行入口为:
python3 -m oe_agent.cli
支持能力:
python3 -m oe_agent.cli detect python3 -m oe_agent.cli monitor --pid <pid> python3 -m oe_agent.cli run --profile latency -- <command> python3 -m oe_agent.cli run --profile batch -- <command> python3 -m oe_agent.cli bench python3 -m oe_agent.cli demo python3 -m oe_agent.cli scx status python3 -m oe_agent.cli scx verify python3 -m oe_agent.cli agents status
主框架位于:
oe_agent/cli.py oe_agent/policy.py oe_agent/monitor.py oe_agent/workload.py oe_agent/detect.py
Agent 通过 Linux procfs 和 cgroup v2 文件采集 workload 状态:
/proc/<pid>/stat /proc/<pid>/status /proc/stat /proc/loadavg /sys/fs/cgroup/.../cpu.stat /sys/fs/cgroup/.../cpu.max /sys/fs/cgroup/.../cpu.weight
采集指标包括:
根据采集结果,Agent 将 workload 分为:
统一接口定义在:
oe_agent/skills/base.py
接口形式:
class Skill: def detect(self) -> SkillResult: ... def apply(self, target: Target, policy: Mapping[str, Any]) -> SkillResult: ... def rollback(self, target: Target) -> SkillResult: ... def status(self, target: Target) -> SkillResult: ...
已实现 Skills:
NiceSkill 调整进程 nice 值 AffinitySkill 调整 CPU affinity CgroupCpuSkill 使用 cgroup v2 cpu.weight/cpu.max 管控 CPU ScxSkill 检测并启动 scx 调度器 EbpfHookSkill 检测 eBPF 工具链并构建示例 hook
策略引擎位于:
oe_agent/policy.py
已实现三类 profile:
latency batch mixed
latency profile:
scx_simple
-5
batch profile:
5
mixed profile:
所有策略均支持 rollback。
openEuler 24.03-LTS-SP4 默认安装的 kernel RPM 中没有启用 sched_ext:
grep CONFIG_SCHED_CLASS_EXT /boot/config-$(uname -r)
初始结果为:
# CONFIG_SCHED_CLASS_EXT is not set
同时:
ls /sys/kernel/sched_ext
不存在对应目录。
这说明官方默认二进制内核无法真实加载 scx 调度器。
项目采用的方案是:不升级到 Linux 6.12,而是基于 openEuler 24.03-LTS-SP4 官方 6.6 内核源码重新编译同版本内核,并开启 sched_ext。
官方源码中已经包含 sched_ext 相关代码:
kernel/sched/ext.c kernel/sched/ext.h kernel/sched/ext_idle.c kernel/sched/ext_idle.h include/linux/sched/ext.h tools/sched_ext/
重新生成内核配置时开启:
CONFIG_BPF=y CONFIG_BPF_SYSCALL=y CONFIG_BPF_JIT=y CONFIG_DEBUG_INFO_BTF=y CONFIG_SCHED_CLASS_EXT=y
项目提供脚本:
KERNEL_SRC=$HOME/oe-kernel-sp4 make prepare-sp4-scx-kernel
该脚本完成:
.config
编译安装后,当前系统已经启动到自编译内核:
6.6.0+
并且出现:
/sys/kernel/sched_ext
说明 sched_ext 内核接口已经启用。
scx 调度器从 openEuler kernel 源码的 tools/sched_ext 构建:
tools/sched_ext
KERNEL_SRC=$HOME/oe-kernel-sp4 make build-scx
已构建出的调度器包括:
scx_simple scx_qmap scx_central scx_flatcg
安装位置:
~/.local/bin/
验证:
export PATH="$HOME/.local/bin:$PATH" which scx_simple python3 -m oe_agent.cli scx status make scx-verify
eBPF 示例位于:
ebpf/exec_counter.bpf.c
该示例用于展示 exec tracepoint hook 的最小实现。
扩展 Agent 位于:
oe_agent/agents.py
包含:
NetworkPolicyAgent SecurityPolicyAgent ResourceControlAgent
三类扩展 Agent 的定位:
查看扩展 Agent 状态:
python3 -m oe_agent.cli agents status
benchmark 位于:
benchmarks/run_bench.py benchmarks/report.py
workload 位于:
workloads/cpu_burn.py workloads/latency_task.py workloads/mixed_workload.py
实验场景:
baseline 不启用 Agent agent-latency 启用 latency profile agent-batch 启用 batch profile mixed 同时运行 latency 和 batch workload
输出结果:
results/benchmark.csv results/report.md
运行:
sudo env PATH="$HOME/.local/bin:$PATH" python3 -m oe_agent.cli bench
当前已经完成以下验证:
自编译 openEuler 6.6 内核启动成功 /sys/kernel/sched_ext 存在 CONFIG_SCHED_CLASS_EXT=y scx_simple/scx_qmap/scx_central/scx_flatcg 构建成功 oe-agent 成功启动 scx 调度器 enable_seq 增加,证明 sched_ext 被启用过 Agent rollback 后 scx 调度器正常停止
典型运行命令:
sudo env PATH="$HOME/.local/bin:$PATH" \ python3 -m oe_agent.cli run --profile latency -- \ python3 workloads/latency_task.py --requests 200
运行后可查看:
cat /sys/kernel/sched_ext/state cat /sys/kernel/sched_ext/enable_seq python3 -m oe_agent.cli scx status
说明:
state
disabled
enable_seq
oe-resource-agent/ ├── README.md ├── Makefile ├── pyproject.toml ├── requirements.txt ├── oe_agent/ │ ├── cli.py │ ├── detect.py │ ├── monitor.py │ ├── policy.py │ ├── workload.py │ ├── agents.py │ └── skills/ ├── workloads/ ├── benchmarks/ ├── ebpf/ ├── scripts/ ├── tests/ ├── docs/ └── results/
完整验证命令:
cd ~/桌面/oe-resource-agent export PATH="$HOME/.local/bin:$PATH" python3 -m unittest discover -s tests -v make agents make scx-verify make evidence make scx-demo sudo env PATH="$HOME/.local/bin:$PATH" python3 -m oe_agent.cli bench
现场观察 sched_ext:
watch -n 0.5 'cat /sys/kernel/sched_ext/state; cat /sys/kernel/sched_ext/enable_seq'
证据采集:
make evidence
证据文件输出到:
results/scx_evidence_*.txt
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
面向 openEuler 的自适应资源管控 Agent
项目背景
本项目面向 openEuler 24.03-LTS-SP4,围绕“基于用户态调度的资源管控 Agent”这一赛题,实现一个能够感知 workload、选择调度策略、调用 sched_ext/scx 调度器并结合 eBPF hook 扩展 OS 策略能力的 Agent 框架。
传统 Linux 调度策略主要由内核静态实现,用户态难以根据业务 workload 的实时状态快速调整调度行为。sched_ext 提供了一条新的路径:将调度策略通过 BPF scheduler 暴露给用户态,使 Agent 可以根据 workload 类型、CPU 使用率、上下文切换、线程数、cgroup 状态等信号,动态选择合适的调度策略。
本项目的目标不是只写一个 demo 脚本,而是形成一套可扩展的 Agent 框架:
总体设计
项目采用分层架构:
核心思想是将资源管控能力抽象为标准 Skill,并由策略引擎根据 workload profile 统一调度。
实现方法
1. Agent 主框架
命令行入口为:
支持能力:
主框架位于:
2. Workload 感知
Agent 通过 Linux procfs 和 cgroup v2 文件采集 workload 状态:
采集指标包括:
根据采集结果,Agent 将 workload 分为:
3. Skills 能力接口
统一接口定义在:
接口形式:
已实现 Skills:
4. 策略引擎
策略引擎位于:
已实现三类 profile:
latency profile:
scx_simple。-5。batch profile:
5。mixed profile:
所有策略均支持 rollback。
sched_ext/scx 实现路径
初始问题
openEuler 24.03-LTS-SP4 默认安装的 kernel RPM 中没有启用 sched_ext:
初始结果为:
同时:
不存在对应目录。
这说明官方默认二进制内核无法真实加载 scx 调度器。
解决方案
项目采用的方案是:不升级到 Linux 6.12,而是基于 openEuler 24.03-LTS-SP4 官方 6.6 内核源码重新编译同版本内核,并开启 sched_ext。
官方源码中已经包含 sched_ext 相关代码:
重新生成内核配置时开启:
项目提供脚本:
该脚本完成:
.config。编译安装后,当前系统已经启动到自编译内核:
并且出现:
说明 sched_ext 内核接口已经启用。
scx 调度器
scx 调度器从 openEuler kernel 源码的
tools/sched_ext构建:已构建出的调度器包括:
安装位置:
验证:
eBPF 与扩展 Agent
eBPF 示例位于:
该示例用于展示 exec tracepoint hook 的最小实现。
扩展 Agent 位于:
包含:
三类扩展 Agent 的定位:
查看扩展 Agent 状态:
Benchmark 与实验
benchmark 位于:
workload 位于:
实验场景:
输出结果:
运行:
当前验证结果
当前已经完成以下验证:
典型运行命令:
运行后可查看:
说明:
state回到disabled。enable_seq增加,说明 sched_ext 曾经成功启用。项目结构
复现实验路径
完整验证命令:
现场观察 sched_ext:
证据采集:
证据文件输出到: