新增赛题验收矩阵
ebpf-anomaly-rootcause 是一个面向 Linux/openKylin/openEuler 的系统异常观测与根因定位工具。项目用 Python 组织诊断流程,结合 procfs 与 bpftrace/eBPF 采集 CPU、I/O、内存、锁竞争和系统调用信号,并输出 JSON、完整 Markdown 报告和更容易阅读的中文摘要报告。
ebpf-anomaly-rootcause
anomdiag diagnose
anomdiag summarize
anomdiag doctor
anomdiag install-deps
--dry-run
cpu
io
memory
lock
syscall
all
JSON
YAML
Markdown
HTML
scripts/acceptance_matrix.py
acceptance_matrix.json
acceptance_matrix.md
procfs
anomdiag/ collectors/ # 指标采集入口,当前以 procfs + bpftrace 为主 analyzers/ # 根因判断规则 report/ # JSON、完整 Markdown、可读摘要报告 utils/ # 命令执行、运行环境探测、指标模型 bpftrace/ # bpftrace 采集脚本 scripts/ # 异常复现与演示脚本 examples/ # 示例输入/输出 docs/ # 设计与开发文档 tests/ # 自动化测试
python3 -m venv .venv source .venv/bin/activate python -m pip install -e ".[dev]"
在 openKylin/openEuler/Ubuntu 真机或云服务器上采集 eBPF 信号时,建议先检查环境:
anomdiag doctor anomdiag install-deps
如果确认要自动安装依赖:
anomdiag install-deps --yes
最适合演示的一条命令:
bash scripts/demo_cpu.sh
脚本会自动制造一个 CPU 压力场景,运行 CPU 诊断,并在终端打印 reports/latest_summary.md 的中文可读摘要。输出文件包括:
reports/latest_summary.md
reports/cpu_real.json # 完整机器可读结果 reports/latest_summary.md # 中文可读摘要 reports/cpu_stress.log # 压力工具日志
内存压力演示:
bash scripts/demo_memory.sh
默认参数会使用较保守的内存压力,适合 2 核 2G 云服务器先跑通。输出文件包括:
reports/memory_real.json # 完整机器可读结果 reports/latest_memory_summary.md # 中文可读摘要 reports/memory_stress.log # 压力工具日志
I/O 延迟抖动演示:
bash scripts/demo_io.sh
脚本会启动随机读写压力,运行 I/O 诊断,并生成中文可读摘要:
reports/io_real.json # 完整机器可读结果 reports/latest_io_summary.md # 中文可读摘要 reports/io_stress.log # 压力工具日志
如果已经有 JSON 诊断结果,也可以单独生成摘要:
anomdiag summarize reports/cpu_real.json --output reports/latest_summary.md cat reports/latest_summary.md
查看支持的诊断目标:
anomdiag list-targets
在任意开发环境验证流程:
anomdiag diagnose all --duration 5 --dry-run --format markdown
采集 CPU 异常信号并输出 JSON:
anomdiag diagnose cpu --duration 30 --format json --output reports/cpu.json
采集内存压力信号并输出 JSON:
anomdiag diagnose memory --duration 10 --format json --output reports/memory.json
采集 I/O 延迟信号并输出 JSON:
anomdiag diagnose io --duration 10 --format json --output reports/io.json
输出完整 Markdown 报告:
anomdiag diagnose cpu --duration 30 --format markdown --output reports/cpu.md
输出 YAML 结构化报告:
anomdiag diagnose all --duration 10 --format yaml --output reports/diagnosis.yaml
输出 HTML 报告:
anomdiag diagnose all --duration 10 --format html --output reports/diagnosis.html
diagnose 输出会保留原始 metrics 和 findings,同时增加 diagnosis 顶层字段,便于机器解析和人工复核:
diagnose
metrics
findings
diagnosis
diagnosis.schema_version # 报告结构版本 diagnosis.time_window # 观测开始/结束时间、持续时间、采样间隔 diagnosis.automatic_classification # CPU/I/O/内存/锁/syscall 自动归类 diagnosis.primary_cause # 多异常并发时的主因 diagnosis.findings_ranked # 按严重级别和置信度排序的异常列表 diagnosis.correlations # 多维关联关系 diagnosis.runtime_overhead # 采集方式、指标数量、开销测量说明 diagnosis.container_observability # 容器运行时、container ID、cgroup 上下文 diagnosis.plugins # 内置插件清单和扩展点 diagnosis.compatibility_matrix # 架构、发行版、内核适配矩阵
每条 finding 也会补充:
anomaly_type # 异常类型 related_processes # 关联进程 related_threads # 关联线程,存在 tid 时自动填充 related_resources # 块设备、文件路径、锁实例、syscall 等资源 container_context # Docker / Podman / containerd / cgroup 信息 key_metrics # 支撑判断的关键指标 time_window # 当前结论对应的观测窗口 suspected_root_cause # 疑似根因 evidence_chain # 为什么这么判断的证据链 recommendations # 建议性结论 confidence # 诊断置信度 rank # 主因排序
当前 CPU、内存、I/O 已能稳定形成真实闭环;CPU 已补线程级热点、热点函数和用户态栈样本,I/O 已补文件路径,锁竞争已补线程等待、wchan/futex 热点和 futex 栈样本,syscall 已补具体调用、错误码和慢调用栈样本;容器/cgroup 上下文、插件清单和 HTML 报告也已接入。
平台适配说明:当前服务器已验证 x86_64 / Ubuntu;openKylin、openEuler、Debian、Anolis、ARM64、RISC-V 走 procfs 基线兼容设计,eBPF 路径需要目标系统提供 tracefs/debugfs 与 bpftrace tracepoints。anomdiag doctor 会输出当前机器的架构、发行版、内核和兼容矩阵。
旧命令 anomdiag run --target cpu 仍然可用,diagnose 是更适合比赛演示的别名。
anomdiag run --target cpu
bash scripts/reproduce/cpu_stress.sh bash scripts/reproduce/io_stress.sh bash scripts/reproduce/memory_stress.sh bash scripts/reproduce/lock_stress.sh
建议先启动对应复现脚本,再运行 anomdiag diagnose <target> 采集诊断结果。
anomdiag diagnose <target>
锁竞争诊断示例:
bash scripts/reproduce/lock_stress.sh 20 8 & anomdiag diagnose lock --duration 8 --format json --output reports/lock.json anomdiag summarize reports/lock.json --output reports/latest_lock_summary.md
python -m pytest python -m ruff check .
开销测量:
bash scripts/bench/overhead.sh 10 reports cat reports/overhead.md
更多开发说明见 docs/development.md,测试与复现说明见 docs/testing.md。
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
ebpf-anomaly-rootcause
ebpf-anomaly-rootcause是一个面向 Linux/openKylin/openEuler 的系统异常观测与根因定位工具。项目用 Python 组织诊断流程,结合 procfs 与 bpftrace/eBPF 采集 CPU、I/O、内存、锁竞争和系统调用信号,并输出 JSON、完整 Markdown 报告和更容易阅读的中文摘要报告。当前能力
anomdiag diagnose:执行采集、规则分析和报告生成,输出结构化根因诊断结果。anomdiag summarize:把 JSON 诊断结果转换成中文可读摘要,方便直接查看和答辩展示。anomdiag doctor:检查 bpftrace、stress-ng、fio、tracefs/procfs 等运行环境。anomdiag install-deps:打印或执行当前 Linux 发行版的依赖安装命令。--dry-run:在没有 eBPF 权限的开发机上验证完整流程。cpu、io、memory、lock、syscall、all。JSON、YAML、Markdown、HTML输出;报告包含异常类型、关联进程/线程、关键指标、时间窗口、疑似根因、证据链、建议结论和主因排序。scripts/acceptance_matrix.py会根据报告和证据目录生成acceptance_matrix.json与acceptance_matrix.md,把评分项拆成“已验证 / 部分验证 / 待真机 / 未通过”。procfs基线模式,在没有 bpftrace 时也能给出诊断结果。目录结构
安装
在 openKylin/openEuler/Ubuntu 真机或云服务器上采集 eBPF 信号时,建议先检查环境:
如果确认要自动安装依赖:
快速看到结果
最适合演示的一条命令:
脚本会自动制造一个 CPU 压力场景,运行 CPU 诊断,并在终端打印
reports/latest_summary.md的中文可读摘要。输出文件包括:内存压力演示:
默认参数会使用较保守的内存压力,适合 2 核 2G 云服务器先跑通。输出文件包括:
I/O 延迟抖动演示:
脚本会启动随机读写压力,运行 I/O 诊断,并生成中文可读摘要:
如果已经有 JSON 诊断结果,也可以单独生成摘要:
常用命令
查看支持的诊断目标:
在任意开发环境验证流程:
采集 CPU 异常信号并输出 JSON:
采集内存压力信号并输出 JSON:
采集 I/O 延迟信号并输出 JSON:
输出完整 Markdown 报告:
输出 YAML 结构化报告:
输出 HTML 报告:
结构化诊断字段
diagnose输出会保留原始metrics和findings,同时增加diagnosis顶层字段,便于机器解析和人工复核:每条 finding 也会补充:
当前 CPU、内存、I/O 已能稳定形成真实闭环;CPU 已补线程级热点、热点函数和用户态栈样本,I/O 已补文件路径,锁竞争已补线程等待、wchan/futex 热点和 futex 栈样本,syscall 已补具体调用、错误码和慢调用栈样本;容器/cgroup 上下文、插件清单和 HTML 报告也已接入。
平台适配说明:当前服务器已验证 x86_64 / Ubuntu;openKylin、openEuler、Debian、Anolis、ARM64、RISC-V 走 procfs 基线兼容设计,eBPF 路径需要目标系统提供 tracefs/debugfs 与 bpftrace tracepoints。
anomdiag doctor会输出当前机器的架构、发行版、内核和兼容矩阵。旧命令
anomdiag run --target cpu仍然可用,diagnose是更适合比赛演示的别名。兼容性
procfs基线模式通常可用。--dry-run做流程开发;真实 eBPF 采集应放在 Linux 机器或云服务器上。异常复现
建议先启动对应复现脚本,再运行
anomdiag diagnose <target>采集诊断结果。锁竞争诊断示例:
开发
开销测量:
更多开发说明见 docs/development.md,测试与复现说明见 docs/testing.md。