BPF性能工具初体验:BCC与bpftrace实战 BPF、BCC 与 bpftrace 简介BPFBerkeley Packet Filter最初用于网络包过滤2014年扩展为通用执行引擎支持在不修改内核的情况下运行迷你程序用于网络、观测和安全。观测方面BPF 可以高效追踪内核和应用事件。BCCBPF Compiler Collection是第一个高级追踪框架提供 C 编写内核代码Python/Lua/C 编写用户界面内置超过 70 个工具。bpftrace 是一个更新颖的前端使用专属高级语言适合编写一行命令或短小脚本。两者互补bpftrace 简洁灵活BCC 功能丰富、支持复杂参数。使用 BCC execsnoop 发现周期性进程启动问题execsnoop 通过追踪execve系统调用实时打印新创建进程信息。以下是在 Netflix 服务器上的实际输出系统空闲时运行# execsnoop PCOMM PID PPID RET ARGSrun1298344690./runbash1298344690/bin/bash svstat12985129840/command/svstat /service/httpd perl12986129840/usr/bin/perl-e$l;$l~/(\d)sec/;print$1||0ps12988129870/bin/ps--ppid1-opid,cmd,argsgrep12989129870/bin/grep org.apache.catalinased12990129870/bin/sed s/^ *//;cut12991129870/usr/bin/cut-d-f1xargs12992129870/usr/bin/xargsechomkdir12994129830/bin/mkdir-v-p/data/tomcat ^C添加-t时间戳选项发现进程每秒钟批量启动 30 个间隔一秒。这正是导致基准测试抖动的根源——一个误配置的服务每秒尝试启动并失败。关闭该服务后进程消失测试结果稳定。使用 BCC biolatency 识别 I/O 延迟异常biolatency 以直方图形式汇总块设备 I/O 延迟。以下是在敏感生产数据库上的输出-m 指定毫秒# biolatency -mTracing block device I/O... Hit Ctrl-C to end. ^C msecs:count distribution0-1:16335|****************************************|2-3:2272|*****|4-7:3603|********|8-15:4328|**********|16-31:3379|********|32-63:5815|**************|64-127:0||128-255:0||256-511:0||512-1023:11||输出显示双峰分布多数 I/O 在 0‑1ms缓存命中或闪存另一个模式在 32‑63ms可能排队此外 512‑1023ms 有 11 次 I/O延迟异常值。这些异常值需要进一步使用其他 BPF 工具深入分析以避免突破数据库延迟 SLA。bpftrace 基础追踪 open 系统调用bpftrace 一行命令即可追踪系统调用。以下程序追踪open(2)的 tracepoint# bpftrace -e tracepoint:syscalls:sys_enter_open { printf(%s %s\n, comm, str(args-filename)); }Attaching1probe... slack /run/user/1000/gdm/Xauthority slack /run/user/1000/gdm/Xauthority ^C输出显示进程名和打开的文件名。注意现代 Linux 更常用openat变体。可用-l列出# bpftrace -l tracepoint:syscalls:sys_enter_open*tracepoint:syscalls:sys_enter_open_by_handle_at tracepoint:syscalls:sys_enter_open tracepoint:syscalls:sys_enter_openat再用计数统计验证# bpftrace -e tracepoint:syscalls:sys_enter_open* { [probe] count(); }Attaching3probes... ^C [tracepoint:syscalls:sys_enter_open]:5[tracepoint:syscalls:sys_enter_openat]:308openat调用次数远多于open。BCC opensnoop 的丰富选项BCC 版本的 opensnoop 封装了更多功能可直接使用-x过滤失败调用# opensnoop -xPID COMM FD ERRPATH991irqbalance-12/proc/irq/133/smp_affinity991irqbalance-12/proc/irq/141/smp_affinity...支持选项包括选项说明-T添加时间戳-x只显示失败打开-p PID只追踪指定 PID-d DURATION限制追踪时长-n NAME按进程名匹配-f FLAG按 O_WRONLY 等标志过滤BCC 工具通常提供丰富命令行选项适用于生产环境快速定位问题。BCC 与 bpftrace 的互补性BCC 与 bpftrace 并非择一而是互补。bpftrace适合快速验证、一行命令、自定义短脚本。语言直观可以立即试用适合临时调试。BCC适合复杂逻辑、长期运行的守护进程、需要 argparse 等 Python 库的场景。内置 70 工具开箱即用。实践建议先用 BCC 工具如 opensnoop尝试若无合适选项再改用 bpftrace 编写自定义探查。遇到问题需要深入函数级追踪时可借助 kprobe/uprobe。动态与静态探针选择BPF 支持多种事件源静态探针tracepoint内核、USDT用户态。接口稳定开发者维护。动态探针kprobe内核函数、uprobe用户态函数。灵活但可能因函数名变化而失效。推荐顺序优先使用静态探针当静态探针不足时再回退到动态探针。总结execsnoop 和 biolatency 是 BCC 中快速发现问题的利器分别针对进程执行和磁盘 I/O 延迟。bpftrace 以其简洁语言实现高效自定义追踪可用于数秒内检验假设。BCC 和 bpftrace 联合使用覆盖从快速诊断到深度分析的完整需求。动态探针提供超强可见性但需要注意接口稳定性。BPF 工具让系统观测如同 X 射线——无需重启或特殊模式即可在生产环境中直击问题根源。