演示视频
edge-diag 是面向联想/openKylin eBPF 赛题开发的轻量级系统异常诊断工具。 项目基于 libbpf CO-RE,在内核态进行有界聚合,在用户态完成多维指标关联、 规则诊断、证据链生成以及 JSON、YAML、Markdown 结构化报告输出。
edge-diag
当前版本覆盖赛题要求的全部五类场景:
最终冻结版本已在以下环境完成真实编译、BPF 加载和场景测试:
./scripts/install_deps.sh
如果 openKylin 软件源没有提供 bpftool,脚本会下载固定版本的官方静态 bpftool,并验证发布方提供的 SHA-256。
bpftool
make check
make check 会完成 CO-RE BPF 对象编译、libbpf skeleton 生成、用户态程序 编译、规则回归测试,以及 JSON、YAML、Markdown 输出校验。
sudo ./build/edge-diag doctor
sudo ./build/edge-diag start \ --duration 10 \ --format json \ --output output/judge-report.json python3 scripts/validate_report.py output/judge-report.json
也可使用项目根目录的一层启动入口:
sudo ./edge-diag start --duration 10 --format markdown
edge-diag doctor edge-diag start [--duration SEC] [--format json|yaml|markdown] [--output FILE] [--config FILE] edge-diag demo [--format json|yaml|markdown] [--output FILE]
doctor
start
demo
config/rules.yaml
无 root 环境下可以验证报告链路:
./build/edge-diag demo --format json ./build/edge-diag demo --format yaml ./build/edge-diag demo --format markdown
以下脚本会启动负载、运行采集器并自动校验关联对象和诊断结论:
sudo DURATION=5 ./tests/live_cpu_smoke.sh sudo DURATION=5 ./tests/live_io_smoke.sh sudo DURATION=12 ./tests/live_memory_oom_smoke.sh sudo DURATION=5 ./tests/live_lock_smoke.sh sudo DURATION=30 ./tests/live_syscall_long_smoke.sh sudo DURATION=10 ./tests/live_idle_smoke.sh
也可以运行整套基础演示:
sudo ./scripts/run_all.sh
内存 OOM 测试会建立临时 cgroup v2 子树并限制其内存,只让特意创建的子进程 触发 OOM。压力脚本应在比赛虚拟机或其他可丢弃测试环境中执行。
sched_switch
sched_wakeup → sched_switch
工具将 busy loop 表述为“候选根因”,不会仅凭高 CPU 和热点栈声称已经证明 业务逻辑错误。
raw_syscalls/sys_enter
sys_exit
/proc/<pid>/fd
(TGID, futex 地址)
最近唤醒者只是证据,不自动等同于 mutex 所有者。
高频内核事件不会逐条复制到用户态:
每条诊断至少包含赛题要求的字段:
JSON 保存完整观测、栈和证据图;YAML 和 Markdown 适合配置集成与评委阅读。 直方图 P99 会被实际最大值约束,保证 P99 <= max。
P99 <= max
规则冻结后,在原生 openKylin 上运行 30 窗口矩阵:
sudo CONFIRM_FROZEN_RULES=1 REPETITIONS=5 \ ./scripts/run_accuracy_corpus.sh
测试器会保留误报和漏报对应的有效报告,最后统一计算混淆矩阵,不会因某个 断言失败而提前终止并隐藏失败样本。
性能测试:
sudo REPEATS=3 DURATION=30 make benchmark-io sudo REPEATS=3 DURATION=30 make benchmark-idle
评委可直接查看:
完整证据包:
evidence/edge-diag-final-evidence-20260719.tar.gz
外层 SHA-256:
2171ce11f99ff550411bfa5784c0a7d58a6c891267a22ba934d05678ad3735c9
校验和解压:
sha256sum -c evidence/edge-diag-final-evidence-20260719.tar.gz.sha256 mkdir -p output/submission-evidence tar -xzf evidence/edge-diag-final-evidence-20260719.tar.gz \ -C output/submission-evidence ./scripts/verify_native_evidence.sh \ output/submission-evidence/evidence/native-openkylin-x86_64-normal-20260719-v4 \ x86_64
冻结二进制 SHA-256:
5275afdc5366ba32d8698d4c4a020861ae5c29a52f85e25d454c02aefd76e648
冻结规则 SHA-256:
78b4c574bb1b531b2e316107528c53b8861b69ae56abaae975339691598040a8
Makefile 已映射 x86_64、aarch64 和 riscv64 对应的 BPF 目标宏, 并基于目标内核 /sys/kernel/btf/vmlinux 生成 CO-RE skeleton。
x86_64
aarch64
riscv64
/sys/kernel/btf/vmlinux
edge-diag/ ├── bpf/ # CO-RE eBPF 探针 ├── include/ # 内核态/用户态共享结构 ├── src/ # 采集、诊断、配置、输出和 CLI ├── config/ # YAML 规则 ├── scripts/ # 安装、复现、平台和证据脚本 ├── tests/ # 回归测试、压力场景和断言 ├── docs/ # 设计、测试、评分和限制说明 ├── evidence/ # 原生报告、指标和完整证据包 ├── Makefile └── README.md
项目采用 MIT License。BPF 对象同时声明 MIT/GPL 双许可证,以满足部分 内核 helper 的许可证要求。
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
edge-diag:基于 eBPF 的系统异常观测与根因定位工具
edge-diag是面向联想/openKylin eBPF 赛题开发的轻量级系统异常诊断工具。 项目基于 libbpf CO-RE,在内核态进行有界聚合,在用户态完成多维指标关联、 规则诊断、证据链生成以及 JSON、YAML、Markdown 结构化报告输出。当前版本覆盖赛题要求的全部五类场景:
一、原生验证结论
最终冻结版本已在以下环境完成真实编译、BPF 加载和场景测试:
二、五分钟快速验证
1. 安装依赖
如果 openKylin 软件源没有提供
bpftool,脚本会下载固定版本的官方静态 bpftool,并验证发布方提供的 SHA-256。2. 编译和回归测试
make check会完成 CO-RE BPF 对象编译、libbpf skeleton 生成、用户态程序 编译、规则回归测试,以及 JSON、YAML、Markdown 输出校验。3. 检查运行条件
4. 启动真实观测
也可使用项目根目录的一层启动入口:
三、命令行使用
doctor:检查内核版本、BTF、权限和 eBPF 运行条件;start:加载真实 eBPF 探针并采集指定时间窗口;demo:无需 BPF 权限,生成五类合成诊断结果;config/rules.yaml。无 root 环境下可以验证报告链路:
四、一键复现场景
以下脚本会启动负载、运行采集器并自动校验关联对象和诊断结论:
也可以运行整套基础演示:
内存 OOM 测试会建立临时 cgroup v2 子树并限制其内存,只让特意创建的子进程 触发 OOM。压力脚本应在比赛虚拟机或其他可丢弃测试环境中执行。
五、采集和诊断设计
CPU
sched_switch配对计算线程运行时间;sched_wakeup → sched_switch计算调度等待时间;工具将 busy loop 表述为“候选根因”,不会仅凭高 CPU 和热点栈声称已经证明 业务逻辑错误。
系统调用
raw_syscalls/sys_enter和sys_exit;块设备 I/O
/proc/<pid>/fd做保守路径关联;内存
锁竞争
(TGID, futex 地址)聚合锁实例;最近唤醒者只是证据,不自动等同于 mutex 所有者。
六、低开销数据路径
高频内核事件不会逐条复制到用户态:
七、结构化输出
每条诊断至少包含赛题要求的字段:
JSON 保存完整观测、栈和证据图;YAML 和 Markdown 适合配置集成与评委阅读。 直方图 P99 会被实际最大值约束,保证
P99 <= max。八、准确率与性能复现
规则冻结后,在原生 openKylin 上运行 30 窗口矩阵:
测试器会保留误报和漏报对应的有效报告,最后统一计算混淆矩阵,不会因某个 断言失败而提前终止并隐藏失败样本。
性能测试:
评委可直接查看:
九、证据校验
完整证据包:
外层 SHA-256:
校验和解压:
冻结二进制 SHA-256:
冻结规则 SHA-256:
十、多架构适配
Makefile 已映射
x86_64、aarch64和riscv64对应的 BPF 目标宏, 并基于目标内核/sys/kernel/btf/vmlinux生成 CO-RE skeleton。十一、目录结构
十二、许可证
项目采用 MIT License。BPF 对象同时声明 MIT/GPL 双许可证,以满足部分 内核 helper 的许可证要求。