本项目是一个基于 C/C++ 和 eBPF 技术实现的 AI 驱动的自适应观测框架,专为资源受限的嵌入式或边缘设备设计。它旨在解决传统监控方法中“持续高精度观测”与“低系统开销”之间的核心矛盾。
框架的核心理念是 **“按需深入、无事不扰” (Drill Down on Demand, Stay Quiet Otherwise)**。在系统正常运行时,它以极低的开销进行基线监控;一旦后端的 AI 引擎检测到异常,它会智能地决策并动态加载相应的高精度 eBPF 诊断探针,对问题进行深度根因分析。诊断结束后,系统会自动恢复到低开销的基线模式。
此项目的一大特色是提供了两种可插拔的 AI 决策后端:
MASA (移动平均标准差异常检测) 后端: 一个轻量级、无需训练的统计学模型,适用于快速部署和常规异常检测。
AI-Driven Adaptive eBPF Observability Framework (AI驱动的自适应eBPF观测框架)
1. 项目简介
本项目是一个基于 C/C++ 和 eBPF 技术实现的 AI 驱动的自适应观测框架,专为资源受限的嵌入式或边缘设备设计。它旨在解决传统监控方法中“持续高精度观测”与“低系统开销”之间的核心矛盾。
框架的核心理念是 **“按需深入、无事不扰” (Drill Down on Demand, Stay Quiet Otherwise)**。在系统正常运行时,它以极低的开销进行基线监控;一旦后端的 AI 引擎检测到异常,它会智能地决策并动态加载相应的高精度 eBPF 诊断探针,对问题进行深度根因分析。诊断结束后,系统会自动恢复到低开销的基线模式。
此项目的一大特色是提供了两种可插拔的 AI 决策后端:
此项目完整地实现了从数据采集、异常检测、智能决策、动态执行到结果反馈的完整自适应闭环,为自动化系统诊断与优化提供了一个功能完备且高度可扩展的双引擎原型。
2. 核心特性
分层观测与丰富的探针库:
baseline探针,持续聚合系统级和进程级的核心指标(I/O计数、CPU时间、内存使用率)。双 AI 决策引擎:
自动化根因分析:
runqlat),实现“手术刀式”的精准追踪。pagefault探针,自动将高 I/O 延迟问题定位到具体的进程和文件名。locksensor探针,自动将高上下文切换或高调度延迟问题定位到具体的“热锁”地址、持有者和等待者。高稳定性与健壮性:
离线自治能力:
rules.json规则库独立完成“检测->诊断->恢复”的应急闭环,并将诊断数据安全缓存,待网络恢复后自动上报。3. 系统架构与探针库详解
本框架采用“云-端”协同架构,主要由设备端 Agent、eBPF 探针库和可替换的 AI 后端组成。
3.1 eBPF 探针库 (The Sensors)
所有探针均采用 BPF CO-RE 设计,以增强可移植性。
baseline-
io_time_ms: 系统总I/O时间。-
cpu_total/idle_jiffies: 系统总CPU时间与空闲时间。-
top_cpu_procs: CPU消耗最高的Top 5进程及其消耗时间。runqlat-
latency_us: 进程从就绪状态到真正运行在CPU上的等待时间。- 支持定向诊断,可只监控特定PID。
biolatency-
latency_us: 一个I/O请求从提交到完成的精确耗时。-
dev: 发生I/O的设备号。pagefault-
address: 发生缺页的虚拟内存地址。-
filename: Agent在用户态将地址解析出的文件名。locksensor-
lock_type:mutex(内核锁) 或futex(用户态锁)。-
lock_addr: 发生竞争的锁地址。-
waiter/owner: 等待者和持有者的进程信息。-
duration_ms: 本次锁竞争造成的等待时长。oomkill-
total_vm_pages,anon_rss_pages等: 被杀死进程在最后一刻的详细内存占用情况。tcpconnlat3.2 根因分析模块详解
3.2.1 Pagefault: 文件 I/O 瓶颈定位
当AI检测到高I/O等待时,会自动部署
pagefault探针。该模块通过“内核捕获+用户态解析”的两阶段工作流,将模糊的“I/O高”症状,精确到“cat进程正在大量读取large_test_file文件”的具体根因,为应用启动慢、数据加载慢等问题提供直接证据。3.2.2 Locksensor: 锁竞争分析
当AI检测到高CPU负载但又无明确的用户态元凶时(通常表现为高上下文切换或高
swapper活跃度),会推断可能存在锁竞争并部署locksensor探针。该模块的后端分析器会对捕获到的海量锁竞争事件进行实时聚合,每秒生成一份“热锁”报告,量化由锁竞争造成的性能损耗,并定位到具体的锁地址、持有者和等待者,揭示系统内部最隐蔽的性能瓶颈。4. 环境准备
clang,llvm(>= 14)libbpf-dev,libelf-dev,linux-tools-generic,bpftool,stress,stress-ngpython3,pip,venv5. 编译项目
6. 运行实验
6.1 启动后端与Agent
make run-backend-masamake run-backend-lstm(需先按README.lstm.md指引训练模型)make run-agentWarm-up complete.日志 (约1分钟)。6.2 执行诊断场景
(在AI预热完成后,于新终端中执行)
场景一:CPU瓶颈与定向诊断
stress --cpu 2 --timeout 60sstress为元凶,并下发对stress进程的定向诊断指令,加载runqlat探针。后端只会收到来自stress进程的调度延迟数据。场景二:文件I/O瓶颈根因分析
dd if=/dev/zero of=./large_test_file bs=1M count=1024sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'cat ./large_test_file > /dev/nullpagefault探针。后端将收到大量诊断事件,其中filename字段清晰地指向./large_test_file,成功定位根因。场景三:锁竞争根因分析
gcc scripts/contention.c -o contention -lpthread./contentionswapper活跃度,推断存在锁竞争,决策加载locksensor探针。后端将每秒打印一份“热锁”报告,清晰地展示竞争最激烈的锁地址、等待者、持有者和总等待时间。场景四:内存压力预警
stress-ng --vm 1 --vm-bytes 10G --timeout 30soomkill探针。如果系统发生OOM Kill,探针将捕获并上报被杀死的进程及其内存信息。场景五:离线自治能力
Ctrl+C停止AI后端。OFFLINE mode。./contention或stress。rules.json独立加载locksensor或runqlat探针,并将诊断数据安全缓存。7. 停止程序
Ctrl+C。Ctrl+C。8. 未来展望