目录

AURA:面向 openEuler 的自适应调度资源管控 Agent

AURA(Adaptive Userspace Resource-control Agent)是运行在 openEuler 24.03 LTS SP4 上的调度资源管控 Agent。 自研 sched_ext 调度器 scx_aura 负责任务选择与配置生效,控制面 aurad 负责负载画像、提案与校验; 所有变更提案无论来自规则、历史方案、LLM、控制台、REST 还是 MCP,都经过同一条安全执行链: 授权与边界校验、熔断、基线校验、快照、危险组合检查、金丝雀验证,失败时按快照精确恢复,全程审计。

第三届中国研究生操作系统开源创新大赛 · 系统创新赛道 · 社区赛题 设计、实现与实验的完整说明见 docs/项目说明书.pdf,决赛阶段的改进见 docs/项目创新说明.pdf。


1. 项目简介

接入层   Web 控制台(6 个视图) · REST API · MCP 服务(14 个工具,stdio / SSE / Streamable HTTP)
           │
控制面   aurad:每 6 s 一个周期  感知画像 → 分层决策 → 安全执行 → 验证反馈 → SQLite 审计
           │   感知 / 规划 / 执行 / 学习四个 Agent + 协调器;内部工具白名单 17 个
           │
执行面   scx_aura(fair / interactive / batch / quota,Unix 套接字在线调整)
         cgroup v2:batch.slice、latency.slice 的 cpu.weight / cpu.max
         专家调度器:scx_bpfland、scx_rustland(建议切换,须人工确认)
  • 调度执行层 src/scheds/scx_aura/:基于 sched_ext 与 scx_rustland_core 2.3.7,在用户态进程内完成任务选择。 apply_config 校验完整的「策略、时间片、交互加权系数、迁移代价」四元组后,在一次写锁内发布。
  • 控制面 src/aura/:负载画像、规则投票准入、运维任务与 LLM 提案、专家调度器建议、安全执行链、审计。
  • 接口:src/console/static/(控制台前端)、src/aura/console.py(REST)、src/aura/mcp_server.py(MCP)。
  • 扩展:src/skills/ 下的声明式 Skill,src/ebpf/ 下的 cgroup 观测代理与扩展模板。

2. 应用场景

  • 在线服务与后台计算混部:在线服务关注尾延迟,后台任务关注吞吐,二者的最优调度配置不同。
  • 负载随时间变化:同一台机器在不同时段呈现交互型、批处理型或混合负载。
  • 需要受控自动化的运维:调度变更需要授权、可验证、可回滚、可审计,而不是直接改写内核参数。
  • 作为 Agent 的系统能力接口:外部 Agent 通过 MCP 读取画像、申请调整,变更同样受安全执行链约束。

在受测范围内,没有一个调度器或固定配置能在所有负载和指标上占优(见第 8 节),这是 AURA 按业务目标选择策略与参数的出发点。

3. 主要功能

功能 说明 代码位置
感知与画像 6 s 窗口采集 PSI、procfs、cgroup 压力与业务指标(/run/aura/app-metrics.json),判定 latency_critical / interactive / batch / unknown 并给出置信度 src/aura/perception.py、profile.py
规则投票准入 规则在 6 s 投票窗口内计票,准入置信度达到 0.6 才形成提案,不同提案间冷却 30 s src/aura/reflex.py、src/skills/*/rules/
自主模式 无运维任务时只执行规则准入且在 Skill 授权范围内的动作;历史方案仅在与准入动作一致时复用 src/aura/agent.py、repository.py
任务模式 运维人员下达目标、能力域、允许动作和回评指标;依次尝试历史方案、任务缓存、LLM 提案;未配置 LLM 时使用离线规划器 src/aura/directive.py、llm.py
专家调度器建议 batch → scx_bpfland,latency_critical / interactive → scx_aura;只作展示,须人工确认后经安全执行链执行 src/aura/routing.py
安全执行链 授权与边界 → 熔断 → 基线校验 → 快照 → 危险组合检查 → 协议能力检查 → noop 判定 → 执行 → 30 s 金丝雀(P99 ≤ 基线 1.3 倍)→ 提交或按快照恢复;同一 Skill 连续 3 次回滚熔断 600 s src/aura/safety.py、metric_window.py
精确恢复 只写回发生变化的项;调度配置用 apply_config 一次恢复;cpu.max 保存并写回原始文本;恢复不一致时记为失败 src/aura/backends/unix.py
双侧组合校验 batch 与超过 5000 µs 的时间片组合在控制面被拒绝(unsafe_batch_slice),直接发往套接字的 apply_config 也被调度器拒绝 src/aura/safety.py、src/scheds/scx_aura/src/ctl.rs
审计与控制台 提交、回滚、拒绝、noop、失败、熔断六类结果写入 SQLite,可在控制台与 API 中查询 src/aura/audit.py、src/console/static/
eBPF 观测代理 统计各 cgroup 的 CPU 运行时间,支持 --changed-only;仅用于控制台展示,不参与决策 src/ebpf/cgroup-agent/

scx_aura 的四种策略:

策略 任务选择 适用场景
fair 虚拟运行时间最小者 默认,通用负载
interactive 按截止时间、类别加成、唤醒率和迁移代价打分 在线服务、尾延迟敏感
batch 偏向批处理类、长执行时间任务;只允许与 ≤ 5000 µs 时间片组合 计算密集批处理
quota 按 cgroup 已消耗时间与权重之比选择 按 cgroup 份额分配

参数范围:slice_us [100, 100000],boost_factor [0, 10],migration_cost [0, 10⁶];默认 fair / 5000 / 1.0 / 0。

4. 系统环境

项目 要求 / 已验证配置
操作系统 openEuler 24.03 LTS SP4,x86_64
内核 6.6,启用 CONFIG_SCHED_CLASS_EXT、BTF、cgroup v2 与 PSI;已验证内核基于官方 SRPM 构建并回移上游提交 a8e03b6bbb2c(带 -aura 后缀,保留原内核与救援启动项)
硬件 已在 8 vCPU、7.2 GiB 内存的虚拟机上验证
权限 加载调度器、写 cgroup 与安装服务需要 root;离线演示与单元测试不需要

5. 依赖要求

  • Python ≥ 3.11:httpx、mcp、pydantic、PyYAML;控制台额外需要 fastapi、uvicorn;开发需要 pytest、ruff。版本约束见 pyproject.toml。
  • Rust 1.96.0(rust-toolchain.toml),依赖 scx_rustland_core 2.3.7、scx_utils 1.0.22、scx_stats 1.0.17、libbpf-rs 0.26.0-beta.1 等,版本由 Cargo.lock 固定。
  • BPF 构建:clang、libbpf、bpftool;内核需提供 BTF。
  • 可选组件:scx_bpfland、scx_rustland 1.0.17(专家调度器,src/deploy/fetch-scx-experts.sh、build-scx-experts.sh);DeepSeek 接口或本地 LLM(src/deploy/configure-deepseek.sh、enable-local-llm.sh)。
  • 测试负载:schbench、Redis 与 redis-benchmark、llama.cpp、stress-ng、Linux 内核源码(src/deploy/prepare-benchmark-workloads.sh、prepare-llama-workload.sh)。

第三方代码与补丁:

  • src/scheds/scx_aura/vendor/scx_rustland_core-2.3.7/:scx_rustland_core 2.3.7(GPL-2.0-only)的三个 BPF 资源文件,未作修改,仅在启用 vendored-connector 时使用,随附原始 LICENSE 与 SHA256SUMS。
  • src/deploy/patches/0001-bpf-allow-syscall-kfuncs.patch:回移上游提交 a8e03b6bbb2c,向 BPF_PROG_TYPE_SYSCALL 程序开放 sched_ext 所需 kfunc。
  • src/deploy/patches/0002-scx-bpfland-cpumask-weight-compat.patch:scx_bpfland 1.0.17 的 6.6 内核兼容修改,以有界遍历配合 bpf_cpumask_test_cpu 替代 6.8 才提供的 bpf_cpumask_weight。

scx_aura 声明 GPL-2.0-only 许可证,与 scx_rustland_core 一致。上游版本、提交与校验和见 docs/dependency-provenance.md。

6. 构建方法

内核(官方内核未启用 sched_ext 时):

sudo bash src/deploy/build-kernel-official.sh --source-rpm <kernel-src.rpm> --install
sudo bash src/deploy/enable-cgroup-v2.sh
sudo bash src/deploy/rebuild-kernel-syscall-kfuncs.sh
sudo reboot

运行时一键安装(安装依赖、创建 /opt/aura/.venv、构建 scx_aura 与 eBPF 观测代理、安装 systemd 服务):

sudo bash src/deploy/setup-runtime.sh --install-deps

分别构建:

# 控制面(开发环境)
python3 -m venv .venv && . .venv/bin/activate
pip install -e '.[console,dev]'

# 调度执行层
cargo build --manifest-path src/scheds/scx_aura/Cargo.toml --release

# eBPF cgroup 观测代理
make -C src/ebpf/cgroup-agent

src/scheds/scx_aura/Cargo.toml 中的 vendored-connector 与三项派发优化为默认关闭的实验特性,默认构建不启用。

7. 运行方法

启动服务并自检:

sudo systemctl enable --now scx-aura aura-cgroup-agent aurad aura-mcp aura-console
sudo bash /opt/aura/deploy/verify-stack.sh

自检共 11 项,全部通过时输出 11 行 [PASS] 并以 failures=0 结束。控制台地址为 http://<主机IP>:8080。

控制台、REST API 与 MCP(Streamable HTTP)服务本身不带身份认证,控制台默认监听 0.0.0.0:8080。 请只在受信任的网络中使用,或通过防火墙、反向代理限制访问。

其他运行方式:

# 端到端演示:服务启动、自检、策略在线调整与恢复、MCP 握手、调度器切换与回退等
sudo bash /opt/aura/deploy/demo.sh            # 使用已配置的 LLM
sudo bash /opt/aura/deploy/demo.sh --offline  # 不调用外部接口

# 切换调度器:eevdf | scx_aura | scx_rustland | scx_bpfland(eevdf 即停止 sched_ext 调度器)
sudo bash /opt/aura/deploy/select-scheduler.sh scx_aura

# 离线演示安全执行链(无需 root 和 sched_ext)
PYTHONPATH=src python3 demo/offline_safety_demo.py

# 本地预览控制台(使用模拟后端)
PYTHONPATH=src python3 -m uvicorn aura.console:create_app --factory --port 8090

LLM 为可选组件。DeepSeek 密钥由 src/deploy/configure-deepseek.sh 交互写入 /etc/aura/deepseek.key(目录权限 0700),不进入仓库与日志;未配置时 aurad 使用离线规划器。

8. 测试方法

功能与质量测试:

pip install -e '.[console,dev]'
ruff check .
pytest                                   # 273 项,全部通过
cargo test --manifest-path src/scheds/scx_aura/Cargo.toml   # 19 项,在目标机全部通过
PYTHONPATH=src python3 demo/offline_safety_demo.py      # 9 个步骤全部得到预期结果
sudo bash /opt/aura/deploy/verify-stack.sh              # 11 项检查,failures=0

Python 测试覆盖安全执行链、Agent 决策、apply_config 协议、快照恢复、指标窗口、接口与基准报告;Rust 测试覆盖控制命令、配置发布、任务分类和策略选择。测试文件说明见 tests/README.md。

性能实验:

sudo bash src/deploy/prepare-benchmark-workloads.sh
sudo bash src/deploy/prepare-llama-workload.sh
sudo bash src/deploy/run-technical-matrices.sh        # 四调度器固定配置对照,1 次预热 + 5 次正式运行
sudo env AURA_BENCH_SCENARIO=src/bench/scenarios/redis.yaml \
         AURA_ARTIFACT_ROOT=tests/artifacts/redis-rerun \
         bash src/deploy/run-benchmark-matrix.sh      # 单个场景
PYTHONPATH=src python3 -m aura.bench.dashboard    # 由归档数据生成控制台展示数据

固定配置对照(均值 ± 标准差,n=5,变化以 EEVDF 为基准;原始数据见 tests/artifacts/):

负载 指标 EEVDF scx_aura 变化
schbench 请求 P99(µs) 22828.8 ± 1389.3 12380.8 ± 1495.2 −45.77%
schbench 唤醒 P99(µs) 5572.8 ± 281.6 4306.4 ± 221.5 −22.72%
schbench 吞吐(RPS) 2102.59 ± 81.93 2137.29 ± 95.89 +1.65%,持平
Redis 吞吐(QPS) 954869 ± 281442 1498320 ± 92032 +56.91%
Redis P99(ms) 1.589 ± 0.379 1.097 ± 0.080 −31.01%
llama.cpp 平均吞吐(tokens/s) 4.97 ± 0.24 5.45 ± 0.12 +9.80%
内核编译 完成时间(s) 412.74 ± 12.00 405.91 ± 8.08 −1.66%,持平

计算型负载上 scx_bpfland 更好(llama.cpp 吞吐 +14.36%,内核编译时间 −4.92%)。该矩阵使用初赛版本的 scx_aura 测得,Redis 场景使用 interactive/750 预设; 另一组未使用预设的 Redis 测量中,scx_aura 与 EEVDF 的差异在波动范围内。表中结果反映调度器的性能特征,不作为 Agent 自动调整的收益。

动态负载对照(每周期 180 s 低—高—低请求,并行 6 个 stress-ng 计算进程;均值 ± 标准差,n=3):

组别 SLO 违约时间(s) PING P99(ms) 后台 bogo ops/s
EEVDF 93.62 ± 5.20 8.619 ± 0.291 6499.2 ± 91.1
scx_aura fair/5000 96.28 ± 6.04 8.025 ± 0.350 6470.8 ± 49.7
scx_aura interactive/5000 96.57 ± 9.11 8.141 ± 0.174 6418.9 ± 64.0
scx_aura interactive/750 91.63 ± 3.42 8.733 ± 1.179 6562.9 ± 233.0
scx_aura batch/5000 99.81 ± 7.98 8.186 ± 0.211 6595.8 ± 191.0
自动控制(回滚基线门控) 96.66 ± 3.00 8.097 ± 0.287 6447.3 ± 105.2
自动控制(回滚基线门控+反馈来源校验) 93.63 ± 0.08 8.254 ± 0.575 6565.4 ± 103.1

三项指标的最优值分别出现在三个不同的固定配置上。启用反馈来源校验的自动控制组与各项最优值的最大差距最小(2.9%), 但没有在任何一项指标上超过最优的固定配置;与 EEVDF 相比两组自动控制的差异均在波动范围内。两组自动控制启用了默认关闭的实验特性。

安全用例 14 项(授权、越界、未授权工具、危险组合、回滚、熔断、系统 cgroup 写入、基线缺失、noop、绕过控制面的危险配置、权重同步失败)的输入与结果见 docs/项目说明书.pdf。

9. 已知限制

  1. 动态负载对照只覆盖一个场景和一台 8 vCPU 虚拟机,每组 3 次正式运行;自动控制在受测的四个固定配置中接近最优,但未超越最佳,结果不能外推到其他负载。
  2. 固定配置性能矩阵使用初赛版本的 scx_aura 测得,决赛版本未重新测量。Redis 与内核编译混部时,四种调度器下 Redis P99 都从 1.1~1.6 ms 升至 63~73 ms,仅调整调度策略不能隔离此类干扰。
  3. batch 策略没有老化或最低份额机制;直接发送到套接字的兼容命令 set_policy、set_param 不做组合校验。出现交互任务饥饿时可切回 fair,或停止 scx_aura 由内核恢复 EEVDF,详见 docs/known-risk-batch-starvation.md。
  4. cgroup 写入只允许 batch.slice、latency.slice 和 aura.slice。
  5. 回滚基线门控、反馈来源校验、自主 apply_config 和三项派发优化均为默认关闭的实验特性。
  6. LLM 只在运维人员下达任务时生成提案,测试中未调用 LLM,提案质量未做评估;专家调度器路由为固定映射,须人工确认。
  7. 控制台、REST API 与 MCP 服务没有内置身份认证。
  8. 仅在 x86_64 上完成实机验证。

目录结构

README.md             本文件
pyproject.toml        Python 包与测试配置(构建与 pytest 以本目录为根)
src/aura/             控制面 aurad:感知、画像、决策、安全执行链、审计、REST、MCP、基准工具
src/scheds/scx_aura/  自研 sched_ext 调度器(Rust),vendor/ 为随附的未修改第三方 BPF 资源
src/console/static/   Web 控制台前端
src/skills/           cpu-sched、cgroup-qos 功能 Skill,network-policy、security-policy 扩展模板
src/ebpf/             cgroup 观测代理与扩展模板
src/bench/scenarios/  基准场景定义
src/deploy/           内核构建、补丁、运行时安装、systemd 服务、演示、自检与基准脚本
src/Cargo.toml        Rust workspace 清单(scx_aura)
tests/                Python 自动化测试
tests/results/        测试与实验结果汇总
tests/artifacts/      支撑上述结果的实验产物(见该目录 README)
demo/                 离线安全执行链演示
docs/                 项目说明书、项目创新说明、成员分工及主要贡献说明、人工智能及第三方工具使用说明;依赖来源与已知风险说明
presentation/         决赛现场演示 PPT 与演示视频
作品原创承诺书.pdf      原创承诺书
关于
331.9 MB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

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