面向细粒度进程访存指标提取与归因分析的 eBPF 实验平台
论文:基于 eBPF 的细粒度进程访存性能指标提取与分析方法研究
本仓库是论文的主线实验仓库,承担以下核心任务:
| 能力 | 说明 |
|---|---|
| eBPF 数据面 | CO-RE 风格内核程序 + BCC Python 原型,追踪 LLC / TLB / page fault,并可选导出 LBR |
| 细粒度指标提取 | 按 PID 或 TID 和时间窗聚合,输出标准化 JSONL |
| 函数级热点归因 | 符号化采样地址 → 函数 / 文件 / 行号(P2 阶段) |
| 分析报告生成 | 时序图、热点条形图、指标相关性热力图(matplotlib PDF) |
| 测量方法学验证 | 采集开销 / 重复稳定性 / 参数敏感性 / 微基准校验实验 |
| 基线对接 | export/to_baseline.py 将窗口指标转换为 ebpf-mem-analyzer 可消费的 CSV |
与 ebpf-mem-analyzer 的关系:两者通过 window_metrics.jsonl 和 CSV 转换脚本弱连接,不共享代码,互不破坏各自的实验结论。
ebpf-mem-profiler/
├── bpf/
│ ├── mem_events.bpf.c # CO-RE eBPF 内核程序(libbpf / Makefile)
│ └── mem_events.h # 内核 ↔ 用户态共享类型
├── src/
│ ├── bcc_prog.c # BCC 兼容版 eBPF 程序(Python 原型加载)
│ ├── loader.py # CLI 入口:采集 session 管理
│ ├── collector.py # BCC 加载、map 读取、差分计算
│ ├── filter.py # /proc 扫描:comm → PID 解析
│ └── exporter.py # 写入 run_metadata.jsonl / window_metrics.jsonl
├── analysis/
│ ├── symbolize.py # /proc/maps + addr2line 符号化
│ ├── hotspot.py # 热点识别、时序 CSV(P1)
│ ├── attribution.py # 函数级归因(P2,需 --emit-events)
│ └── report.py # matplotlib 图表生成
├── export/
│ └── to_baseline.py # 格式转换适配器
├── scripts/
│ ├── freeze_curated_manifest.py # 冻结 145x4 curated run list
│ ├── audit_train_set_quality.py # 生成当前数据质量审计与问题样本清单
│ ├── build_run_features.py # 原始窗口 → 运行级特征
│ ├── build_pair_table.py # 运行级特征 → pair 数据
│ └── build_anchor_set.py # pair 结果 → 锚点集
├── experiments/
│ ├── llvm_test_suite/ # llvm-test-suite 提取与 PMU 采集脚本
│ ├── overhead/ # P3:采集开销测试
│ ├── stability/ # P3:重复运行稳定性测试
│ ├── sensitivity/ # P3:参数敏感性测试
│ └── micro_benchmark/ # P3:微基准校验
├── third_party/
│ └── llvm-test-suite/ # llvm-test-suite submodule
├── data/ # 原始采集数据(gitignore)
├── results/ # 分析结果与图表(gitignore)
├── docs/
│ └── design.md # 系统设计文档
├── Makefile # 编译 CO-RE eBPF 程序
└── requirements.txt # Python 依赖
当前仓库里和 llvm-test-suite 相关的数据,需要明确区分 raw 采集层和训练快照层。
- 最新 raw manifests 位于
data/llvm_test_suite/manifest_bcc_O0~O3.jsonl,curated manifests 位于data/llvm_test_suite/manifest_curated_O0~O3.jsonl。 - 当前 raw 与 curated 两层都已经收敛为严格的
145 x 4:四个 variant 各 145 条记录,shared_program_count=145。 - 当前
train_set不是“另一轮更早的冻结快照”,而是从这轮 curated manifests 继续经过下游过滤得到的训练子集:580 curated runs -> 509 run_features -> 1494 pairs -> 374 anchors。 - 如果要从最新 raw data 重建运行级特征,应优先使用 curated manifests,而不是直接顺序扫描 raw manifests。
- 当前完整的问题样本清单、缺失变体程序和 O2/O3 难例分流建议,统一由
python scripts/audit_train_set_quality.py生成,产物为train_set/data_quality_audit.json与 docs/new-repo-plan/current-data-quality-audit.md。
# Ubuntu 22.04 / 24.04
sudo apt install \
clang llvm libbpf-dev bpftool \
linux-headers-$(uname -r) \
python3-bcc \
binutils # addr2line / nm内核版本要求:Linux >= 5.8(BPF ring buffer)
pip install -r requirements.txtmake
# 产出:bpf/mem_events.bpf.o bpf/mem_events.skel.h# 需要 root 权限或 CAP_BPF + CAP_PERFMON
sudo python src/loader.py --pid <PID> --window 1.0 --output data/run_001/
# 按进程名(自动解析 PID)
sudo python src/loader.py --comm nginx --window 1.0 --output data/run_001/ --duration 60
# 按线程聚合并只观察指定 TID
sudo python src/loader.py --pid <PID> --per-tid --tid <TID> --output data/run_tid/
# 启用逐事件与 LBR 分支栈记录(P2 归因分析所需)
sudo python src/loader.py --pid <PID> --emit-events --lbr --output data/run_001/python analysis/hotspot.py \
--data data/run_001/ \
--output results/run_001/ \
--metric llc_load_misses \
--top 20适用于 data/llvm_test_suite/bcc/O3-g 这类目录下包含多个 aha_* 运行子目录的数据集。
python analysis/dataset_hotspot.py \
--data-root data/llvm_test_suite/bcc/O3-g \
--output results/llvm_test_suite/aha_O3-g_hotspots \
--metric llc_load_misses \
--top 20默认输出:
run_hotspot_summary.csv/jsonl:每个 run 的热点窗口数量、最大热点分数、指标总量dataset_hotspots_<metric>.csv/jsonl:跨 run 热点窗口排行dataset_attribution_<metric>.csv/jsonl:每个热点窗口的 Top-N 归因实体entity_hotspots_<metric>.csv/jsonl:按 run 内 PID/TID 聚合的热点实体摘要
一次分析所有指标:
python analysis/dataset_hotspot.py \
--data-root data/llvm_test_suite/bcc/O3-g \
--output results/llvm_test_suite/aha_O3-g_hotspots \
--all-metrics \
--top 20多指标模式还会额外输出:
metrics_overview.csv/jsonl:所有指标的热点窗口数量、峰值热点分数与最强热点窗口位置run_hotspot_summary_<metric>.csv/jsonl:按指标拆分的 run 级摘要
绘制跨 run 热点图:
python analysis/dataset_hotspot_report.py \
--results results/llvm_test_suite/aha_O3-g_hotspots \
--output results/llvm_test_suite/aha_O3-g_hotspots/figures \
--top 10默认生成:
metrics_overview.pdf:多指标热点总览dataset_hotspots_<metric>.pdf:跨 run 热点窗口条形图entity_hotspots_<metric>.pdf:热点归因实体条形图
默认直接读取 data/llvm_test_suite/bcc/O3-g,一次跑完全部预定义指标,并输出到 results/llvm_test_suite/aha_O3-g_attribution_report:
python analysis/attribution_report.py如果只想跑单个指标,或者改数据目录、输出目录:
python analysis/attribution_report.py \
--data-root data/llvm_test_suite/bcc/O3-g \
--output results/llvm_test_suite/custom_attribution_report \
--metric dtlb_misses默认产出:
dataset_attribution_<metric>.csv/jsonl:每个指标对应的热点窗口归因实体明细entity_hotspots_<metric>.csv/jsonl:每个指标对应的 run 内热点实体摘要run_hotspot_summary_<metric>.csv/jsonl:多指标模式下每个指标的 run 级汇总metrics_overview.csv/jsonl:指标总览attribution_report.md:Markdown 归因摘要figures/*.pdf:热点窗口、归因实体及多指标总览图表
默认直接读取 data/llvm_test_suite/bcc/O3-g,输出到 results/llvm_test_suite/aha_O3-g_metric_relations:
python analysis/metric_relation_report.py也可以自定义数据目录、输出目录和滞后窗口范围:
python analysis/metric_relation_report.py \
--data-root data/llvm_test_suite/bcc/O3-g \
--output results/llvm_test_suite/custom_metric_relations \
--max-lag 8默认产出:
run_metric_relation_summary.csv/jsonl:每个 run 的可用指标数、指标对数和最强指标对dataset_metric_pairs.csv/jsonl:跨 run 的指标对明细,包含pearson_r、peak_lag、co_spike_countmetric_pair_overview.csv/jsonl:按指标对汇总的均值相关性、主导滞后和联合热点统计metric_relation_report.md:Markdown 时序关系摘要figures/*.pdf:指标对强度总览和联合热点总览图表
python analysis/attribution.py \
--data data/run_001/ \
--pid <PID> \
--binary /path/to/target_binary \
--output results/run_001/ \
--metric llc_load_missespython analysis/report.py \
--results results/run_001/ \
--output results/run_001/figures/python export/to_baseline.py \
--input data/run_001/ \
--output /path/to/ebpf-mem-analyzer/data/new_input/git submodule update --init --recursive
# 在 third_party/llvm-test-suite 中完成构建后,提取 ELF 和 .test 运行规格
bash experiments/llvm_test_suite/extract_elf.sh -n
# 正式提取
bash experiments/llvm_test_suite/extract_elf.sh -b build-O1 -v O1
# 基于提取结果执行单个 VARIANT 的 BCC 采集(默认 VARIANT=O3)
sudo bash experiments/llvm_test_suite/collect_dataset_testbench.sh
# 一次顺序采集 data/llvm_test_suite 下全部 VARIANT(自动检测 O0/O1/O2/O3)
sudo bash experiments/llvm_test_suite/collect_dataset_all_variants.sh
# 将最新 raw manifests 冻结为可复现的 145x4 curated run list
python scripts/freeze_curated_manifest.py --data-root data/llvm_test_suite
# 基于 curated manifests 重建运行级特征
python scripts/build_run_features.py \
--data-root data/llvm_test_suite \
--manifest-prefix manifest_curated \
--output train_set_curated默认输出:
data/llvm_test_suite/bin/<VARIANT>:提取的 ELFdata/llvm_test_suite/test/<VARIANT>:对应 .test 与运行时文件data/llvm_test_suite/bcc/<VARIANT>/<bench>_<timestamp>/:BCC JSONL 采集结果data/llvm_test_suite/manifest_bcc_<VARIANT>.jsonl:批量采集清单data/llvm_test_suite/manifest_curated_<VARIANT>.jsonl:冻结后的 145x4 curated run listdata/llvm_test_suite/manifest_curated_summary.json:curated run list 汇总信息results/llvm_test_suite/log/:批量脚本运行日志
说明:
manifest_bcc_<VARIANT>.jsonl表示最新 raw 采集清单,不保证天然是干净的145 x 4训练输入。manifest_curated_<VARIANT>.jsonl才是“按最新完整 run 冻结”后的可复现 run list。- 如果后续要重建
run_features、pairs或anchor_set,建议从 curated manifests 开始。
# P3-1:采集开销测试
sudo bash experiments/overhead/run_overhead.sh
# P3-2:重复运行稳定性(指定目标进程)
sudo bash experiments/stability/run_stability.sh --pid <PID> --repeat 10
# P3-3:参数敏感性扫描
sudo bash experiments/sensitivity/run_sensitivity.sh --pid <PID>
# P3-4:微基准校验(验证方向正确性)
sudo bash experiments/micro_benchmark/run_micro_bench.sh上述三类 P3 脚本现在都会在结果目录里自动生成带阈值判定的 Markdown/CSV 表,包括:
overhead_summary.*stability_summary.*sensitivity_*_summary.*methodology_recommendations.*methodology_validation.md
固定阈值、推荐默认配置和论文引用口径见 docs/methodology-validation.md。
| 阶段 | 目标 | 状态 |
|---|---|---|
| P0 | 边界定义 · 目录结构 · 最小输出链路 | ✅ 完成 |
| P1 | 最小可用 eBPF 原型(稳定 attach · PID 过滤 · 时间窗落盘) | 🔲 待验证 |
| P2 | 函数级热点归因 | 🔲 待开发 |
| P3 | 测量方法学验证实验 | 🔲 待开发 |
| P4 | 与基线仓库弱连接 · 补充对比实验 | 🔲 待开发 |
当前主输出文件:
window_metrics.jsonl:时间窗级聚合指标(主要数据文件)run_metadata.jsonl:采集 session 元信息hotspot_summary.jsonl:热点摘要(analysis/ 脚本产出)
- BCC 原型(P1):当前通过 raw perf attr 绑定更多 cache/TLB 事件,但不同 CPU 微架构对事件可用性支持不同;不可用事件会在启动时被自动跳过。
- 符号化:无 DWARF 调试信息的二进制文件,addr2line 仅返回
??:0,建议以-g编译目标程序。 - CO-RE 版本:
bpf/mem_events.bpf.c需通过make编译生成 skeleton header 后才能在 libbpf 用户态程序中使用。