Fix document checks for root-level materials
第三届中国研究生操作系统开源创新大赛参赛项目。目标平台为 openKylin、Kernel 6.6+、 x86_64/ARM64。
工具在内核事件点运行 eBPF 程序,将高频事件聚合到 BPF map;Go 用户态按真实采样窗口读取差分, 再用确定性规则完成检测和根因分类。输出包含关联对象、指标、时间窗、稳定根因代码、证据链与建议。
内核事件 -> eBPF 探针 -> BPF map -> collector -> detector -> RCA -> 结构化输出
tp_btf/sched_*
tp_btf/block_rq_complete
tp_btf/iomap_dio_rw_begin
vmscan
tp_btf/mark_victim
schedule
tp_btf/sys_enter
sys_exit
I/O 主路径只在最终 complete 读取 request.start_time_ns,独立模式按稳定分配时间确定性采样 1/8 并以逆概率权重还原,all-mode 使用 1/32 事件采样与 1/5 duty。块层指标先触发异常,随后才按需挂载 direct-I/O 提交探针;只有设备、窗口、覆盖率、Top share、实际样本数与 PID starttime 全部通过门槛, 才把 PID/文件写入根因对象,否则保持设备级结论。内存检测由持续系统压力触发,进程匿名 RSS/direct reclaim/major fault 增量只负责根因对象归因。
request.start_time_ns
仓库已跟踪 bpf2go 生成物;普通 clean clone 可直接构建:
cd ebpf-rca bash scripts/deploy.sh sudo ./bin/ebpf-rca --scenario all --duration 60s --format json --output session.json sudo ./bin/ebpf-rca --scenario all --format jsonl sudo ./bin/ebpf-rca --scenario all --duration 60s --report report.md
如需跳过本机构建,可直接使用 release/openkylin-x86_64/ 中的 Linux x86_64 预构建版本。请先按目录内说明校验 SHA-256,再授予执行权限并以 root 或等价 capability 运行。预构建文件用于快速复现,不替代源码和构建脚本。
release/openkylin-x86_64/
修改 .bpf.c 时才需要在目标内核重新生成:
.bpf.c
# 在仓库根目录执行;要求 tracked tree clean。 bash ebpf-rca/scripts/deploy.sh --regenerate
默认部署只校验并消费已提交的 bpf2go 产物,不改写 go.mod、vmlinux.h 或生成文件。 --regenerate 在 /var/tmp 的临时 clean tree 中使用 dependencies.lock.json 固定的依赖和目标机 BTF 重建,仅输出生成物 hash 对比,不覆盖工作区。
go.mod
vmlinux.h
--regenerate
/var/tmp
dependencies.lock.json
加载探针需要 root 或等价 capability。strict all-mode 需要表中全部内核能力;单场景只要求对应 collector 的挂载点。锁符号化还需要可解析的 /proc/kallsyms。
/proc/kallsyms
sudo ./bin/ebpf-rca --scenario all --visual --duration 60s --output session.json
程序在 stderr 输出带临时 token 的本机 URL。服务只监听 loopback;远程查看使用 SSH 端口转发。 CPU/lock 展示探针实际采到的栈;lock 的用户栈绑定采样 waiter TID,不是 owner 栈。 I/O/mem/syscall 只展示指标,不合成火焰图。
strict all-mode 会按事件合并跨层症状:块 I/O 主报告吸收关联窗口内的 I/O-path syscall;只有被这些 syscall 证据确认的同 PID CPU 症状才会并入,不同 PID 仍独立报告。PI futex 只把 helper entry 时原子读取的状态字解释为 owner 快照;普通非 PI futex 没有可靠 owner,waker_tid 也只表示唤醒者。
waker_tid
默认全局/all-mode syscall 是 frequency-only。--scenario syscall --target-pid PID 可对目标树的 非等待型调用做精确 enter/exit;--scenario syscall --target-pid 0 --syscall-global-latency 显式 启用全局慢调用模式,也只精确配对非等待型调用。epoll/futex/read/write 等等待型调用在两种精确模式 中仍只统计频率,不因正常 wall time 较长触发高耗时结论。 frequency-only duty 在挂载前预写内核单调时钟 [start_ns,end_ns),并提前挂载 tracing link; BPF 以 bpf_ktime_get_ns() 自行开关窗口,用户态边界唤醒不参与开启或关闭,只在窗口结束后卸载。 因此调度迟到不会移动统计边界。全局模式先做独立 1/16 事件筛选,只有入样事件读取窗口 map 和 内核时钟;syscall 时间片为每个 Poll 的 1/20,总权重 320。窗口内随机事件筛选保持无偏,时间 外推要求片段对整窗具有代表性;全部 BPF 运行时间仍计入正式性能开销。
--scenario syscall --target-pid PID
--scenario syscall --target-pid 0 --syscall-global-latency
[start_ns,end_ns)
bpf_ktime_get_ns()
仓库直接包含完整测试树,不需要额外覆盖包:
cd ebpf-rca go test ./... make test-local # 五类正例,需要 openKylin/Linux、root 或等价 capability make test-negative # 语义负例 make accuracy-full # 严格 oracle、多轮准确率评测 make bench-full # 配对性能基准 bash scripts/platform_acceptance.sh
当前源码树包含 24 个 Go 测试文件(179 个 Test* 函数)和 4 个 Python 测试文件 (48 个 test_* 函数)。结构化会话格式为 DiagnosticSession 1.1。仓库内附带 ebpf-rca-demo.mp4 演示视频,比赛平台如有独立视频字段, 可同时上传同一文件。
Test*
test_*
DiagnosticSession 1.1
ebpf-rca-demo.mp4
仓库不附带当前提交的正式 platform bundle,也不宣称当前 checkout 已完成 openKylin 正式平台验收。 evidence/reference-openkylin/ 保存的是 2026-07-27、openKylin x86_64、Kernel 6.6.0-22-generic 上的冻结前历史回归,运行器未记录确切 source_commit,因此只能 作为方法与结果快照参考,不能外推为当前提交成绩。
evidence/reference-openkylin/
source_commit
该历史准确率快照为 100/100 有效轮次通过;严格性能复测中 all-mode 最大吞吐下降为 1.851%、 最大组合内存为 60.906 MiB,但 fio P99 增幅为 6.256%,超过 5% 门槛,因此不能宣称性能验收通过。 完整引用边界见 REFERENCE_EVIDENCE.json。 ARM64 仅提供静态交叉编译门禁,不宣称已通过 ARM64 目标内核 verifier 或实机运行;不宣称 RISC-V 适配完成。
REFERENCE_EVIDENCE.json
见 LICENSE。eBPF 程序以 GPL 兼容许可证加载。
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
ebpf-rca
第三届中国研究生操作系统开源创新大赛参赛项目。目标平台为 openKylin、Kernel 6.6+、 x86_64/ARM64。
工具在内核事件点运行 eBPF 程序,将高频事件聚合到 BPF map;Go 用户态按真实采样窗口读取差分, 再用确定性规则完成检测和根因分类。输出包含关联对象、指标、时间窗、稳定根因代码、证据链与建议。
覆盖场景
tp_btf/sched_*、10 Hz per-CPU perf eventtp_btf/block_rq_complete;异常后按需tp_btf/iomap_dio_rw_beginvmscantracepoint、tp_btf/mark_victimschedule的 fentry/fexit;可选tp_btf/sched_*tp_btf/sys_enter;独立 target 或全局慢调用 opt-in 追加 rawsys_exitI/O 主路径只在最终 complete 读取
request.start_time_ns,独立模式按稳定分配时间确定性采样 1/8 并以逆概率权重还原,all-mode 使用 1/32 事件采样与 1/5 duty。块层指标先触发异常,随后才按需挂载 direct-I/O 提交探针;只有设备、窗口、覆盖率、Top share、实际样本数与 PID starttime 全部通过门槛, 才把 PID/文件写入根因对象,否则保持设备级结论。内存检测由持续系统压力触发,进程匿名 RSS/direct reclaim/major fault 增量只负责根因对象归因。快速运行
仓库已跟踪 bpf2go 生成物;普通 clean clone 可直接构建:
如需跳过本机构建,可直接使用
release/openkylin-x86_64/中的 Linux x86_64 预构建版本。请先按目录内说明校验 SHA-256,再授予执行权限并以 root 或等价 capability 运行。预构建文件用于快速复现,不替代源码和构建脚本。修改
.bpf.c时才需要在目标内核重新生成:默认部署只校验并消费已提交的 bpf2go 产物,不改写
go.mod、vmlinux.h或生成文件。--regenerate在/var/tmp的临时 clean tree 中使用dependencies.lock.json固定的依赖和目标机 BTF 重建,仅输出生成物 hash 对比,不覆盖工作区。加载探针需要 root 或等价 capability。strict all-mode 需要表中全部内核能力;单场景只要求对应 collector 的挂载点。锁符号化还需要可解析的
/proc/kallsyms。可视化
程序在 stderr 输出带临时 token 的本机 URL。服务只监听 loopback;远程查看使用 SSH 端口转发。 CPU/lock 展示探针实际采到的栈;lock 的用户栈绑定采样 waiter TID,不是 owner 栈。 I/O/mem/syscall 只展示指标,不合成火焰图。
strict all-mode 会按事件合并跨层症状:块 I/O 主报告吸收关联窗口内的 I/O-path syscall;只有被这些 syscall 证据确认的同 PID CPU 症状才会并入,不同 PID 仍独立报告。PI futex 只把 helper entry 时原子读取的状态字解释为 owner 快照;普通非 PI futex 没有可靠 owner,
waker_tid也只表示唤醒者。默认全局/all-mode syscall 是 frequency-only。
--scenario syscall --target-pid PID可对目标树的 非等待型调用做精确 enter/exit;--scenario syscall --target-pid 0 --syscall-global-latency显式 启用全局慢调用模式,也只精确配对非等待型调用。epoll/futex/read/write 等等待型调用在两种精确模式 中仍只统计频率,不因正常 wall time 较长触发高耗时结论。 frequency-only duty 在挂载前预写内核单调时钟[start_ns,end_ns),并提前挂载 tracing link; BPF 以bpf_ktime_get_ns()自行开关窗口,用户态边界唤醒不参与开启或关闭,只在窗口结束后卸载。 因此调度迟到不会移动统计边界。全局模式先做独立 1/16 事件筛选,只有入样事件读取窗口 map 和 内核时钟;syscall 时间片为每个 Poll 的 1/20,总权重 320。窗口内随机事件筛选保持无偏,时间 外推要求片段对整窗具有代表性;全部 BPF 运行时间仍计入正式性能开销。文档入口
测试与复现
仓库直接包含完整测试树,不需要额外覆盖包:
当前源码树包含 24 个 Go 测试文件(179 个
Test*函数)和 4 个 Python 测试文件 (48 个test_*函数)。结构化会话格式为DiagnosticSession 1.1。仓库内附带ebpf-rca-demo.mp4演示视频,比赛平台如有独立视频字段, 可同时上传同一文件。证据边界
仓库不附带当前提交的正式 platform bundle,也不宣称当前 checkout 已完成 openKylin 正式平台验收。
evidence/reference-openkylin/保存的是 2026-07-27、openKylin x86_64、Kernel 6.6.0-22-generic 上的冻结前历史回归,运行器未记录确切source_commit,因此只能 作为方法与结果快照参考,不能外推为当前提交成绩。该历史准确率快照为 100/100 有效轮次通过;严格性能复测中 all-mode 最大吞吐下降为 1.851%、 最大组合内存为 60.906 MiB,但 fio P99 增幅为 6.256%,超过 5% 门槛,因此不能宣称性能验收通过。 完整引用边界见
REFERENCE_EVIDENCE.json。 ARM64 仅提供静态交叉编译门禁,不宣称已通过 ARM64 目标内核 verifier 或实机运行;不宣称 RISC-V 适配完成。License
见 LICENSE。eBPF 程序以 GPL 兼容许可证加载。