eBPF 与 bpftrace 实战教程:Linux 内核可观测性与动态追踪
eBPF 与 bpftrace 实战教程Linux 内核可观测性与动态追踪eBPFExtended Berkeley Packet Filter是现代 Linux 内核中最强大的可观测性技术之一。它允许开发者在内核空间安全地运行沙箱程序无需修改内核源码或加载内核模块就能动态追踪系统调用、网络流量、磁盘 I/O 等底层事件。结合 bpftrace 这一高层次追踪语言运维工程师和性能工程师可以用极少的代码实现过去只有内核开发者才能完成的诊断工作。bpftrace 是基于 eBPF 构建的单行脚本语言语法类似 awk 和 DTrace学习曲线平缓。bccBPF Compiler Collection则提供了一套完整的 Python/C 工具集内置数十个生产可用的诊断工具覆盖 CPU 调度、文件系统、网络协议栈等各个层面。两者配合使用可以在不停机、不重启的情况下对线上系统进行深度剖析。本教程将带你从零开始安装配置 bpftrace 和 bcc tools掌握常用的单行脚本编写技巧深入追踪系统调用、网络连接和磁盘 I/O并通过真实案例展示如何快速定位生产问题。服务器配置运行 eBPF 程序需要 Linux 内核版本 4.9 以上推荐 5.4且需要 root 权限。对于学习和实验场景一台普通的 VPS 即可满足需求。推荐使用雨云服务器 rainyun-com注册填优惠码2026off领 5 折优惠券。选择2 核 4GB 机型搭配 Ubuntu 22.04 LTS 或 Debian 12内核版本 5.15 以上完全满足 bpftrace 和 bcc 的运行要求。该配置在运行内核追踪时不会有明显性能损耗适合长期学习和轻量级生产监控。安装准备工作确认内核版本uname-r# 输出示例5.15.0-107-generic内核需大于等于 4.9推荐 5.4。对于完整的 BTFBPF Type Format支持推荐 5.8。安装 bpftraceUbuntu 22.04 / Debian 12sudoaptupdatesudoaptinstall-ybpftrace从源码编译最新版可选sudoaptinstall-ycmake libelf-dev zlib1g-dev libfl-dev clang llvmgitclone https://github.com/bpftrace/bpftracecdbpftracemkdirbuildcdbuild cmake..-DCMAKE_BUILD_TYPEReleasemake-j$(nproc)sudomakeinstall安装 bcc toolssudoaptinstall-ybpfcc-tools linux-headers-$(uname-r)# bcc 工具通常以 -bpfcc 后缀安装如 execsnoop-bpfcc验证安装sudobpftrace--version# bpftrace v0.21.xsudoopensnoop-bpfcc# 测试 bcc 工具详细配置bpftrace 基本语法bpftrace 程序由探针probe和动作action组成probe [, probe] /filter/ { action }常用探针类型探针类型说明示例tracepoint内核静态追踪点tracepoint:syscalls:sys_enter_readkprobe内核函数入口kprobe:vfs_readkretprobe内核函数返回kretprobe:vfs_readuprobe用户态函数入口uprobe:/bin/bash:readlinesoftware软件事件software:cpu-clock:1msinterval定时器interval:s:1追踪系统调用追踪所有 open/openat 系统调用sudobpftrace-e tracepoint:syscalls:sys_enter_openat { printf(%-6d %-16s %s\n, pid, comm, str(args-filename)); }统计各进程 read 系统调用次数每秒输出sudobpftrace-e tracepoint:syscalls:sys_enter_read { [comm] count(); } interval:s:1 { print(); clear(); }追踪系统调用延迟直方图sudobpftrace-e tracepoint:syscalls:sys_enter_read { start[tid] nsecs; } tracepoint:syscalls:sys_exit_read /start[tid]/ { latency_us hist((nsecs - start[tid]) / 1000); delete(start[tid]); }追踪网络 I/O追踪 TCP 连接建立sudobpftrace-e tracepoint:sock:inet_sock_set_state /args-newstate 1/ { printf(%-6d %-16s %s - %s\n, pid, comm, ntop(args-saddr), ntop(args-daddr)); }统计进程网络发送字节数sudobpftrace-e kprobe:tcp_sendmsg { bytes[comm] sum(arg2); } interval:s:5 { print(bytes); clear(bytes); }追踪磁盘 I/O追踪块设备 I/O 延迟sudobpftrace-e tracepoint:block:block_rq_issue { start[args-dev, args-sector] nsecs; } tracepoint:block:block_rq_complete /start[args-dev, args-sector]/ { io_ms hist((nsecs - start[args-dev, args-sector]) / 1000000); delete(start[args-dev, args-sector]); }进阶用法使用 bcc tools 内置工具集bcc 提供了大量开箱即用的工具以下是最常用的几个execsnoop— 追踪所有新进程创建sudoexecsnoop-bpfcc# PCOMM PID PPID RET ARGS# bash 12345 12344 0 /bin/bashbiolatency— 块 I/O 延迟直方图sudobiolatency-bpfcc-D101tcpconnect— 追踪主动 TCP 连接sudotcpconnect-bpfcc-t# TIME(s) PID COMM IP SADDR DADDR DPORTrunqlat— CPU 调度延迟分析sudorunqlat-bpfcc51profile— CPU 火焰图采样sudoprofile-bpfcc-F9930/tmp/out.stacks# 配合 flamegraph.pl 生成火焰图gitclone https://github.com/brendangregg/FlameGraph ./FlameGraph/stackcollapse.pl /tmp/out.stacks|./FlameGraph/flamegraph.plcpu_flame.svg追踪用户态函数追踪 Python 应用的函数调用sudobpftrace-e uprobe:/usr/bin/python3:PyObject_Call { printf(Python call: pid%d\n, pid); }追踪 Nginx 处理请求延迟sudobpftrace-e uprobe:/usr/sbin/nginx:ngx_http_process_request { start[tid] nsecs; } uretprobe:/usr/sbin/nginx:ngx_http_process_request /start[tid]/ { ms hist((nsecs - start[tid]) / 1000000); delete(start[tid]); }内核函数追踪与参数读取使用kprobe追踪 VFS 层读取操作sudobpftrace-e kprobe:vfs_read { [comm] sum(arg2); // arg2 是 count 参数 } END { print(); }列出可用的追踪点sudobpftrace-ltracepoint:syscalls:*|head-20sudobpftrace-lkprobe:tcp_*|head-20实战示例案例一定位高 I/O 等待进程生产环境 I/O wait 飙高用以下脚本快速定位sudobpftrace-e tracepoint:block:block_rq_issue { [comm, pid] count(); } interval:s:3 { print(); clear(); printf(---\n); }输出示例[mysqld, 1234]: 842 [rsync, 5678]: 223 [jbd2/sda1-8, 89]: 45案例二追踪慢查询 SQL 连接# 追踪 MySQL 建立的所有 TCP 连接sudotcplife-bpfcc-p$(pgrep mysqld|head-1)案例三分析文件系统热点sudobpftrace-e tracepoint:syscalls:sys_enter_openat { files[str(args-filename)] count(); } END { print(files, 20); // 打印 top 20 }常见问题Q运行 bpftrace 报 “ERROR: failed to attach kprobe”A检查内核是否启用了CONFIG_BPF_KPROBE_OVERRIDE或尝试使用tracepoint替代kprobe。部分云服务器内核可能限制了 kprobe可改用 tracepoint 探针。Q提示 “BTF not found”A安装 BTF 支持sudoaptinstall-ylinux-image-$(uname-r)-dbg# 或确认 /sys/kernel/btf/vmlinux 文件存在ls/sys/kernel/btf/vmlinuxQbpftrace 脚本执行后输出为空A检查探针名称是否正确使用bpftrace -l列出可用探针。注意不同内核版本的追踪点名称可能有差异。Q如何减少 bpftrace 对系统性能的影响A使用采样机制/pid % 10 0/降低采样频率避免在高频探针中执行复杂操作优先使用聚合操作map代替printf。Qbcc 工具报 “Unable to find kernel headers”Asudoaptinstall-ylinux-headers-$(uname-r)eBPF 和 bpftrace 是现代 Linux 可观测性工具链的核心掌握它们能让你在不影响生产系统稳定性的前提下实现深度性能剖析。要充分发挥 eBPF 的能力一台内核版本较新、资源充足的 Linux 服务器必不可少。推荐选用雨云服务器 rainyun-com的2 核 4GB 机型注册时填入优惠码2026off可领取 5 折优惠券以极低的成本搭建专属的内核追踪实验环境加速你的 eBPF 学习之旅。