目录

面向 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 框架:

  • CPU 调度方向:通过 sched_ext/scx 调整调度策略。
  • 资源控制方向:通过 cgroup v2、CPU affinity、nice 实现辅助资源管控。
  • eBPF hook 方向:预留 network policy agent、security policy agent、resource control agent 的扩展接口。
  • 实验验证方向:提供 baseline、agent-latency、agent-batch、mixed 的可复现 benchmark。

总体设计

项目采用分层架构:

oe-agent CLI
  -> Workload Monitor
  -> Policy Engine
  -> Skills Interface
      -> ScxSkill
      -> NiceSkill
      -> AffinitySkill
      -> CgroupCpuSkill
      -> EbpfHookSkill
  -> Extension Agents
      -> NetworkPolicyAgent
      -> SecurityPolicyAgent
      -> ResourceControlAgent

核心思想是将资源管控能力抽象为标准 Skill,并由策略引擎根据 workload profile 统一调度。

实现方法

1. Agent 主框架

命令行入口为:

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

2. Workload 感知

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

采集指标包括:

  • CPU 使用率
  • 运行时间
  • 上下文切换次数
  • 线程数
  • nice 值
  • CPU affinity
  • cgroup CPU 限制状态

根据采集结果,Agent 将 workload 分为:

  • latency-sensitive
  • batch
  • mixed

3. Skills 能力接口

统一接口定义在:

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

4. 策略引擎

策略引擎位于:

oe_agent/policy.py

已实现三类 profile:

latency
batch
mixed

latency profile:

  • 优先启动 scx_simple
  • 将 nice 调整为 -5
  • 绑定到选定 CPU,减少迁移抖动。
  • 尝试提高 cgroup CPU weight。

batch profile:

  • 启动 scx 调度器。
  • 将 nice 调整为 5
  • 限制到部分 CPU,降低对延迟敏感任务的干扰。
  • 尝试降低 cgroup CPU weight。

mixed profile:

  • 先采样 workload 状态。
  • 根据 CPU 使用率和上下文切换动态选择 nice、affinity、cgroup weight。

所有策略均支持 rollback。

sched_ext/scx 实现路径

初始问题

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

该脚本完成:

  • 检查源码是否包含 sched_ext。
  • 基于当前 openEuler 配置生成新 .config
  • 开启 sched_ext 和 BPF 相关配置。
  • 清空本地编译缺失的 openEuler 证书配置。

编译安装后,当前系统已经启动到自编译内核:

6.6.0+

并且出现:

/sys/kernel/sched_ext

说明 sched_ext 内核接口已经启用。

scx 调度器

scx 调度器从 openEuler kernel 源码的 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 与扩展 Agent

eBPF 示例位于:

ebpf/exec_counter.bpf.c

该示例用于展示 exec tracepoint hook 的最小实现。

扩展 Agent 位于:

oe_agent/agents.py

包含:

NetworkPolicyAgent
SecurityPolicyAgent
ResourceControlAgent

三类扩展 Agent 的定位:

  • NetworkPolicyAgent:采集网络接口计数,后续可扩展为 XDP/TC 策略 Agent。
  • SecurityPolicyAgent:基于 eBPF hook 扩展 exec/file/security 事件采集。
  • ResourceControlAgent:基于 cgroup v2 做 CPU、资源隔离和权重控制。

查看扩展 Agent 状态:

python3 -m oe_agent.cli agents status

Benchmark 与实验

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

说明:

  • workload 运行期间,scx 调度器被 Agent 启动。
  • workload 结束后,Agent 执行 rollback,因此 state 回到 disabled
  • enable_seq 增加,说明 sched_ext 曾经成功启用。

项目结构

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
关于
88.5 MB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802047560号