操作系统大赛决赛
SysDiag-eBPF 是一款面向 openKylin / Linux Kernel 6.6+ 的轻量级系统异常观测与根因定位工具。项目基于 eBPF 低侵入采集内核与用户态行为指标,结合规则引擎、可选 LLM 辅助说明和 Agent 本地校验评判,输出可回溯、可复现、可机器解析的诊断报告。
本项目面向“中国研究生操作系统开源创新大赛”社区赛题“基于 eBPF 的系统异常观测与根因定位工具”,覆盖 CPU、I/O、内存、锁竞争、系统调用热点五类典型异常场景,并提供 CLI、Web UI、复现实验脚本和 Markdown / JSON / YAML 报告输出能力。
在云计算、边缘计算和桌面系统负载复杂化的背景下,CPU 异常占用、I/O 延迟抖动、内存回收压力、锁竞争和系统调用热点常常具有短时、突发、定位链路长的特点。传统日志和静态监控难以及时给出细粒度根因。
SysDiag-eBPF 的设计目标是:
SysDiag-eBPF ├── 采集层 │ ├── bpf/*.bpf.c # eBPF 程序 │ ├── pkg/ebpf # bpf2go 生成绑定与 probe 加载 │ └── pkg/collector # CPU / Memory / I/O / Lock / Syscall 采集插件 ├── 指标层 │ └── model.MetricSet # 聚合后的系统指标与标签 ├── 诊断层 │ ├── pkg/analyzer # 规则引擎,输出正式诊断 │ ├── pkg/agent # Eino runtime、证据库、预算和工具网关 │ ├── pkg/agentjudge # Agent 评判与本地 validator │ └── pkg/llm # OpenAI 兼容接口的辅助报告生成 ├── 报告层 │ └── pkg/reporter # Markdown / JSON / YAML reporter └── 交互层 ├── cmd/sysdiag # CLI └── cmd/sysdiag-ui # Web UI
诊断优先级:
规则引擎正式诊断 > Agent 本地校验通过的补充发现 > LLM/Agent 文字建议
/sys/kernel/btf/vmlinux
git clone https://gitee.com/wjjhelloworld/e-bpf.git cd e-bpf
openKylin 环境推荐:
sudo ./scripts/setup_openkylin.sh
通用 Linux 用户态工具链安装:
./scripts/install_env.sh source ~/.sysdiag_env.sh
make build ./sysdiag check-env
如果检查失败,请重点确认:
clang
llvm
bpftool
go
make build make build-ui
生成文件:
./sysdiag # CLI 工具 ./sysdiag-ui # Web UI 工具
只要修改了 bpf/*.bpf.c,必须先重新生成 eBPF 对象和 Go 绑定:
bpf/*.bpf.c
make generate make build
make generate 会执行:
make generate
go generate ./pkg/ebpf/...
它会将 bpf/*.bpf.c 编译并嵌入到 pkg/ebpf/*_bpfel.o 和 pkg/ebpf/*_bpfel.go 中。否则 Go 程序运行时可能仍加载旧的 eBPF 字节码。
pkg/ebpf/*_bpfel.o
pkg/ebpf/*_bpfel.go
./sysdiag version
./sysdiag check-env
sudo ./sysdiag observe --duration 30 --plugins cpu,memory,io,lock,syscall
sudo ./sysdiag diagnose \ --duration 60 \ --plugins cpu,memory,io,lock,syscall \ --format markdown \ --output report.md
sudo ./sysdiag diagnose --duration 60 --plugins cpu,memory,io,lock,syscall --format json --output report.json sudo ./sysdiag diagnose --duration 60 --plugins cpu,memory,io,lock,syscall --format yaml --output report.yaml
sudo ./sysdiag diagnose \ --duration 60 \ --plugins cpu,memory,io,lock,syscall \ --llm \ --agent-judge \ --format markdown \ --output ai_report.md
LLM 配置示例:
cp config/llm.env.example config/llm.env
编辑 config/llm.env,填写:
config/llm.env
SYSDIAG_LLM_PROVIDER=openai-compatible SYSDIAG_LLM_BASE_URL=https://api.example.com/v1 SYSDIAG_LLM_API_KEY=your_api_key SYSDIAG_LLM_MODEL=deepseek-chat
项目提供 demo/run_demo.sh,用于自动检查运行环境、构建 sysdiag 和 sysdiag-ui、启动 Web UI,并在图形环境中打开默认浏览器。
demo/run_demo.sh
sysdiag
sysdiag-ui
首次运行前赋予脚本可执行权限:
chmod +x demo/run_demo.sh
在项目根目录执行:
./demo/run_demo.sh
脚本启动成功后,访问:
http://127.0.0.1:8080
如果已经完成构建,可跳过编译步骤:
./demo/run_demo.sh --skip-build
如果运行环境不支持自动打开浏览器,或只需要启动服务,可使用:
./demo/run_demo.sh --no-browser
构建日志、Web UI 启动日志和进程号保存在 demo/output/。脚本结束时会显示对应的停止命令,可使用输出的进程号停止 Web UI:
demo/output/
sudo kill <进程号>
Demo 需要在 Linux 或 openKylin 环境中运行。在线 eBPF 诊断通常需要 BTF 和管理员权限;脚本会在启动前检查相关环境并输出提示。
Web UI 是 CLI 的可视化封装,后端仍调用 sysdiag diagnose,诊断逻辑与 CLI 保持一致。
sysdiag diagnose
诊断摘要会区分“正式异常”“疑似环境噪声”和“未发现异常”三种状态。只有正式异常使用红色告警;浏览器、Web UI 等活动造成的疑似噪声使用黄色“需复核”提示,并保留完整证据链供评委检查。
sudo ./sysdiag-ui
默认监听:
如果 sysdiag 不在 sysdiag-ui 同目录,可使用:
sudo SYSDIAG_BIN=/path/to/sysdiag ./sysdiag-ui
--duration
--duration 60
--plugins
--plugins cpu,io
--format
--format markdown
--output
--output report.md
--llm
--agent-judge
--agent-judge 现在启动 Eino ChatModelAgent。Agent 只能调用 query_metrics、get_process_snapshot 和 collect_metrics,默认最多 4 次模型调用、5 次工具调用、2 次补采,单次补采最长 10 秒。
query_metrics
get_process_snapshot
collect_metrics
./sysdiag replay --input report.json --format markdown --output replay-report.md
回放不加载 eBPF 探针,也不重新调用模型,只使用 JSON 报告中的请求、指标、证据、工具轨迹和校验结果重新生成报告。
make build
./sysdiag
make build-ui
./sysdiag-ui
make test
go test ./...
make run
report.md
make run-llm
make benchmark
make clean
项目提供 5 类标准异常复现脚本,建议在两个终端中分别运行压测和诊断。
./scripts/run_cpu_case.sh
sudo ./sysdiag diagnose --duration 60 --plugins cpu --output cpu_report.md
CPU_HIGH_USAGE
./scripts/run_io_case.sh
sudo ./sysdiag diagnose --duration 60 --plugins io --output io_report.md
IO_LATENCY_SPIKE
IO_QUEUE_CONGESTION
./scripts/run_memory_case.sh
sudo ./sysdiag diagnose --duration 60 --plugins memory --output memory_report.md
MEMORY_PRESSURE
MEMORY_ACCESS_CHURN
./scripts/run_lock_case.sh
sudo ./sysdiag diagnose --duration 60 --plugins lock --output lock_report.md
LOCK_CONTENTION
./scripts/run_syscall_case.sh
sudo ./sysdiag diagnose --duration 60 --plugins syscall --output syscall_report.md
SYSCALL_HOTSPOT
顺序执行全部场景:
./scripts/run_all_cases.sh
sudo ./scripts/benchmark_overhead.sh overhead_report.md
测试内容包括:
性能结果会写入 overhead_report.md,可作为比赛说明书“实验测试”章节材料。
overhead_report.md
Markdown 报告默认包含:
报告中会保留浏览器、Web UI、工具自身活动等疑似环境噪声提示,但不默认过滤,便于评委复核证据链。
/proc/diskstats
Agent 是建议层,不替代规则引擎正式诊断。规则报告会在模型调用前原子落盘;模型配置错误、超时、工具失败或预算耗尽时,任务会以 completed_with_agent_error 结束并保留基础报告。其补充发现必须经过本地校验:
completed_with_agent_error
POSSIBLE_*
当前允许的 Agent 补充发现类型包括:
POSSIBLE_CPU_PRESSURE POSSIBLE_SCHEDULING_DELAY POSSIBLE_MEMORY_PRESSURE POSSIBLE_RECLAIM_THRASHING POSSIBLE_OOM_RISK POSSIBLE_IO_DEGRADATION POSSIBLE_IO_QUEUEING POSSIBLE_LOCK_CONTENTION POSSIBLE_SYSCALL_HOTSPOT POSSIBLE_SYSCALL_LATENCY POSSIBLE_SYSCALL_ERRORS
被拒绝或降级的 Agent 发现会写入报告,便于追踪模型输出和本地校验过程。
每份 JSON/YAML 报告还会保存 TaskID、观测窗口、采集状态、证据 ID、关键标签、实体身份、跨窗口趋势、工具调用轨迹、预算使用量、终止原因和未解决问题。
e-bpf/ ├── bpf/ # eBPF C 程序 ├── cmd/ │ ├── sysdiag/ # CLI 入口 │ └── sysdiag-ui/ # Web UI 入口 ├── config/ # LLM 配置示例 ├── docs/ # 安装、设计、运维和答辩文档 ├── examples/ # systemd 示例 ├── pkg/ │ ├── agentjudge/ # Agent 评判与本地校验 │ ├── agent/ # Eino runtime、evidence、policy、tools │ ├── analyzer/ # 规则诊断引擎 │ ├── collector/ # 采集插件 │ ├── ebpf/ # eBPF 加载和 bpf2go 生成文件 │ ├── llm/ # LLM 客户端 │ ├── model/ # 指标与报告数据结构 │ ├── reporter/ # Markdown / JSON / YAML 输出 │ └── utils/ # /proc、磁盘、环境工具 ├── scripts/ # 安装、复现、部署、benchmark 脚本 ├── Makefile └── README.md
eBPF 程序采用 GPL-2.0 / BSD-3-Clause 双许可;Go 用户态代码按本仓库约定执行。
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
SysDiag-eBPF
SysDiag-eBPF 是一款面向 openKylin / Linux Kernel 6.6+ 的轻量级系统异常观测与根因定位工具。项目基于 eBPF 低侵入采集内核与用户态行为指标,结合规则引擎、可选 LLM 辅助说明和 Agent 本地校验评判,输出可回溯、可复现、可机器解析的诊断报告。
本项目面向“中国研究生操作系统开源创新大赛”社区赛题“基于 eBPF 的系统异常观测与根因定位工具”,覆盖 CPU、I/O、内存、锁竞争、系统调用热点五类典型异常场景,并提供 CLI、Web UI、复现实验脚本和 Markdown / JSON / YAML 报告输出能力。
作品简介
在云计算、边缘计算和桌面系统负载复杂化的背景下,CPU 异常占用、I/O 延迟抖动、内存回收压力、锁竞争和系统调用热点常常具有短时、突发、定位链路长的特点。传统日志和静态监控难以及时给出细粒度根因。
SysDiag-eBPF 的设计目标是:
核心功能
系统架构
诊断优先级:
环境要求
/sys/kernel/btf/vmlinux安装说明
1. 获取代码
2. 安装依赖
openKylin 环境推荐:
通用 Linux 用户态工具链安装:
3. 环境检查
如果检查失败,请重点确认:
/sys/kernel/btf/vmlinux是否存在。clang、llvm、bpftool、go是否可用。编译说明
常规编译
生成文件:
修改 eBPF 程序后的编译
只要修改了
bpf/*.bpf.c,必须先重新生成 eBPF 对象和 Go 绑定:make generate会执行:它会将
bpf/*.bpf.c编译并嵌入到pkg/ebpf/*_bpfel.o和pkg/ebpf/*_bpfel.go中。否则 Go 程序运行时可能仍加载旧的 eBPF 字节码。运行说明
1. 查看版本
2. 检查运行环境
3. 采集指标但不生成诊断
4. 生成 Markdown 诊断报告
5. 生成 JSON / YAML 诊断报告
6. 启用 LLM 辅助和主动诊断 Agent
LLM 配置示例:
编辑
config/llm.env,填写:Demo 一键启动
项目提供
demo/run_demo.sh,用于自动检查运行环境、构建sysdiag和sysdiag-ui、启动 Web UI,并在图形环境中打开默认浏览器。首次运行前赋予脚本可执行权限:
在项目根目录执行:
脚本启动成功后,访问:
如果已经完成构建,可跳过编译步骤:
如果运行环境不支持自动打开浏览器,或只需要启动服务,可使用:
构建日志、Web UI 启动日志和进程号保存在
demo/output/。脚本结束时会显示对应的停止命令,可使用输出的进程号停止 Web UI:Web UI 运行说明
Web UI 是 CLI 的可视化封装,后端仍调用
sysdiag diagnose,诊断逻辑与 CLI 保持一致。诊断摘要会区分“正式异常”“疑似环境噪声”和“未发现异常”三种状态。只有正式异常使用红色告警;浏览器、Web UI 等活动造成的疑似噪声使用黄色“需复核”提示,并保留完整证据链供评委检查。
1. 编译 Web UI
2. 启动 Web UI
默认监听:
3. 指定 sysdiag 路径
如果
sysdiag不在sysdiag-ui同目录,可使用:4. Web UI 支持能力
命令参数
--duration--duration 60--plugins--plugins cpu,io--format--format markdown--output--output report.md--llm--llm--agent-judge--agent-judge--agent-judge现在启动 Eino ChatModelAgent。Agent 只能调用query_metrics、get_process_snapshot和collect_metrics,默认最多 4 次模型调用、5 次工具调用、2 次补采,单次补采最长 10 秒。离线回放已保存任务
回放不加载 eBPF 探针,也不重新调用模型,只使用 JSON 报告中的请求、指标、证据、工具轨迹和校验结果重新生成报告。
Makefile 快捷命令
make generatebpf/*.bpf.c重新生成 eBPF 对象和 Go 绑定make build./sysdiagmake build-ui./sysdiag-uimake testgo test ./...make runreport.mdmake run-llmmake benchmarkmake clean异常复现实验
项目提供 5 类标准异常复现脚本,建议在两个终端中分别运行压测和诊断。
./scripts/run_cpu_case.shsudo ./sysdiag diagnose --duration 60 --plugins cpu --output cpu_report.mdCPU_HIGH_USAGE./scripts/run_io_case.shsudo ./sysdiag diagnose --duration 60 --plugins io --output io_report.mdIO_LATENCY_SPIKE或IO_QUEUE_CONGESTION;设备无实际退化时允许不报警./scripts/run_memory_case.shsudo ./sysdiag diagnose --duration 60 --plugins memory --output memory_report.mdMEMORY_PRESSURE或MEMORY_ACCESS_CHURN./scripts/run_lock_case.shsudo ./sysdiag diagnose --duration 60 --plugins lock --output lock_report.mdLOCK_CONTENTION./scripts/run_syscall_case.shsudo ./sysdiag diagnose --duration 60 --plugins syscall --output syscall_report.mdSYSCALL_HOTSPOT顺序执行全部场景:
性能开销测试
测试内容包括:
性能结果会写入
overhead_report.md,可作为比赛说明书“实验测试”章节材料。诊断报告说明
Markdown 报告默认包含:
报告中会保留浏览器、Web UI、工具自身活动等疑似环境噪声提示,但不默认过滤,便于评委复核证据链。
正式诊断类型
CPU_HIGH_USAGEIO_LATENCY_SPIKEIO_QUEUE_CONGESTION/proc/diskstats周期采样的平均/峰值在途请求数MEMORY_PRESSUREMEMORY_ACCESS_CHURNLOCK_CONTENTIONSYSCALL_HOTSPOT主动诊断 Agent 说明
Agent 是建议层,不替代规则引擎正式诊断。规则报告会在模型调用前原子落盘;模型配置错误、超时、工具失败或预算耗尽时,任务会以
completed_with_agent_error结束并保留基础报告。其补充发现必须经过本地校验:POSSIBLE_*白名单内。当前允许的 Agent 补充发现类型包括:
被拒绝或降级的 Agent 发现会写入报告,便于追踪模型输出和本地校验过程。
每份 JSON/YAML 报告还会保存 TaskID、观测窗口、采集状态、证据 ID、关键标签、实体身份、跨窗口趋势、工具调用轨迹、预算使用量、终止原因和未解决问题。
项目目录
License
eBPF 程序采用 GPL-2.0 / BSD-3-Clause 双许可;Go 用户态代码按本仓库约定执行。