docs: add demonstration ppt and video
ebpf-sysdiag 是一个基于 libbpf CO-RE 的 Linux 系统异常观测与根因定位工具。它在短时间诊断窗口内按需加载 eBPF 程序,采集 CPU、I/O、内存、锁竞争和系统调用等异常证据,并输出 JSON、YAML 或 Markdown 报告。
ebpf-sysdiag
项目定位是“按需运行的诊断工具”,不是常驻 APM agent,也不是 metrics exporter。它更适合在故障窗口、压测窗口或赛题复现窗口中保留可复核证据,帮助开发者和系统工程师判断问题方向。
本 README 面向第一次接触项目的开发者。赛题评审可先阅读 赛题报告 和 评分映射,更深入的专题文档见 docs/README.md。
bpf/cpu_sched.bpf.c
src/analysis/detectors/cpu_detector.c
bpf/block_io.bpf.c
src/analysis/detectors/io_detector.c
bpf/memory.bpf.c
src/analysis/detectors/memory_detector.c
bpf/lock_futex.bpf.c
src/analysis/detectors/lock_detector.c
bpf/syscall.bpf.c
src/analysis/detectors/syscall_detector.c
诊断结果包含:
type
cpu_intensive_compute
block_io_latency
memory_oom_risk
target
window
confidence
confirmed
highly_suspected
possible
need_investigation
summary
root_cause
evidence
suggestions
输出文本中仅 root_cause 使用中文;summary、suggestions 和 evidence 文本使用英文,Linux 专业术语和 target 中的原始标识保持原样。输出规则的完整说明见 docs/output_contract.md。
默认构建使用 CO-RE,目标机器需要:
/sys/kernel/btf/vmlinux
建议先运行:
tools/check_btf.sh tools/detect_kernel_features.sh make check-env
tools/check_btf.sh 会执行 bpftool feature probe kernel。如果普通用户权限不足,脚本会提示以 root 运行;这时可以使用 sudo tools/check_btf.sh 复核 BPF feature probe。
tools/check_btf.sh
bpftool feature probe kernel
sudo tools/check_btf.sh
如果没有 BTF,可以尝试 NO_CORE=1 降级构建:
NO_CORE=1
make clean make NO_CORE=1
NO_CORE=1 依赖当前内核 tracepoint format 布局,只适合作为有限功能验证路径。正式使用仍建议优先使用 CO-RE。
构建和运行主程序需要:
clang
llvm
make
gcc
pkg-config
bpftool
libbpf
libelf
zlib
python3
openKylin、Ubuntu、Debian 类系统可以使用项目脚本安装基础构建依赖:
scripts/install_deps_openkylin.sh
该脚本当前安装:
clang llvm make gcc pkg-config bpftool libbpf-dev libelf-dev zlib1g-dev linux-tools-common
测试和评测脚本还可能使用 fio、stress-ng、pidstat 等系统工具。它们不在 scripts/install_deps_openkylin.sh 的安装列表中,需要按目标发行版单独安装。
fio
stress-ng
pidstat
加载 BPF 程序通常需要 root,或具备内核和发行版允许的 CAP_BPF、CAP_PERFMON、CAP_SYS_ADMIN 等能力组合。最直接的运行方式是:
CAP_BPF
CAP_PERFMON
CAP_SYS_ADMIN
sudo build/ebpf-sysdiag --scenario all --duration 60 --output json
ebpf-sysdiag/ ├── bpf/ # eBPF 程序和 BPF 侧公共头文件 │ ├── cpu_sched.bpf.c # CPU 调度和 runtime 采集 │ ├── block_io.bpf.c # block I/O 和文件 I/O 采集 │ ├── memory.bpf.c # 缺页、分配、回收和 OOM 采集 │ ├── lock_futex.bpf.c # futex wait 采集 │ ├── syscall.bpf.c # syscall latency 和 rate 采集 │ └── vmlinux/ # `vmlinux.h` 生成位置 ├── include/ # 用户态公共结构、配置和接口头文件 ├── src/ │ ├── main.c # CLI 入口和运行主循环 │ ├── config.c # 参数和扁平配置文件解析 │ ├── loader.c # libbpf skeleton 加载、attach、ringbuf 注册 │ ├── event_parser.c # ringbuf 原始事件解析 │ ├── analysis/ # 窗口聚合、证据、置信度和 detector │ ├── output/ # JSON、YAML、Markdown 输出 │ └── platform/ # 架构和内核特性辅助代码 ├── config/ # 默认和单场景配置示例 ├── tests/ │ ├── reproduce/ # 压力和异常复现脚本 │ ├── integration/ # 单场景集成测试脚本 │ ├── e2e/ # 16 场景矩阵、负例基线和驱动回归 │ └── unit/ # detector 边界条件单元回归 ├── scripts/ # 环境采集、依赖安装、开销测量、评测报告 ├── tools/ # BTF、bpftool、skeleton 和打包辅助脚本 ├── docs/ # 架构、规则、输出契约、性能、盲区等专题文档 ├── Makefile # 推荐构建入口,包含 BPF skeleton 生成 ├── CMakeLists.txt # 用户态二进制辅助构建入口,需已有 skeleton 头 ├── DESIGN.md # 设计目标和模块分层概览 └── TEST.md # 测试计划和复现指南
make check-env make
构建产物:
build/ebpf-sysdiag build/*.skel.h bpf/vmlinux/vmlinux.h
Makefile 会通过 tools/resolve_bpftool.sh 查找可用的 bpftool。如果自动发现失败,可以显式指定:
Makefile
tools/resolve_bpftool.sh
BPFTOOL=/path/to/bpftool make
清理构建产物:
make clean
注意:make clean 会删除 build/ 和生成的 bpf/vmlinux/vmlinux.h。
build/
bpf/vmlinux/vmlinux.h
仓库包含 CMakeLists.txt,但它只在 skeleton 头文件已经存在时构建用户态二进制。完整 BPF 构建仍应优先使用:
CMakeLists.txt
如果希望用固定路径运行测试二进制,可以手动安装构建产物:
sudo install -m 755 build/ebpf-sysdiag /usr/local/sbin/ebpf-sysdiag-test
安装后应确认测试路径与当前构建完全一致,避免误测旧二进制:
sha256sum build/ebpf-sysdiag /usr/local/sbin/ebpf-sysdiag-test
之后测试脚本可以设置:
BIN=/usr/local/sbin/ebpf-sysdiag-test SUDO_CMD="sudo -n"
build/ebpf-sysdiag --list-scenarios
当前输出为:
cpu io memory lock syscall
build/ebpf-sysdiag --dry-run --config config/default.yaml
当前默认配置的 dry-run 输出形如:
dry-run ok: scenarios=0x1f duration=60 output=0 sample_interval_ms=100
sudo build/ebpf-sysdiag --scenario cpu --duration 30 --output markdown sudo build/ebpf-sysdiag --scenario io --duration 30 --output json sudo build/ebpf-sysdiag --scenario memory --duration 30 --output json sudo build/ebpf-sysdiag --scenario lock --duration 30 --output yaml sudo build/ebpf-sysdiag --scenario syscall --duration 30 --output json
sudo build/ebpf-sysdiag --scenario cpu,syscall,lock --duration 60 --output json sudo build/ebpf-sysdiag --scenario syscall --pid 1234 --duration 20 sudo build/ebpf-sysdiag --scenario lock --comm nginx --duration 20
--comm 使用 Linux task comm,长度受 TASK_COMM_LEN 限制;项目内按 16 字节处理。
--comm
TASK_COMM_LEN
16
sudo build/ebpf-sysdiag \ --scenario all \ --duration 60 \ --output json \ --output-file report.json
build/ebpf-sysdiag --help 当前输出的参数为:
build/ebpf-sysdiag --help
--scenario LIST
cpu,io,memory,lock,syscall,all
all
--duration SEC
60
--config PATH
key: value
--output FORMAT
json
yaml
markdown
--output-file PATH
--pid PID
--comm NAME
--sample-rate N
1
--sample-interval-ms N
100
--max-rss-mb N
200
--max-cpu-percent N
5
--dry-run
--list-scenarios
-h
--help
命令行参数会覆盖配置文件中的同名设置。
配置文件是简单的扁平 key: value 格式,不是完整 YAML 解析器。支持注释和空行。当前解析器会忽略未知配置键,非法场景会回退到 all,未知输出格式会回退到 JSON;修改配置后应先运行 --dry-run。默认配置见 config/default.yaml。
常用配置示例:
duration_sec: 60 scenario: all output: json sample_interval_ms: 100 sample_rate: 1 max_rss_mb: 200 max_cpu_percent: 5 cpu_runq_delay_threshold_us: 5000 io_block_latency_us_p99: 500 memory_page_fault_rate: 1000 memory_rss_bytes: 402653184 lock_futex_wait_us_p99: 10000 syscall_latency_us_p99: 5000
当前解析器支持的配置键:
duration_sec
scenario
output
pid
comm
sample_interval_ms
sample_rate
max_rss_mb
max_cpu_percent
cpu_runq_delay_threshold_us
cpu_runq_delay_us_p99
cpu_context_switch_rate
cpu_usage_percent
cpu_min_runtime_us
cpu_busy_loop_min_runtime_us
cpu_thread_contention_switch_rate
cpu_thread_contention_threads
io_block_latency_us_p99
io_min_count
io_queue_depth_threshold
io_device_util_percent
io_random_ratio_percent
io_small_io_ratio_percent
io_small_request_bytes
io_severe_latency_us
io_hot_file_ratio_percent
io_hot_file_min_ops
io_cache_churn_min_events
memory_page_fault_rate
memory_alloc_rate
memory_alloc_bytes
memory_rss_bytes
memory_reclaim_events
memory_available_percent
lock_futex_wait_us_p99
lock_min_wait_count
syscall_latency_us_p99
syscall_rate
syscall_rate_per_sec
单场景配置示例位于 config/cpu.yaml、config/io.yaml、config/memory.yaml、config/lock.yaml 和 config/syscall.yaml。
config/cpu.yaml
config/io.yaml
config/memory.yaml
config/lock.yaml
config/syscall.yaml
flowchart LR CLI["命令行与配置\nsrc/main.c + src/config.c"] --> Loader["BPF 加载器\nsrc/loader.c"] Loader --> Collectors["BPF 采集器\nbpf/*.bpf.c"] Collectors --> Ringbuf["BPF 环形缓冲区\nevents_rb"] Ringbuf --> Parser["事件解析器\nsrc/event_parser.c"] Parser --> Engine["窗口分析引擎\nsrc/analysis/engine.c"] Engine --> Detectors["诊断插件\nsrc/analysis/detectors/*.c"] Detectors --> Output["报告输出\nsrc/output/*.c"]
sequenceDiagram participant User as 用户 participant CLI as 命令行与配置 participant Loader as libbpf 加载器 participant BPF as BPF 程序 participant Engine as 分析引擎 participant Output as 输出层 User->>CLI: 执行 build/ebpf-sysdiag --scenario ... CLI->>CLI: 解析命令行和 config/default.yaml CLI->>Loader: 下发场景、过滤条件和阈值 Loader->>BPF: 打开、加载并挂载所选 skeleton Loader->>BPF: 更新 config_map BPF-->>Engine: 提交经过过滤、采样和阈值判断的 ringbuf 事件 Engine->>Engine: 聚合窗口指标 Engine->>Engine: 执行诊断规则 Engine->>Output: diag_result[] Output-->>User: 输出 JSON / YAML / Markdown
运行时的关键取舍:
--scenario
更详细的架构说明见 docs/architecture.md、docs/bpf_maps.md 和 DESIGN.md。
测试前建议先完成:
make check-env make make unit-test build/ebpf-sysdiag --dry-run --config config/default.yaml build/ebpf-sysdiag --list-scenarios
make unit-test 当前运行内存 4 例、锁竞争 6 例和系统调用 7 例,共 17 个 detector 边界用例。
make unit-test
不需要 BPF 权限的测试驱动回归:
bash tests/e2e/test_run_full_matrix_harness.sh bash tests/e2e/test_negative_harness.sh
tests/reproduce/cpu_runqueue_delay.sh
sudo build/ebpf-sysdiag --scenario cpu --duration 20 --output json
cpu_thread_contention
cpu_busy_loop
cpu_sched_latency
tests/reproduce/io_latency_fio.sh
sudo build/ebpf-sysdiag --scenario io --duration 20 --output json
file_io_hotspot
page_cache_churn
tests/reproduce/memory_pressure.sh
sudo build/ebpf-sysdiag --scenario memory --duration 20 --output json
memory_high_usage_pressure
memory_anon_growth
tests/reproduce/lock_contention.sh
sudo build/ebpf-sysdiag --scenario lock --duration 20 --output json
lock_hot_lock
lock_large_critical
lock_coarse_grained
tests/reproduce/syscall_storm.sh
sudo build/ebpf-sysdiag --scenario syscall --duration 20 --output json
syscall_slow_read
syscall_error_retry
tests/integration/test_cpu_sched.sh tests/integration/test_block_io.sh tests/integration/test_memory.sh tests/integration/test_lock.sh tests/integration/test_syscall.sh
完整矩阵覆盖 16 个子场景,断言配置见 tests/e2e/expected_matrix.yaml。
sudo -v LOAD_DUR=30 DIAG_DUR=20 BUILD=0 ASSERT=1 \ BIN=./build/ebpf-sysdiag tests/e2e/run_full_matrix.sh
脚本必须最终输出 MATRIX_ASSERT_OK cases=16,且每个 case 同时满足 diag_rc=0 load_rc=0。正式稳定性结论要求同一提交在每台目标机连续通过 3 轮完整矩阵,并额外通过负例基线。
MATRIX_ASSERT_OK cases=16
diag_rc=0 load_rc=0
提交 7dffba6 的当前规则验证、原始矩阵 JSON 和负例 JSON 见 功能验证证据。证据按提交号归档;历史版本的三轮结果不能代替修改 detector 后的当前版本验证。
7dffba6
负例基线默认使用不存在的 comm 过滤,检查误报控制:
sudo -v BUILD=0 BIN=./build/ebpf-sysdiag tests/e2e/run_negative_baseline.sh
下面这些 Makefile 测试目标默认使用 SUDO_CMD=sudo -n。运行它们前需要 root、免密 sudo,或按需设置 TEST_BIN、SUDO_CMD 等变量。
SUDO_CMD=sudo -n
TEST_BIN
SUDO_CMD
make smoke-test make e2e-test make negative-test make overhead-test make eval-report
也可以直接运行脚本:
scripts/run_evaluation_suite.sh MODE=idle scripts/measure_overhead.sh MODE=io REPEAT=7 DURATION=65 DIAG_DUR=60 WARMUP=5 scripts/measure_overhead.sh
clean 提交 9d24fa5 的双机 7 轮测量结果:
9d24fa5
-0.12%
+1.18%
-3.88%
+4.52%
性能结果只对应该受测提交和 I/O 模式,并受机器、内核、设备、后台负载和 fio 参数影响。逐轮绝对 IOPS/P99、ratio 范围、环境和原始 JSON 见 正式性能证据;方法和解释边界见 docs/performance.md 与 TEST.md。
现象可能是:
missing /sys/kernel/btf/vmlinux
处理方式:
make NO_CORE=1
某些系统里的 /usr/sbin/bpftool 可能是包装器,并不一定能匹配当前内核。项目默认会调用 tools/resolve_bpftool.sh 查找可用二进制。
/usr/sbin/bpftool
可以手工指定:
BPFTOOL=/path/to/real/bpftool make
加载 BPF 程序通常需要 root 或合适的 capability。优先使用:
results
空结果不一定表示失败。它可能表示:
--pid
可先尝试拉长 --duration,去掉过滤条件,或单独运行目标场景。
--duration
在 syscall 场景下,工具自身的 poll、等待或文件写入也可能被观测到。排查业务进程时建议加 --pid 或 --comm 过滤。
perf
trace-cmd
strace
更多边界和交叉验证建议见 docs/blind_spots.md 和 docs/diagnosis_rules.md。
优先级建议:
项目使用 LICENSE 中声明的许可证。BPF 程序声明为 Dual BSD/GPL,以满足内核 helper 和加载要求。
Dual BSD/GPL
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
ebpf-sysdiag
ebpf-sysdiag是一个基于 libbpf CO-RE 的 Linux 系统异常观测与根因定位工具。它在短时间诊断窗口内按需加载 eBPF 程序,采集 CPU、I/O、内存、锁竞争和系统调用等异常证据,并输出 JSON、YAML 或 Markdown 报告。项目定位是“按需运行的诊断工具”,不是常驻 APM agent,也不是 metrics exporter。它更适合在故障窗口、压测窗口或赛题复现窗口中保留可复核证据,帮助开发者和系统工程师判断问题方向。
本 README 面向第一次接触项目的开发者。赛题评审可先阅读 赛题报告 和 评分映射,更深入的专题文档见 docs/README.md。
核心功能
bpf/cpu_sched.bpf.c、src/analysis/detectors/cpu_detector.cbpf/block_io.bpf.c、src/analysis/detectors/io_detector.cbpf/memory.bpf.c、src/analysis/detectors/memory_detector.cbpf/lock_futex.bpf.c、src/analysis/detectors/lock_detector.cbpf/syscall.bpf.c、src/analysis/detectors/syscall_detector.c诊断结果包含:
type:诊断类型,例如cpu_intensive_compute、block_io_latency、memory_oom_risktarget:关联对象,例如 PID/comm、设备、文件、futex 地址或 syscall idwindow:诊断窗口开始和结束时间confidence:confirmed、highly_suspected、possible、need_investigationsummary、root_cause、evidence、suggestions:人读摘要、疑似根因、证据链和后续建议输出文本中仅
root_cause使用中文;summary、suggestions和 evidence 文本使用英文,Linux 专业术语和target中的原始标识保持原样。输出规则的完整说明见 docs/output_contract.md。环境与依赖
内核要求
默认构建使用 CO-RE,目标机器需要:
/sys/kernel/btf/vmlinux可读建议先运行:
tools/check_btf.sh会执行bpftool feature probe kernel。如果普通用户权限不足,脚本会提示以 root 运行;这时可以使用sudo tools/check_btf.sh复核 BPF feature probe。如果没有 BTF,可以尝试
NO_CORE=1降级构建:NO_CORE=1依赖当前内核 tracepoint format 布局,只适合作为有限功能验证路径。正式使用仍建议优先使用 CO-RE。用户态依赖
构建和运行主程序需要:
clang/llvmmake、gcc或兼容 C 编译器pkg-configbpftoollibbpf开发包libelf、zlib开发包python3openKylin、Ubuntu、Debian 类系统可以使用项目脚本安装基础构建依赖:
该脚本当前安装:
测试和评测脚本还可能使用
fio、stress-ng、pidstat等系统工具。它们不在scripts/install_deps_openkylin.sh的安装列表中,需要按目标发行版单独安装。权限要求
加载 BPF 程序通常需要 root,或具备内核和发行版允许的
CAP_BPF、CAP_PERFMON、CAP_SYS_ADMIN等能力组合。最直接的运行方式是:项目目录结构
编译和安装
推荐构建方式
构建产物:
Makefile会通过tools/resolve_bpftool.sh查找可用的bpftool。如果自动发现失败,可以显式指定:清理构建产物:
注意:
make clean会删除build/和生成的bpf/vmlinux/vmlinux.h。CMake 入口的用途
仓库包含
CMakeLists.txt,但它只在 skeleton 头文件已经存在时构建用户态二进制。完整 BPF 构建仍应优先使用:可选安装
如果希望用固定路径运行测试二进制,可以手动安装构建产物:
安装后应确认测试路径与当前构建完全一致,避免误测旧二进制:
之后测试脚本可以设置:
快速运行示例
查看支持的场景
当前输出为:
检查配置解析
当前默认配置的 dry-run 输出形如:
采集全部场景
采集单个场景
组合场景和过滤
--comm使用 Linux task comm,长度受TASK_COMM_LEN限制;项目内按16字节处理。写入报告文件
CLI 参数
build/ebpf-sysdiag --help当前输出的参数为:--scenario LISTcpu,io,memory,lock,syscall,all,支持逗号分隔all--duration SEC60--config PATHkey: value配置文件--output FORMATjson、yaml、markdownjson--output-file PATH--pid PID--comm NAME--sample-rate N1--sample-interval-ms N100--max-rss-mb N200--max-cpu-percent N5--dry-run--list-scenarios-h、--help命令行参数会覆盖配置文件中的同名设置。
配置文件
配置文件是简单的扁平
key: value格式,不是完整 YAML 解析器。支持注释和空行。当前解析器会忽略未知配置键,非法场景会回退到all,未知输出格式会回退到 JSON;修改配置后应先运行--dry-run。默认配置见 config/default.yaml。常用配置示例:
当前解析器支持的配置键:
duration_secscenariooutputpidcommsample_interval_mssample_ratemax_rss_mbmax_cpu_percentcpu_runq_delay_threshold_uscpu_runq_delay_us_p99cpu_context_switch_ratecpu_usage_percentcpu_min_runtime_uscpu_busy_loop_min_runtime_uscpu_thread_contention_switch_ratecpu_thread_contention_threadsio_block_latency_us_p99io_min_countio_queue_depth_thresholdio_device_util_percentio_random_ratio_percentio_small_io_ratio_percentio_small_request_bytesio_severe_latency_usio_hot_file_ratio_percentio_hot_file_min_opsio_cache_churn_min_eventsmemory_page_fault_ratememory_alloc_ratememory_alloc_bytesmemory_rss_bytesmemory_reclaim_eventsmemory_available_percentlock_futex_wait_us_p99lock_min_wait_countsyscall_latency_us_p99syscall_ratesyscall_rate_per_sec单场景配置示例位于
config/cpu.yaml、config/io.yaml、config/memory.yaml、config/lock.yaml和config/syscall.yaml。核心架构与执行流程
模块架构
flowchart LR CLI["命令行与配置\nsrc/main.c + src/config.c"] --> Loader["BPF 加载器\nsrc/loader.c"] Loader --> Collectors["BPF 采集器\nbpf/*.bpf.c"] Collectors --> Ringbuf["BPF 环形缓冲区\nevents_rb"] Ringbuf --> Parser["事件解析器\nsrc/event_parser.c"] Parser --> Engine["窗口分析引擎\nsrc/analysis/engine.c"] Engine --> Detectors["诊断插件\nsrc/analysis/detectors/*.c"] Detectors --> Output["报告输出\nsrc/output/*.c"]执行流程
sequenceDiagram participant User as 用户 participant CLI as 命令行与配置 participant Loader as libbpf 加载器 participant BPF as BPF 程序 participant Engine as 分析引擎 participant Output as 输出层 User->>CLI: 执行 build/ebpf-sysdiag --scenario ... CLI->>CLI: 解析命令行和 config/default.yaml CLI->>Loader: 下发场景、过滤条件和阈值 Loader->>BPF: 打开、加载并挂载所选 skeleton Loader->>BPF: 更新 config_map BPF-->>Engine: 提交经过过滤、采样和阈值判断的 ringbuf 事件 Engine->>Engine: 聚合窗口指标 Engine->>Engine: 执行诊断规则 Engine->>Output: diag_result[] Output-->>User: 输出 JSON / YAML / Markdown运行时的关键取舍:
--scenario只加载需要的探针。更详细的架构说明见 docs/architecture.md、docs/bpf_maps.md 和 DESIGN.md。
测试方法
测试前建议先完成:
make unit-test当前运行内存 4 例、锁竞争 6 例和系统调用 7 例,共 17 个 detector 边界用例。不需要 BPF 权限的测试驱动回归:
单场景复现
tests/reproduce/cpu_runqueue_delay.shsudo build/ebpf-sysdiag --scenario cpu --duration 20 --output jsoncpu_intensive_compute、cpu_thread_contention、cpu_busy_loop、cpu_sched_latencytests/reproduce/io_latency_fio.shsudo build/ebpf-sysdiag --scenario io --duration 20 --output jsonblock_io_latency、file_io_hotspot、page_cache_churntests/reproduce/memory_pressure.shsudo build/ebpf-sysdiag --scenario memory --duration 20 --output jsonmemory_oom_risk、memory_high_usage_pressure、memory_anon_growth等tests/reproduce/lock_contention.shsudo build/ebpf-sysdiag --scenario lock --duration 20 --output jsonlock_hot_lock、lock_large_critical、lock_coarse_grainedtests/reproduce/syscall_storm.shsudo build/ebpf-sysdiag --scenario syscall --duration 20 --output jsonsyscall_rate、syscall_slow_read、syscall_error_retry集成测试
端到端矩阵和负例基线
完整矩阵覆盖 16 个子场景,断言配置见 tests/e2e/expected_matrix.yaml。
脚本必须最终输出
MATRIX_ASSERT_OK cases=16,且每个 case 同时满足diag_rc=0 load_rc=0。正式稳定性结论要求同一提交在每台目标机连续通过 3 轮完整矩阵,并额外通过负例基线。提交
7dffba6的当前规则验证、原始矩阵 JSON 和负例 JSON 见 功能验证证据。证据按提交号归档;历史版本的三轮结果不能代替修改 detector 后的当前版本验证。负例基线默认使用不存在的
comm过滤,检查误报控制:评测报告和性能开销
下面这些 Makefile 测试目标默认使用
SUDO_CMD=sudo -n。运行它们前需要 root、免密 sudo,或按需设置TEST_BIN、SUDO_CMD等变量。也可以直接运行脚本:
clean 提交
9d24fa5的双机 7 轮测量结果:-0.12%+1.18%-3.88%+4.52%性能结果只对应该受测提交和 I/O 模式,并受机器、内核、设备、后台负载和 fio 参数影响。逐轮绝对 IOPS/P99、ratio 范围、环境和原始 JSON 见 正式性能证据;方法和解释边界见 docs/performance.md 与 TEST.md。
常见问题
找不到
/sys/kernel/btf/vmlinux现象可能是:
处理方式:
/sys/kernel/btf/vmlinux可读。make NO_CORE=1。bpftool存在但不可用某些系统里的
/usr/sbin/bpftool可能是包装器,并不一定能匹配当前内核。项目默认会调用tools/resolve_bpftool.sh查找可用二进制。可以手工指定:
运行时提示需要 root 或 capability
加载 BPF 程序通常需要 root 或合适的 capability。优先使用:
results是空数组空结果不一定表示失败。它可能表示:
--pid或--comm过滤条件过窄可先尝试拉长
--duration,去掉过滤条件,或单独运行目标场景。结果指向
ebpf-sysdiag自己在 syscall 场景下,工具自身的 poll、等待或文件写入也可能被观测到。排查业务进程时建议加
--pid或--comm过滤。已知限制
perf、trace-cmd、strace等工具复核。NO_CORE=1依赖 tracepoint format,不保证跨内核稳定。更多边界和交叉验证建议见 docs/blind_spots.md 和 docs/diagnosis_rules.md。
后续开发计划
优先级建议:
文档导航
License
项目使用 LICENSE 中声明的许可证。BPF 程序声明为
Dual BSD/GPL,以满足内核 helper 和加载要求。