最终提交版本
基于 eBPF 的系统异常观测与根因定位工具
ebpf-diag-ecnu 是一款轻量级 Linux 系统异常实时观测与诊断工具,基于 eBPF 技术实现。支持对 CPU 异常占用、I/O 延迟抖动、内存抖动、锁竞争和系统调用热点五类典型场景进行实时观测、指标采集、事件关联分析和结构化诊断结果输出。
赛题: 全国研究生操作系统比赛 — 基于 eBPF 的系统异常观测与根因定位工具
目标平台: openKylin (Kernel 6.6+);x86_64 已动态验证,ARM64/RISC-V 具备构建适配但尚无原生动态证据
当前版本: v0.3.0(竞赛交付收尾版;5/5 观测链路与 M1–M5.5 证据化根因分析已完成)
名称说明: 当前工具名为 ebpf-diag-ecnu;EBPF_DIAG_* 环境变量和 ebpf_diag 内部 namespace 为兼容接口,继续保留。
ebpf-diag-ecnu
EBPF_DIAG_*
ebpf_diag
代码仓库: https://gitlink.org.cn/xingxiu/jyedxtycgcygydwgj
当前交付结论:官方 openKylin 2.0 SP2 Live x86_64 已完成 native-full;持久安装的 openKylin 2.0 SP2 已完成最新代码的 clean build、CTest、五类 native-smoke,以及锁、内存、I/O 安全证据和候选竞争专项真机验证。当前无独立慢盘,因此持久环境保持 target_eligible=no,不把专项 PASS 冒充 native-full。
target_eligible=no
名称变更后已用全新 build-ecnu 目录完成 PASS=15 FAIL=0 SKIP=1 静态验收和严格构建;SKIP 仅表示当前非 root 会话未重新加载五类 BPF。提交前应再执行一次 sudo bash scripts/validate_openkylin.sh --native-smoke,为新二进制名称形成最终动态日志。
build-ecnu
PASS=15 FAIL=0 SKIP=1
sudo bash scripts/validate_openkylin.sh --native-smoke
--target-pid
# 安装依赖 (Ubuntu/openKylin) sudo apt install -y build-essential cmake clang llvm libbpf-dev libelf-dev zlib1g-dev # 不要让 libbpf.so.0 指向 libbpf.so.1;这会破坏 iproute2 等系统程序的 ABI。 # 两个 SONAME 可并存,CMake 会优先选择 libbpf.so.1;也可显式指定: # cmake -S . -B build -DLIBBPF_LIBRARY=/path/to/libbpf.so.1 # 生成 vmlinux.h (基于当前内核) bpftool btf dump file /sys/kernel/btf/vmlinux format c > ebpf/vmlinux.h # 编译 cmake -S . -B build -DBUILD_TESTING=ON cmake --build build -j$(nproc) ctest --test-dir build --output-on-failure
# 监控 CPU 和内存异常,60秒,JSON 输出 sudo ./build/ebpf-diag-ecnu --monitor cpu,mem --duration 60 --output json # 全场景监控(5 类异常 + 交叉关联分析) sudo ./build/ebpf-diag-ecnu --monitor all --duration 60 \ --output json --output-file output/report.json --verbose # 一键测试 sudo bash scripts/test_all.sh # 阶段进展验证(普通用户执行静态验证,root 会增加动态 smoke) bash scripts/validate_progress.sh # 静态验证通过后,显式执行五类动态 smoke / 完整压力回归 sudo bash scripts/validate_progress.sh --dynamic sudo env EBPF_DIAG_TEST_DISK=/path/to/independent-test-disk \ bash scripts/validate_progress.sh --scenarios # M5.5 候选竞争真机验收;无独立慢盘时 CPU—I/O 分支会安全跳过 sudo bash scripts/test_hypothesis_competition.sh # 列出可用探针 sudo ./build/ebpf-diag-ecnu --list-probes
官方 openKylin 2.0 SP2 用户态镜像已经完成可复核 build/run。容器共享宿主内核,因此该结果只证明目标用户态工具链兼容,不能代替 openKylin Kernel 6.6+ 真机验收。
docker build -f docker/Dockerfile -t ebpf-diag-ecnu:openkylin-2.0 . docker run --rm ebpf-diag-ecnu:openkylin-2.0 # 在 openKylin 2.0 / Kernel 6.6+ 真机上 sudo bash scripts/validate_openkylin.sh --native-smoke
完整分层验收流程见 openKylin 验收指南。
ebpf-diag-ecnu/ ├── ebpf/ # eBPF 内核态程序 (.bpf.c) │ ├── cpu.bpf.c # CPU 异常观测探针 (sched_switch + sched_wakeup) │ ├── memory.bpf.c # 内存异常观测探针 (page_alloc + kswapd + OOM) │ ├── io.bpf.c # I/O 延迟观测探针 (block_rq_issue + block_rq_complete) │ ├── lock.bpf.c # 锁竞争观测探针 (futex_wait kprobe + kretprobe) │ ├── syscall.bpf.c # 系统调用热点探针 (sys_enter + sys_exit) │ └── common.bpf.h # 共享 eBPF 数据结构 ├── include/ # 用户态头文件 │ ├── types.h # 公共数据类型 (Event, Metrics, AnomalyReport) │ ├── collector.h # 采集器接口 (BaseCollector, 5 类 Collector) │ ├── detector.h # 检测器接口 (自适应基线检测) │ ├── analyzer.h # 症状分析、关联与最终摘要 │ ├── root_cause.h # Evidence/Incident/RootCause/Action 模型 │ └── reporter.h # 报告输出 (JsonReporter + SummaryData) ├── src/ # 用户态 C++ 实现 │ ├── main.cpp # CLI 入口 + 主循环 │ ├── core/ # EbpfLoader, EventReader, Logger, Symbols │ ├── collector/ # 5 类指标采集器 (主导进程追踪) │ ├── detector/ # 5 类异常检测器 (自适应基线) │ ├── analyzer/ # 根因分析 + 多维交叉关联 │ └── reporter/ # JSON 结构化输出 + 系统摘要 ├── scripts/ # 场景回归与性能脚本 ├── tests/ # 不需要 root 的 Detector/Reporter 单元测试 ├── docker/ # Dockerfile + docker-compose.yml ├── docs/ # 设计文档、测试方法、阶段总结 └── output/ # 诊断输出目录
stress-ng --cpu 4
stress-ng --vm 4 80%
fio
6.6.0-19-generic
6.6.0-24-generic #0ok1-KYLINOS
libbpf.so.1
以下展示最终报告的主要层次,省略了部分 Evidence 和 Action 字段:
{ "tool": "ebpf-diag-ecnu", "version": "0.3.0", "timestamp": "2026-07-30T...", "duration_seconds": 30, "total_anomalies": 2, "anomalies": [ { "type": "CPU异常占用", "severity": "critical", "object": { "pid": 234016, "tid": 234032, "comm": "m5_mix_lock" } } ], "evidence_catalog": [ { "id": "ev-000069", "source": "futex", "metric": "avg_wait_time_ms", "value": 0.014283, "quality": "sampled", "entity": { "pid": 234016, "process_start_time_ticks": 4473502, "resource": "futex@0x404138" } } ], "causal_edges": [ { "id": "edge-000001", "relation": "waits_on_futex", "evidence_ids": ["ev-000069"], "confidence": 0.90 } ], "hypothesis_relations": [ { "from_root_cause_id": "rc-0001", "relation": "explains_competing_evidence", "to_root_cause_id": "rc-0002", "evidence_ids": ["ev-000069"], "confidence": 0.75 } ], "incidents": [ { "id": "inc-0001", "root_cause_ids": ["rc-0001"] } ], "root_causes": [ { "rank": 1, "cause_code": "LOCK_CONTENTION_FUTEX", "status": "likely", "confidence": 0.97, "confidence_score": { "base": 0.80, "ceiling": 0.97, "factors": [ { "name": "observed_futex_wait_latency", "contribution": 0.05, "evidence_ids": ["ev-000069"] }, { "name": "multiple_waiters", "contribution": 0.03, "evidence_ids": ["ev-000068"] }, { "name": "waker_identity", "contribution": 0.04, "evidence_ids": ["ev-000073"] }, { "name": "ordered_wakeup", "contribution": 0.02, "evidence_ids": ["ev-000072"] }, { "name": "successful_wake_dominance", "contribution": 0.03, "evidence_ids": ["ev-000075"] }, { "name": "validated_owner_candidate", "contribution": 0.02, "evidence_ids": ["ev-000083"] } ], "final": 0.97 } }, { "rank": 2, "cause_code": "CPU_COMPUTE_HOTSPOT_UNCONFIRMED", "status": "hypothesis", "confidence": 0.45 } ], "summary": { "system_health_score": 87.0, "dominant_issue": "多个 owner 高频轮转的 glibc mutex 竞争", "dominant_issue_source": "ranked_root_cause", "dominant_root_cause": { "cause_code": "LOCK_CONTENTION_FUTEX", "status": "likely", "confidence": 0.97 }, "breakdown": { "cpu": 1, "memory": 0, "io": 0, "lock": 0, "syscall": 1, "correlations": 0 } } }
/proc/vmstat
1/4096
output/
ddf5298
GPL-2.0
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
ebpf-diag-ecnu
基于 eBPF 的系统异常观测与根因定位工具
简介
ebpf-diag-ecnu 是一款轻量级 Linux 系统异常实时观测与诊断工具,基于 eBPF 技术实现。支持对 CPU 异常占用、I/O 延迟抖动、内存抖动、锁竞争和系统调用热点五类典型场景进行实时观测、指标采集、事件关联分析和结构化诊断结果输出。
赛题: 全国研究生操作系统比赛 — 基于 eBPF 的系统异常观测与根因定位工具
目标平台: openKylin (Kernel 6.6+);x86_64 已动态验证,ARM64/RISC-V 具备构建适配但尚无原生动态证据
当前版本: v0.3.0(竞赛交付收尾版;5/5 观测链路与 M1–M5.5 证据化根因分析已完成)
名称说明: 当前工具名为
ebpf-diag-ecnu;EBPF_DIAG_*环境变量和ebpf_diag内部 namespace 为兼容接口,继续保留。代码仓库: https://gitlink.org.cn/xingxiu/jyedxtycgcygydwgj
当前交付结论:官方 openKylin 2.0 SP2 Live x86_64 已完成 native-full;持久安装的 openKylin 2.0 SP2 已完成最新代码的 clean build、CTest、五类 native-smoke,以及锁、内存、I/O 安全证据和候选竞争专项真机验证。当前无独立慢盘,因此持久环境保持
target_eligible=no,不把专项 PASS 冒充 native-full。名称变更后已用全新
build-ecnu目录完成PASS=15 FAIL=0 SKIP=1静态验收和严格构建;SKIP 仅表示当前非 root 会话未重新加载五类 BPF。提交前应再执行一次sudo bash scripts/validate_openkylin.sh --native-smoke,为新二进制名称形成最终动态日志。特性
--target-pid下采样成功的 pthread API 配对,输出 lock 返回到 unlock 进入的临界区下界且不对全系统挂载用户态锁探针快速开始
环境要求
编译
运行
openKylin 用户态容器验证
官方 openKylin 2.0 SP2 用户态镜像已经完成可复核 build/run。容器共享宿主内核,因此该结果只证明目标用户态工具链兼容,不能代替 openKylin Kernel 6.6+ 真机验收。
完整分层验收流程见 openKylin 验收指南。
项目结构
支持的异常场景
stress-ng --cpu 4stress-ng --vm 4 80%fioon 独立 USB 慢盘验证环境
6.6.0-19-generic,x86_646.6.0-24-generic #0ok1-KYLINOS内核层回归libbpf.so.1,不修改系统 SONAME输出格式
以下展示最终报告的主要层次,省略了部分 Evidence 和 Action 字段:
当前限制
6.6.0-19-genericx86_64 物理机完成 native-full;持久安装环境完成最新代码的 clean build、CTest、五类 native-smoke 和 M2–M5 专项真机验证,但因无独立慢盘未重跑 native-full;/proc/vmstat增量,RSS 增长只用于辅助归属;1/4096五轮测量的吞吐损失为 83.123%,不得作为常驻跟踪开启;该极端数值也不直接外推到具有业务临界区的应用。output/历史日志;Live 验收证据可从 Git 提交ddf5298恢复。文档导航
许可证
GPL-2.0