如何对 eBPF 代码进行性能分析?实例展示完整流程

发布时间:2026/7/29 15:34:08
如何对 eBPF 代码进行性能分析?实例展示完整流程 如何对 eBPF 代码进行性能分析实例展示完整流程在运行 eBPF 工作负载或编写 eBPF 代码时通常希望衡量其对性能的影响。本文通过实例展示对 eBPF 代码进行性能分析的方法。例子目标是测量文件打开操作性能代码使用 eBPF 中的文件打开钩子衡量添加该钩子的性能开销。为找出性能瓶颈需依赖最少的简单 C 语言测试工具测量文件打开性能给出了示例代码。代码目标是保持简单在热缓存条件下重复打开同一文件减少无关变化帮助确定 p50/p99 指标调用 syscall(SYS_openat, …) 而非 libc 的 openat() 包装函数丢弃前 10% 结果作为预热期数据。测试工具输出文件打开次数及每次打开时间用于测量添加 eBPF 钩子前后的性能变化。环境设置对 eBPF 代码进行性能分析时希望 perf 工具能解析符号需运行命令 sudo sysctl -w net.core.bpf_jit_enable1 和 sudo sysctl -w net.core.bpf_jit_kallsyms1启用 JIT 编译并暴露 BPF 符号使 perf 报告显示程序名称。检查符号是否出现在 perf 工具中可运行 eBPF 代码并使用相关命令检查 lsm 是因为测量 LSM 钩子。因使用自定义内核版本perf 不在标准路径本示例安装路径为 PERF/usr/lib/linux-tools/6.8.0-134-generic/perf。性能测量设置好工具后第一步在不运行 eBPF 代码时测量用 C 代码打开 /etc/hostname 文件并输出结果到文件计算 p50/p99 指标使用命令 sudo taskset -c 3 chrt -f 99 ./bench /etc/hostname 100000 /tmp/samples.txt taskset -c 3 锁定执行到 CPU 3 减少干扰chrt -f 99 赋予高 CPU 优先级C 代码丢弃前 10% 数据文件应包含 90,000 个样本。接下来运行 eBPF 代码并执行命令 sudo $PERF record -g --call-graph fp -e cycles:k -F 997 -o ~/perf.data -- taskset -c 3 chrt -f 99 ./bench /etc/hostname 200000 /tmp/samples.txt各选项有不同作用。运行后用命令 sudo $PERF report -i ~/perf.data --stdio --sort comm,dso,symbol perf.txt 对数据排序。给出 perf.txt 示例输出显示 bpf_lsm_file_open 及其尾调用时间是性能瓶颈该部分处于热点路径减少 CPU 周期分配对系统性能影响显著。本文关注性能分析方法开销取决于钩子功能不讨论具体数值专注获取数据方法。通过上述步骤可分析时间花费处结合 C 代码 p50/p99 指标对代码进行性能调优识别 eBPF 代码对性能的影响并找出优化地方优化方法如缓存数据或设计更好算法。