README锚点偏移按实测导航栏高度精调为52px
参赛队伍:超威战队 赛题:基于eBPF的系统异常观测与根因定位工具(社区赛题),赛题原文见 docs/赛题要求.md
sysrca(System Root Cause Analyzer)是一款基于 eBPF(libbpf + CO-RE)的轻量级系统异常观测与根因定位工具。 它以低侵入、低开销的方式在内核态采集调度、块 I/O、内存回收、锁竞争与系统调用等关键事件, 结合 /proc、/sys 系统指标进行多维关联分析与因果排序,实时识别典型系统异常,输出包含证据链的 结构化诊断结论(JSON/Markdown/YAML),并提供 Web 可视化界面。
sysrca
一句话验证:sudo ./scripts/install_deps.sh && make -C src && sudo ./scripts/run_scenario.sh all 60
sudo ./scripts/install_deps.sh && make -C src && sudo ./scripts/run_scenario.sh all 60
覆盖赛题要求的全部 5 类典型异常场景:
内核态 5 个 BPF 模块把每事件数据折叠为计数/求和/最大值/log2 直方图存于 map;用户态每窗口 (默认 5s)批量读取并清零,融合 /proc//sys 指标完成检测、根因分类与证据链组装;结束时做 因果排序并生成报告。
结构化输出的字段构成:
评测环境:openKylin 2.0 SP1(内核 6.6.0-22)QEMU/KVM 虚拟机 4核8G(与赛题基础评测环境一致), 按赛题官方参考命令原始参数(180 秒、fio 4G)实测,报告原件见 output/openkylin-verify/official/:
另:memhog 高压内存场景可稳定触发「内存抖动/OOM」(critical, 95%),OOM 受害/触发进程均定位。
空载连续观测零误报;性能开销:计算型基准吞吐 -0.05%,纯上下文切换微基准(最坏情况)约 -29%, 工具自身 CPU≈0、内存约 5MB(详见 docs/images/overhead.png)。
# 1. 安装依赖(openKylin/Ubuntu/Debian 用 apt,openEuler/Fedora 用 dnf; # 已自动处理 openKylin nile 源的 clang/bpftool/stress-ng 依赖问题) sudo ./scripts/install_deps.sh # 2. 编译(自动生成 vmlinux.h 与系统调用表;无 bpftool 时自动使用内置回退头文件) make -C src # 3. 运行(默认全部 5 个模块,5s 一个分析窗口,Ctrl-C 结束并出报告) sudo ./src/sysrca -d 60 -o report -f json,md,yaml # 4. 一键复现异常场景并验证诊断(cpu|io|mem|lock|syscall|all) sudo ./scripts/run_scenario.sh lock 60 # 5. 评估工具自身开销 sudo ./scripts/overhead_bench.sh 30 # 6. Web 可视化查看诊断报告(零依赖,浏览器打开 http://127.0.0.1:8688) python3 scripts/sysrca_web.py
在任意 x86_64 Linux 主机上一键构建 openKylin 评测虚拟机并自动完成全部验证:
sudo ./scripts/build_openkylin_vm.sh /opt/okylin-vm # 构建(含内核6.6与工具链) sudo /opt/okylin-vm/start_vm.sh # 启动(SSH 127.0.0.1:2222 / okylin) ./scripts/vm_verify.sh # 虚拟机内编译+五场景+开销评估
sudo sysrca [选项] -d, --duration SEC 观测总时长,0 表示持续运行至 Ctrl-C(默认 0) -i, --interval SEC 分析窗口长度(默认 5) -m, --modules LIST 启用模块:cpu,io,mem,lock,syscall(默认全部) -p, --pid PID 仅观测指定进程(默认全系统) -o, --output PREFIX 报告文件前缀(默认 sysrca_report) -f, --format LIST 输出格式:json,md,yaml(默认 json,md) -c, --config FILE 阈值配置文件(key=value,见 configs/sysrca.conf) -b, --bpf-path DIR BPF 对象目录(默认与可执行文件同级的 bpf/) -q, --quiet 不打印实时窗口信息 -V, --version 显示版本
全部检测阈值(CPU 利用率、I/O P99、锁等待频率、缺页速率等 15 项)可通过 configs/sysrca.conf 调整,含义见 docs/USAGE.md。
控制台实时输出(每窗口一行概览 + 异常告警):
[窗口#3 07:37:30] CPU 94.8% 切换 559598 | IO 17 iops P99 5.4ms | 内存可用 95.2% | 锁竞争等待 9578ms | 系统调用 900794 >> [warning] 锁竞争 | 锁实例 0xfe1c80(进程 stress-ng-mutex, tgid=3247) 指标: 热点锁平均等待=0.08 ms 等待次数=119808 (23962 次/秒) 并发等待线程数=2 根因: 进程 stress-ng-mutex 的 2 个线程集中争用同一 futex(0xfe1c80)... (置信度 70%)
JSON 报告中的一条异常记录(字段稳定,便于机器解析与评测):
{ "type": "锁竞争", "severity": "warning", "object": "锁实例 0xfe1c80(进程 stress-ng-mutex, tgid=3247)", "time_window": {"start": "2026-07-29 07:37:30", "end": "2026-07-29 07:37:39"}, "key_metrics": {"热点锁平均等待": "0.08 ms", "热点锁等待次数": "119808 (23962 次/秒)", "并发等待线程数": "2", "竞争锁等待总量": "46661.1 ms"}, "evidence_chain": [ "futex 跟踪:锁 0xfe1c80 窗口内等待 119808 次(23962 次/秒),平均 0.08ms(阈值 10ms)...", "该锁最大并发等待线程数 2(>=2 表明存在真实同时争用,已排除线程池空闲阻塞等待)", "等待线程 Top1:stress-ng-mutex(tid=3479) 等待 119810 次、累计 9578.9ms", "同期上下文切换 689401 次/秒,与锁等待相互印证(线程因抢锁失败被频繁挂起唤醒)" ], "suspected_root_cause": "进程 stress-ng-mutex 的 2 个线程集中争用同一 futex(0xfe1c80)...", "suggestion": "建议缩小临界区、拆分热点锁(分段锁/无锁结构),或用 perf lock ...", "confidence": 0.7 }
报告同时保留每个窗口的原始聚合指标(windows[].metrics),支持结论回溯复核; Markdown 版含诊断结论、异常明细与窗口概览表,YAML 版面向自动化流水线。
windows[].metrics
python3 scripts/sysrca_web.py # 默认扫描 output/ 下的 JSON 报告 python3 scripts/sysrca_web.py -d /path -p 8688
浏览器打开 http://127.0.0.1:8688:观测概览卡片、诊断结论、CPU/I/O/内存/锁/系统调用 五维指标时间线,以及可逐条展开证据链与根因的异常明细。服务端仅用 Python 标准库, 前端 ECharts 已离线打包,无需外网。
http://127.0.0.1:8688
判定叠加滑动基线 z-score(偏离≥3σ 写入证据链并提高置信度);汇总结论做因果排序—— 锁竞争/内存压力/文件I/O等待引发的 CPU 升高会归因到资源类根因,CPU 异常视为伴生现象。 详见 docs/DESIGN.md。
-m
复测方法:sudo ./scripts/overhead_bench.sh 30(A/B 对比,自动输出报告)。
sudo ./scripts/overhead_bench.sh 30
src/common.h BPF 与用户态共享结构定义 src/bpf/ 5 个 eBPF 内核态观测模块(CO-RE)+ 内置 vmlinux.h 回退 src/user/ 用户态:加载采集(collector) / 检测引擎(detector) / 报告(report) tools/ lockbench(锁竞争压测)、memhog(内存抖动压测) web/ Web 可视化前端(ECharts 离线仪表盘) scripts/ 安装/场景复现/开销评测/openKylin虚拟机/Web服务/文档生成等脚本 configs/ 阈值配置(key=value,全部可调) docs/ 文档、图表与赛题原文 output/openkylin-verify/ openKylin 实测报告原件 output/openkylin-verify/official/ 赛题官方参考命令(180s)实测报告原件
BPFTOOL=/path/to/bpftool make -C src
bpftool prog list
感谢 eBPF/libbpf 社区、openKylin 社区及 stress-ng、fio、Apache ECharts 等开源项目。
本项目以 GPL-2.0 协议开源(eBPF 内核态部分要求 GPL 兼容协议)。第三方组件引用情况 见项目说明书”代码原创说明”章节。
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
sysrca —— 基于eBPF的系统异常观测与根因定位工具
sysrca(System Root Cause Analyzer)是一款基于 eBPF(libbpf + CO-RE)的轻量级系统异常观测与根因定位工具。 它以低侵入、低开销的方式在内核态采集调度、块 I/O、内存回收、锁竞争与系统调用等关键事件, 结合 /proc、/sys 系统指标进行多维关联分析与因果排序,实时识别典型系统异常,输出包含证据链的 结构化诊断结论(JSON/Markdown/YAML),并提供 Web 可视化界面。一句话验证:
sudo ./scripts/install_deps.sh && make -C src && sudo ./scripts/run_scenario.sh all 60目录
功能特性
覆盖赛题要求的全部 5 类典型异常场景:
总体架构与工作原理
内核态 5 个 BPF 模块把每事件数据折叠为计数/求和/最大值/log2 直方图存于 map;用户态每窗口 (默认 5s)批量读取并清零,融合 /proc//sys 指标完成检测、根因分类与证据链组装;结束时做 因果排序并生成报告。
结构化输出的字段构成:
openKylin 实测结果(官方参考负载)
评测环境:openKylin 2.0 SP1(内核 6.6.0-22)QEMU/KVM 虚拟机 4核8G(与赛题基础评测环境一致), 按赛题官方参考命令原始参数(180 秒、fio 4G)实测,报告原件见 output/openkylin-verify/official/:
另:memhog 高压内存场景可稳定触发「内存抖动/OOM」(critical, 95%),OOM 受害/触发进程均定位。
空载连续观测零误报;性能开销:计算型基准吞吐 -0.05%,纯上下文切换微基准(最坏情况)约 -29%, 工具自身 CPU≈0、内存约 5MB(详见 docs/images/overhead.png)。
快速开始
在任意 x86_64 Linux 主机上一键构建 openKylin 评测虚拟机并自动完成全部验证:
命令行参数
全部检测阈值(CPU 利用率、I/O P99、锁等待频率、缺页速率等 15 项)可通过 configs/sysrca.conf 调整,含义见 docs/USAGE.md。
输出示例
控制台实时输出(每窗口一行概览 + 异常告警):
JSON 报告中的一条异常记录(字段稳定,便于机器解析与评测):
报告同时保留每个窗口的原始聚合指标(
windows[].metrics),支持结论回溯复核; Markdown 版含诊断结论、异常明细与窗口概览表,YAML 版面向自动化流水线。Web 可视化
浏览器打开
http://127.0.0.1:8688:观测概览卡片、诊断结论、CPU/I/O/内存/锁/系统调用 五维指标时间线,以及可逐条展开证据链与根因的异常明细。服务端仅用 Python 标准库, 前端 ECharts 已离线打包,无需外网。异常判定与根因分类
判定叠加滑动基线 z-score(偏离≥3σ 写入证据链并提高置信度);汇总结论做因果排序—— 锁竞争/内存压力/文件I/O等待引发的 CPU 升高会归因到资源类根因,CPU 异常视为伴生现象。 详见 docs/DESIGN.md。
性能开销
-m关闭高频模块降低)复测方法:
sudo ./scripts/overhead_bench.sh 30(A/B 对比,自动输出报告)。多平台适配
目录结构与文档
常见问题
BPFTOOL=/path/to/bpftool make -C srcbpftool prog list复核)已知限制
提交材料
致谢与开源协议
感谢 eBPF/libbpf 社区、openKylin 社区及 stress-ng、fio、Apache ECharts 等开源项目。
本项目以 GPL-2.0 协议开源(eBPF 内核态部分要求 GPL 兼容协议)。第三方组件引用情况 见项目说明书”代码原创说明”章节。