材料上传
基于 eBPF 的轻量级系统异常实时观测、指标采集、事件关联分析和诊断结果输出工具。
v3.0 | openKylin 2.0 SP2 适配 | 60 单元测试 | MIT 开源
/proc
./run.sh
┌──────────────────────────┐ │ run.sh 一键入口 │ │ quick | demo | daemon │ │ web | test | benchmark │ └──────────┬───────────────┘ │ ┌────────────────────────┼────────────────────────┐ ▼ ▼ ▼ ┌─────────────────┐ ┌─────────────────────┐ ┌─────────────────┐ │ CLI 模式 │ │ Daemon 模式 │ │ Web 模式 │ │ (ebpf_observer) │ │ (daemon.py) │ │ (web/app.py) │ │ 一次性诊断报告 │ │ 常驻轻量+触发深度 │ │ FastAPI+Chart.js│ └────────┬────────┘ └──────────┬──────────┘ └────────┬────────┘ │ │ │ └────────────────────────┼────────────────────────┘ │ ┌─────────────────┴─────────────────┐ │ 采集层 │ │ ┌───────────┐ ┌──────────────┐ │ │ │ eBPF 路径 │ │ /proc 路径 │ │ │ │ (BCC 5个 │ │ (Metrics- │ │ │ │ Monitor) │ │ Collector) │ │ │ └─────┬─────┘ └──────┬───────┘ │ └────────┼───────────────┼──────────┘ │ │ ▼ ▼ ┌─────────────────────────────────┐ │ MetricSnapshot (datatypes) │ │ cpu/mem/io/lock/syscall 指标 │ └─────────────┬───────────────────┘ │ ┌─────────────┴───────────────────┐ │ 分析层 │ │ ┌──────────────────────────┐ │ │ │ DiagnosticEngine (engine) │ │ │ │ • 阈值规则 (THRESHOLDS) │ │ │ │ • Z-Score 动态基线 │ │ │ │ • 趋势分析 (线性回归) │ │ │ │ • 多维关联评分矩阵 │ │ │ └───────────┬──────────────┘ │ │ │ │ │ ┌───────────┴──────────────┐ │ │ │ KnowledgeBase │ │ │ │ • 12 条因果推理链 │ │ │ │ • 条件匹配引擎 │ │ │ └───────────┬──────────────┘ │ │ │ │ │ ┌───────────┴──────────────┐ │ │ │ LLMAnalyzer (可选) │ │ │ │ • Ollama / OpenAI 后端 │ │ │ │ • 自动回退离线分析 │ │ │ └──────────────────────────┘ │ └─────────────┬───────────────────┘ │ ▼ ┌─────────────────────────────────┐ │ 输出层 │ │ OutputFormatter │ │ JSON | YAML | Markdown | HTML │ └─────────────────────────────────┘
压力发生 → eBPF 内核捕获事件 ──perf_buffer──→ Monitor 桥接层 │ /proc/stat, /proc/meminfo, ... ──read──→ MetricsCollector │ MetricSnapshot ←─────┘ │ DiagnosticEngine.analyze() ┌────────┼────────┐ │ 阈值 │ Z-Score │ 趋势 └────────┼────────┘ │ DiagnosticResult ┌────────┼────────┐ │ 知识库 │ LLM │ (可选增强) └────────┼────────┘ │ OutputFormatter │ JSON / YAML / Markdown / HTML
ebpf-observer/ │ ├── run.sh # ★ 项目统一入口(交互式菜单) ├── config.yaml # 全局配置文件 ├── pytest.ini # 测试配置 │ ├── src/ # 核心源代码 │ ├── ebpf_observer.py # 主入口:CLI、采集调度、报告生成 │ ├── daemon.py # Daemon 守护进程(常驻轻量监控) │ ├── datatypes.py # 共享数据结构(AnomalyType/MetricSnapshot 等) │ │ │ ├── monitors/ # eBPF 桥接层(5 个场景) │ │ ├── cpu_monitor.py # CPU:sched_switch tracepoint + 调度延迟 │ │ ├── io_monitor.py # I/O:blk_mq_start_request kprobe + 设备级统计 │ │ ├── mem_monitor.py # 内存:handle_mm_fault + OOM/kswapd/kmalloc │ │ ├── lock_monitor.py # 锁:mutex/futex/spinlock/rwsem + 调用栈 │ │ └── syscall_monitor.py # 系统调用:raw_tracepoint + 100+ 名称表 │ │ │ ├── analyzer/ # 分析引擎 │ │ ├── engine.py # 诊断引擎:阈值+Z-Score+趋势+关联评分 │ │ ├── knowledge_base.py # 因果知识库:12 条推理链 + 条件匹配 │ │ └── llm_analyzer.py # LLM 分析器:Ollama/OpenAI 后端 │ │ │ ├── output/ # 输出模块 │ │ └── formatter.py # JSON/YAML/Markdown/HTML 多格式输出 │ │ │ ├── web/ # Web 可视化控制台 │ │ └── app.py # FastAPI 后端 + 内嵌前端仪表盘 │ │ │ ├── bpftrace/ # bpftrace 替代监控脚本(BCC 不可用时) │ │ ├── cpu_monitor.bt │ │ ├── io_monitor.bt │ │ ├── mem_monitor.bt │ │ ├── lock_monitor.bt │ │ └── syscall_monitor.bt │ │ │ └── ebpf/ # 独立 eBPF C 程序(参考实现 + CO-RE 编译) │ ├── Makefile # clang → .bpf.o 编译系统 │ ├── cpu_monitor.c │ ├── io_monitor.c │ ├── mem_monitor.c │ ├── lock_monitor.c │ └── syscall_monitor.c │ ├── scripts/ # 辅助脚本 │ ├── deploy.sh # 一键部署(apt + pip) │ ├── test_scenarios.sh # 5 场景自动化测试 │ ├── benchmark.sh # 性能基准测试(CPU/内存/时延) │ └── stress/ # 内置压力测试脚本(零外部依赖) │ ├── run_stress.sh # 统一启动脚本 │ ├── cpu_stress.py # CPU 矩阵乘法/素数计算 │ ├── io_stress.py # I/O dd + Python 随机读写 │ ├── mem_stress.py # 大内存分配 + 缺页访问 │ ├── lock_stress.py # threading.Lock 多线程竞争 │ └── syscall_stress.py # fsync/read/write/stat 系统调用 │ ├── tests/ # 单元测试(pytest, 60 tests) │ ├── conftest.py # fixtures: 共享引擎/快照/报告 │ ├── test_collector.py # 采集器测试(14 tests) │ ├── test_diagnostic_engine.py # 诊断引擎测试(31 tests) │ └── test_formatter.py # 格式化器测试(15 tests) │ ├── deploy/ # 部署资源 │ └── ebpf-observer.service # systemd 服务文件 │ └── docs/ # 文档 ├── README.md # 本文档 └── container_guide.md # 容器环境适配指南
# 交互式菜单(推荐首次使用) ./run.sh # 命令行模式 sudo ./run.sh quick # 快速启动:60s 全场景 → JSON + Markdown sudo ./run.sh quick 120 cpu,mem # 自定义:120s 监控 CPU + 内存 sudo ./run.sh demo cpu # 演示模式:CPU 压力 + 观测 → HTML 报告 sudo ./run.sh test # 运行全部测试场景 sudo ./run.sh benchmark # 性能基准测试 sudo ./run.sh deploy # 一键部署依赖 sudo ./run.sh daemon # v3.0: 启动常态化监控守护进程 sudo ./run.sh web # v3.0: 启动 Web 可视化控制台 (端口 8080)
# 1. 部署依赖 sudo ./scripts/deploy.sh # 2. 基础使用 sudo python3 src/ebpf_observer.py --duration 60 --scenarios all sudo python3 src/ebpf_observer.py --duration 120 --scenarios cpu,mem # 3. 使用配置文件 sudo python3 src/ebpf_observer.py --config config.yaml --duration 60 # 4. 强制 /proc 模式(不加载 eBPF) sudo python3 src/ebpf_observer.py --duration 60 --scenarios all --no-ebpf # 5. v3.0 新功能 sudo python3 src/ebpf_observer.py --web --web-port 8080 sudo python3 src/ebpf_observer.py --daemon --daemon-interval 10
⚠️ openKylin 2.0 SP2 重要提示: 系统默认不提供 python3-bpfcc 包。工具会自动降级为 /proc 基础模式(CPU/内存/I/O 基本监控仍可用)。如需完整 eBPF 支持,可安装 bpftrace(sudo apt install bpftrace)运行 src/bpftrace/ 下的替代脚本,或从源码编译 BCC。
python3-bpfcc
bpftrace
sudo apt install bpftrace
src/bpftrace/
sudo python3 src/ebpf_observer.py --duration 60 --scenarios all --output report.json
流程: 采集 → 分析 → 输出报告 → 退出。适合问题排查、性能分析。
--config
-c
--duration
-d
--interval
-i
--scenarios
-s
--output
-o
--output-format
-f
--analyze-interval
-a
--no-ebpf
--daemon
--daemon-interval
--web
--web-port
# 前台运行 sudo python3 src/daemon.py --interval 10 --report-dir ./reports # 启用 SQLite 持久化 sudo python3 src/daemon.py --interval 30 --db metrics.db --report-dir ./reports # systemd 服务(部署后) sudo systemctl start ebpf-observer sudo systemctl status ebpf-observer
两级监控架构:
轻量级循环 (10s) 触发式深度分析 ┌──────────────────┐ 异常 ┌──────────────────┐ │ /proc 指标采集 │ ──────────────→ │ eBPF 全功能分析 │ │ Z-Score 基线检测 │ │ 30s 高精度采样 │ │ 阈值规则 │ │ 完整诊断报告 │ │ │ │ 知识库/LLM 增强 │ │ CPU < 0.5% │ │ 限频: 5min/次 │ │ MEM ~ 5MB │ │ │ └──────────────────┘ └──────────────────┘
Daemon 特性:
# 启动 Web 控制台 sudo python3 src/ebpf_observer.py --web --web-port 8080 # 或安装 fastapi + uvicorn 后 sudo python3 src/web/app.py --port 8080
打开浏览器访问 http://localhost:8080:
http://localhost:8080
┌──────────────────────────────────────────────────────┐ │ 🔍 eBPF Observer Dashboard ●运行中 14:30│ ├──────────────────────────────────────────────────────┤ │ ┌────────────┐ ┌────────────┐ ┌──────┐ ┌──────┐ │ │ │ 🖥 CPU 92% │ │ 💾 MEM 88% │ │💿 I/O│ │📊负载│ │ │ │ ████████░░ │ │ ███████░░ │ │ 35ms │ │ 4.5 │ │ │ │ User:80 Sys:12│ │ Avail:1.2G │ │R:100 │ │CS:600│ │ │ └────────────┘ └────────────┘ └──────┘ └──────┘ │ │ ┌──────────────────────────┐ ┌──────────────────┐ │ │ │ CPU 时序图 (Chart.js) │ │ MEM 时序图 │ │ │ │ ╱╲ ╱╲ │ │ ╱╲ │ │ │ │ ╱ ╲╱ ╲ │ │╱ ╲──────────── │ │ │ └──────────────────────────┘ └──────────────────┘ │ │ ⚠️ 异常事件 │ │ ▎CPU异常占用 14:25 线程竞争导致 CPU 饱和 │ │ ▎内存不足 14:10 可用内存跌破10% │ └──────────────────────────────────────────────────────┘
Web API 端点:
/
/api/metrics/current
/api/metrics/history?limit=60
/api/anomalies
/api/status
/ws
/docs
依赖: Web 模式需要 fastapi 和 uvicorn。 安装: pip3 install fastapi uvicorn --break-system-packages
fastapi
uvicorn
pip3 install fastapi uvicorn --break-system-packages
tracepoint:sched:sched_switch
kprobe:blk_mq_start_request
kprobe:blk_account_io_done
kprobe:handle_mm_fault
kprobe:oom_kill_process
kprobe:kswapd
kprobe:kmalloc
kprobe/kretprobe:mutex_lock
futex_wait
queued_spin_lock_slowpath
down_read/down_write
raw_tracepoint:sys_enter
raw_tracepoint:sys_exit
诊断引擎 DiagnosticEngine 不依赖单一判定方式,而是融合 4 种策略:
DiagnosticEngine
┌─────────────────────────────────────────────────────────┐ │ DiagnosticEngine │ │ │ │ ① 固定阈值 (THRESHOLDS) │ │ CPU > 90% | P99 IO > 50ms | Mem < 10% | ... │ │ │ │ ② 动态基线 + Z-Score │ │ 120 样本移动平均 ± 3σ → 偏离基线触发异常 │ │ 组合: 阈值 OR (Z-Score AND 阈值×0.75) │ │ │ │ ③ 趋势分析 (detect_trend) │ │ 线性回归 slope + R² → up/down/stable │ │ R² > 0.6 且持续下降 → 内存泄漏预警 │ │ │ │ ④ 多维关联评分矩阵 (_correlation_score) │ │ CPU: 4维 (线程竞争/计算密集/用户热点/内核热点) │ │ 内存: 3维 (内存压力/内存泄漏/OOM预警) │ └─────────────────────────────────────────────────────────┘
检测到异常后,KnowledgeBase 进行因果匹配:
KnowledgeBase
异常指标 ──→ match_knowledge(category, metrics) ──→ 匹配的因果链 │ ┌────────────┴────────────┐ │ CausalChain │ │ • root_cause: 根因描述 │ │ • reasoning: 推理过程 │ │ • evidence: 证据关联 │ │ • suggestions: 排查建议 │ │ • severity: 严重程度 │ └─────────────────────────┘
内置 5 类场景共 12 条因果推理链,覆盖线程竞争、内存泄漏、OOM、I/O 拥堵、自旋锁过大、系统调用瓶颈等典型问题。
DiagnosticResult ──→ LLMAnalyzer.analyze() │ ┌──────────────┴──────────────┐ │ 结构化提示词 │ │ • 系统信息 (内核/架构/CPU) │ │ • 异常类型 + 置信度 │ │ • 关键指标 (JSON) │ │ • 证据链 │ │ • 知识库匹配结果 │ └──────────────┬──────────────┘ │ ┌──────────────┴──────────────┐ │ LLM 后端 (config.yaml 配置) │ │ • ollama: 本地 (推荐) │ │ • openai: API 兼容 │ │ • none: 离线增强分析 │ └──────────────┬──────────────┘ │ ▼ LLMAnalysisResult • summary: 一句话概述 • root_cause_analysis: 详细根因 • impact_assessment: 影响评估 • recommendations: 具体建议 • risk_level: critical/high/medium/low
所有配置集中在 config.yaml:
config.yaml
# 异常检测阈值 thresholds: cpu_high: 90.0 # CPU 使用率异常线 (%) cs_high: 500 # 上下文切换高频线 (次/秒) io_p99_latency_ms: 50 # I/O P99 延迟异常线 (ms) mem_low_percent: 10.0 # 可用内存低水位 (%) lock_wait_ms: 30 # 锁平均等待异常线 (ms) syscall_slow_us: 10000 # 慢系统调用线 (μs) # 动态基线 baseline: window: 120 # 基线窗口(样本数) zscore_threshold: 3.0 # Z-Score 异常阈值 (σ) trend_window: 30 # 趋势检测窗口(样本数) # 观测参数 observation: duration: 60 # 默认时长 (秒) interval: 1.0 # 默认采样间隔 (秒) analyze_interval: 20 # 分析间隔 (秒) # LLM 增强分析 (可选) llm: enabled: false # 是否启用 backend: ollama # ollama | openai | none model: qwen2.5:7b # 模型名称 base_url: http://localhost:11434/v1 temperature: 0.1 max_tokens: 2048 # 持久化 (Daemon 模式) persistence: enabled: false db_path: ./metrics.db # SQLite 路径 prometheus_port: 0 # Prometheus 端口(0=禁用)
配置优先级:命令行参数 > config.yaml > 代码默认值。
{ "tool": "ebpf-observer", "version": "3.0.0", "observation_period": { "start": "2026-07-20T14:00:00", "end": "2026-07-20T14:01:00", "duration_seconds": 60 }, "system_info": { "cpu_cores": 4, "kernel_version": "6.6.0-22-generic", "hostname": "openkylin", "arch": "x86_64" }, "anomalies_detected": 1, "anomalies": [{ "anomaly_type": "CPU异常占用", "confidence": 0.92, "associated_objects": ["CPU 全体核心", "热点进程: PID 1234 (stress)"], "key_metrics": { "CPU 使用率": "92.5% (σ=3.2)", "上下文切换": "3200 次/秒", "关联模式": "thread_contention" }, "suspected_root_cause": "用户态多线程竞争导致 CPU 饱和", "evidence_chain": [{ "name": "CPU 使用率", "value": "92.5%", "threshold": ">90.0% (Z=3.1)", "abnormal": true }], "suggested_actions": [ "使用 perf top -p PID 查看热点函数", "使用 top -H -p PID 检查线程数量" ] }], "summary": { "status": "anomalies_found", "severity": "medium", "total_anomalies": 1 } }
--output-format json
--output-format yaml
--output-format markdown
--output-format html
# 运行全部 60 个单元测试 python3 -m pytest tests/ -v # 分类运行 python3 -m pytest tests/test_diagnostic_engine.py -v # 诊断引擎 (31 tests) python3 -m pytest tests/test_collector.py -v # 采集器 (14 tests) python3 -m pytest tests/test_formatter.py -v # 格式化器 (15 tests)
# 自动运行 5 场景 + 综合测试(约 10 分钟) sudo ./scripts/test_scenarios.sh # 或单个场景手动测试 # 终端 1: 启动压力 python3 scripts/stress/cpu_stress.py --cpu 4 --timeout 180 # 终端 2: 运行观测器 sudo python3 src/ebpf_observer.py --duration 60 --scenarios cpu --output cpu_result.json
sudo ./scripts/benchmark.sh # 输出 CPU/内存/时延开销报告到 benchmark_results/
apt install bpftrace
src/bpftrace/*.bt
scripts/stress/
BCC 可用? ──Yes──→ eBPF 全功能模式 (5 个 Monitor 全部加载) │ No │ ├──→ bpftrace 可用? ──Yes──→ src/bpftrace/*.bt 独立监控 │ └──→ /proc 基础模式 • CPU/内存/I/O 基本监控可用 ✅ • 锁和系统调用场景需 BCC ⚠️ • 诊断引擎 (阈值+Z-Score+趋势) 仍正常工作 ✅ • 知识库推理 + LLM 分析 仍正常工作 ✅
sudo apt install -y bpftrace sudo bpftrace src/bpftrace/cpu_monitor.bt # CPU 调度监控 sudo bpftrace src/bpftrace/io_monitor.bt # I/O 延迟直方图 sudo bpftrace src/bpftrace/mem_monitor.bt # 缺页统计 sudo bpftrace src/bpftrace/lock_monitor.bt # 锁等待分布 sudo bpftrace src/bpftrace/syscall_monitor.bt # 系统调用 Top 10
MIT License
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
eBPF 系统异常观测与根因定位工具
基于 eBPF 的轻量级系统异常实时观测、指标采集、事件关联分析和诊断结果输出工具。
目录
1. 核心功能
/proc用户态,BCC 不可用时自动降级./run.sh交互式菜单,覆盖部署/监控/测试/演示全流程2. 系统架构
数据流
3. 项目结构
4. 快速开始
4.1 最简单方式:一键启动
4.2 手动方式
4.3 系统要求
5. 三种运行模式
5.1 CLI 模式(一次性诊断)
流程: 采集 → 分析 → 输出报告 → 退出。适合问题排查、性能分析。
--config-c--duration-d--interval-i--scenarios-s--output-o--output-format-f--analyze-interval-a--no-ebpf--daemon--daemon-interval--web--web-port5.2 Daemon 模式(常驻轻量监控)
两级监控架构:
Daemon 特性:
5.3 Web 模式(可视化控制台)
打开浏览器访问
http://localhost:8080:Web API 端点:
//api/metrics/current/api/metrics/history?limit=60/api/anomalies/api/status/ws/docs6. 监控场景详解
6.1 CPU 异常占用
tracepoint:sched:sched_switch6.2 I/O 延迟抖动
kprobe:blk_mq_start_request+kprobe:blk_account_io_done6.3 内存抖动 / OOM 风险
kprobe:handle_mm_fault+kprobe:oom_kill_process+kprobe:kswapd+kprobe:kmalloc6.4 锁竞争
kprobe/kretprobe:mutex_lock+futex_wait+queued_spin_lock_slowpath+down_read/down_write6.5 系统调用热点
raw_tracepoint:sys_enter+raw_tracepoint:sys_exit7. 诊断引擎原理
7.1 多策略融合
诊断引擎
DiagnosticEngine不依赖单一判定方式,而是融合 4 种策略:7.2 因果推理增强 (v3.0)
检测到异常后,
KnowledgeBase进行因果匹配:内置 5 类场景共 12 条因果推理链,覆盖线程竞争、内存泄漏、OOM、I/O 拥堵、自旋锁过大、系统调用瓶颈等典型问题。
7.3 LLM 深度分析 (v3.0,可选)
8. 配置说明
所有配置集中在
config.yaml:配置优先级:命令行参数 > config.yaml > 代码默认值。
9. 输出格式
9.1 JSON(默认)
9.2 其他格式
--output-format json--output-format yaml--output-format markdown--output-format html10. 测试
10.1 单元测试
10.2 场景测试
10.3 性能基准
11. 环境兼容性
11.1 openKylin 2.0 SP2 特殊说明
/proc模式apt install bpftrace)src/bpftrace/*.bt替代脚本scripts/stress/)11.2 BCC 不可用时的降级策略
11.3 bpftrace 替代脚本
12. 限制与 Roadmap
当前限制
Roadmap
许可证
MIT License
参考