eBPF 实用命令行工具详解
eBPFextended Berkeley Packet Filter技术为 Linux 系统提供了强大的内核动态追踪能力。基于 eBPF 开发的一系列命令行工具能够帮助运维人员、开发者和 SRE 快速诊断系统性能问题、排查网络故障和监控安全事件。本文聚焦于最实用的几个 eBPF 命令行工具介绍它们解决的问题、典型使用方式、示例输出以及所需的内核版本。前置条件这些工具大多来自 BCC 项目部分为独立项目。你需要运行 Linux 内核 4.1推荐 4.9 以支持大部分功能并安装 BCC 工具包或相应的二进制。安装方式可参考各项目文档例如· Ubuntusudo apt install bpfcc-tools· CentOS/RHELsudo yum install bcc-tools· 通用方式从源码编译 BCC1. execsnoop追踪瞬时进程解决的问题· 捕获生命周期极短的进程例如某些脚本启动后又快速退出这些进程往往无法通过 ps 或 top 看到。· 用于排查为何系统负载突然升高或者检测可疑的恶意进程如挖矿木马。使用方式execsnoop [选项]常用选项· -T输出时间戳· -t输出线程 ID· -x包含失败的 exec 调用示例$ sudo execsnoop -TTIME(s) PCOMM PID PPID RET ARGS0.123 bash 1234 1200 0 /bin/bash /tmp/test.sh0.125 sleep 1235 1234 0 /bin/sleep 1输出字段· TIME(s)相对于开始时间的时间戳秒· PCOMM进程名· PID进程 ID· PPID父进程 ID· RET返回值0 表示成功· ARGS完整的命令行参数内核版本要求· Linux 4.1依赖于 tracepoint syscalls/sys_enter_execve2. opensnoop追踪文件打开操作解决的问题· 当应用程序报错 “Permission denied” 或 “No such file”但不知道它在尝试打开哪个文件时可以用此工具实时监控。· 分析进程读取了哪些配置文件辅助调试或逆向工程。使用方式opensnoop [选项]常用选项· -p PID只追踪指定进程· -d打印目录项路径· -T显示时间戳示例$ sudo opensnoop -p 1234PID COMM FD ERR PATH1234 nginx 11 0 /var/log/nginx/access.log1234 nginx -1 2 /var/run/nginx.pid输出字段· PID进程 ID· COMM进程名· FD返回的文件描述符-1 表示失败· ERR错误码0 表示成功2 表示 ENOENT13 表示 EACCES· PATH尝试打开的文件路径内核版本要求· Linux 4.5使用 tracepoint syscalls/sys_enter_open 及 sys_enter_openat3. tcplife追踪 TCP 会话生命周期解决的问题· 监控系统中建立的 TCP 连接查看本地和远程地址、端口、发送/接收的数据量、持续时间等。· 分析网络服务负载、排查连接异常如连接数过多、短连接频繁。使用方式tcplife [选项]常用选项· -p PID只显示指定进程的 TCP 连接· -L只显示本地连接不显示回环· -t输出时间戳示例$ sudo tcplifePID COMM LADDR LPORT RADDR RPORT TX_KB RX_KB DURATION1234 nginx 192.168.1.10 80 10.0.0.5 54321 2.1 1.3 0.235678 sshd 192.168.1.10 22 10.0.0.100 45678 5.6 12.4 12.5输出字段· PID进程 ID· COMM进程名· LADDR本地地址· LPORT本地端口· RADDR远程地址· RPORT远程端口· TX_KB发送的数据量KB· RX_KB接收的数据量KB· DURATION会话持续时间秒内核版本要求· Linux 4.6依赖于 tracepoint sock/inet_sock_set_state 和 kprobe4. tcpretrans追踪 TCP 重传解决的问题· 快速定位网络重传的原因例如丢包、延迟或拥塞控制问题。· 配合其他工具如 tcpdump进一步分析重传时的网络行为。使用方式tcpretrans [选项]常用选项· -l仅显示本地重传忽略对端重传· -c显示重传时的 TCP 状态变化示例$ sudo tcpretransTIME IP SADDR:SPORT DADDR:DPORT STATE01:23:45 IPv4 10.0.0.5:54321 192.168.1.10:80 ESTABLISHED输出字段· TIME时间· IPIP 版本IPv4/IPv6· SADDR:SPORT源地址和端口· DADDR:DPORT目标地址和端口· STATE重传时的 TCP 状态如 ESTABLISHED内核版本要求· Linux 4.7使用 tracepoint tcp/tcp_retransmit_skb5. biolatency磁盘 I/O 延迟分布直方图解决的问题· 量化磁盘 I/O 延迟判断是否存在存储性能瓶颈。· 通过直方图形式展示延迟分布便于识别异常延迟如 99% 分位值过高。使用方式biolatency [选项]常用选项· -m显示毫秒默认微秒· -D按磁盘设备分别统计· -F显示 I/O 标志读/写示例$ sudo biolatency -mTracing block device I/O... Hit Ctrl-C to end.msecs : count distribution0-1 : 120 |*****************************|2 - 3 : 35 |*********** |4 - 7 : 12 |*** |8 - 15 : 5 |* |16 - 31 : 2 | |输出解释· 左侧为延迟范围毫秒右侧为 I/O 次数直方图直观展示分布。内核版本要求· Linux 4.1使用 tracepoint block/block_rq_issue 和 block/block_rq_complete6. biosnoop逐次磁盘 I/O 详情解决的问题· 查看每一次磁盘 I/O 的详细信息包括进程、设备、扇区、大小、延迟等。· 定位哪些进程在大量读写磁盘或者哪些 I/O 操作耗时较长。使用方式biosnoop [选项]常用选项· -Q显示排队延迟从请求入队到完成· -D显示完成延迟从请求发出到完成示例$ sudo biosnoopTIME(s) COMM PID DISK T SECTOR BYTES LAT(ms)0.123 mysql 2345 sda W 1234567 4096 1.20.145 kworker/u:0 0 sda R 7654321 8192 0.8输出字段· TIME(s)I/O 完成时间秒· COMM发起 I/O 的进程名· PID进程 ID0 表示内核线程· DISK磁盘设备· T类型R读W写· SECTOR起始扇区· BYTESI/O 大小字节· LAT(ms)I/O 延迟毫秒内核版本要求· Linux 4.1同 biolatency7. pwru网络数据包路径追踪解决的问题· 在内核网络栈中追踪数据包的完整路径查看哪些函数处理了该数据包以及何时被丢弃。· 特别适合排查复杂的网络问题如连接建立失败、数据包丢失、XDP/TC 规则异常等。使用方式pwru 是一个独立项目cilium/pwru需要单独安装。pwru [选项] [过滤表达式]常用选项· --filter-trace过滤追踪点如 tcp_v4_connect· --output-skb打印 skb 地址· --output-tuple打印五元组信息示例追踪发往 80 端口的数据包$ sudo pwru tcp.dport 802023/10/01 12:34:56.123456 0:00:00:01:02:03:04:05 (127.0.0.1:54321 - 127.0.0.1:80) tcp_v4_connect2023/10/01 12:34:56.123457 0:00:00:01:02:03:04:05 (127.0.0.1:54321 - 127.0.0.1:80) ip_queue_xmit2023/10/01 12:34:56.123458 0:00:00:01:02:03:04:05 (127.0.0.1:54321 - 127.0.0.1:80) __dev_queue_xmit...输出为一系列内核函数调用同时附带数据包的五元组信息和 skb 指针。内核版本要求· Linux 5.5依赖于 BPF 迭代器和 CO-RE 特性总结这些工具覆盖了系统性能、网络、存储等多个关键领域是日常排查和监控的利器。通过熟练掌握它们可以大幅提升 Linux 系统的可观测性快速定位深层次问题。提示大部分工具都支持 -h 选项查看详细用法也可查阅 BCC 官方文档获取更多示例。