当前位置: 首页 > news >正文

eBPF 实用命令行工具详解

eBPF(extended Berkeley Packet Filter)技术为 Linux 系统提供了强大的内核动态追踪能力。基于 eBPF 开发的一系列命令行工具,能够帮助运维人员、开发者和 SRE 快速诊断系统性能问题、排查网络故障和监控安全事件。本文聚焦于最实用的几个 eBPF 命令行工具,介绍它们解决的问题、典型使用方式、示例输出以及所需的内核版本。

前置条件:

这些工具大多来自 BCC 项目,部分为独立项目。你需要运行 Linux 内核 4.1+(推荐 4.9+ 以支持大部分功能),并安装 BCC 工具包或相应的二进制。安装方式可参考各项目文档,例如:

· Ubuntu:sudo apt install bpfcc-tools
· CentOS/RHEL:sudo yum install bcc-tools
· 通用方式:从源码编译 BCC

1. execsnoop:追踪瞬时进程

解决的问题

· 捕获生命周期极短的进程(例如某些脚本启动后又快速退出),这些进程往往无法通过 ps 或 top 看到。
· 用于排查为何系统负载突然升高,或者检测可疑的恶意进程(如挖矿木马)。

使用方式

```
execsnoop [选项]
```

常用选项:

· -T:输出时间戳
· -t:输出线程 ID
· -x:包含失败的 exec 调用

示例

$ sudo execsnoop -T
TIME(s) PCOMM PID PPID RET ARGS
0.123 bash 1234 1200 0 /bin/bash /tmp/test.sh
0.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_execve

2. opensnoop:追踪文件打开操作

解决的问题

· 当应用程序报错 “Permission denied” 或 “No such file”,但不知道它在尝试打开哪个文件时,可以用此工具实时监控。
· 分析进程读取了哪些配置文件,辅助调试或逆向工程。

使用方式

```
opensnoop [选项]
```

常用选项:

· -p PID:只追踪指定进程
· -d:打印目录项路径
· -T:显示时间戳

示例

```
$ sudo opensnoop -p 1234
PID COMM FD ERR PATH
1234 nginx 11 0 /var/log/nginx/access.log
1234 nginx -1 2 /var/run/nginx.pid
```

输出字段:

· PID:进程 ID
· COMM:进程名
· FD:返回的文件描述符(-1 表示失败)
· ERR:错误码(0 表示成功,2 表示 ENOENT,13 表示 EACCES)
· PATH:尝试打开的文件路径

内核版本要求

· Linux 4.5+(使用 tracepoint syscalls/sys_enter_open 及 sys_enter_openat)

3. tcplife:追踪 TCP 会话生命周期

解决的问题

· 监控系统中建立的 TCP 连接,查看本地和远程地址、端口、发送/接收的数据量、持续时间等。
· 分析网络服务负载、排查连接异常(如连接数过多、短连接频繁)。

使用方式

```
tcplife [选项]
```

常用选项:

· -p PID:只显示指定进程的 TCP 连接
· -L:只显示本地连接(不显示回环)
· -t:输出时间戳

示例

```
$ sudo tcplife
PID COMM LADDR LPORT RADDR RPORT TX_KB RX_KB DURATION
1234 nginx 192.168.1.10 80 10.0.0.5 54321 2.1 1.3 0.23
5678 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 和 kprobe)

4. tcpretrans:追踪 TCP 重传

解决的问题

· 快速定位网络重传的原因,例如丢包、延迟或拥塞控制问题。
· 配合其他工具(如 tcpdump)进一步分析重传时的网络行为。

使用方式

```
tcpretrans [选项]
```

常用选项:

· -l:仅显示本地重传(忽略对端重传)
· -c:显示重传时的 TCP 状态变化

示例

```
$ sudo tcpretrans
TIME IP SADDR:SPORT > DADDR:DPORT STATE
01:23:45 IPv4 10.0.0.5:54321 > 192.168.1.10:80 ESTABLISHED

```

输出字段:

· TIME:时间
· IP:IP 版本(IPv4/IPv6)
· SADDR:SPORT:源地址和端口
· DADDR:DPORT:目标地址和端口
· STATE:重传时的 TCP 状态(如 ESTABLISHED)

内核版本要求

· Linux 4.7+(使用 tracepoint tcp/tcp_retransmit_skb)

5. biolatency:磁盘 I/O 延迟分布直方图

解决的问题

· 量化磁盘 I/O 延迟,判断是否存在存储性能瓶颈。
· 通过直方图形式展示延迟分布,便于识别异常延迟(如 99% 分位值过高)。

使用方式

``
biolatency [选项]
```

常用选项:

· -m:显示毫秒(默认微秒)
· -D:按磁盘设备分别统计
· -F:显示 I/O 标志(读/写)

示例

```
$ sudo biolatency -m
Tracing block device I/O... Hit Ctrl-C to end.
msecs : count distribution

0->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_complete)

6. biosnoop:逐次磁盘 I/O 详情

解决的问题

· 查看每一次磁盘 I/O 的详细信息,包括进程、设备、扇区、大小、延迟等。
· 定位哪些进程在大量读写磁盘,或者哪些 I/O 操作耗时较长。

使用方式

```biosnoop [选项]
```

常用选项:

· -Q:显示排队延迟(从请求入队到完成)
· -D:显示完成延迟(从请求发出到完成)

示例

```
$ sudo biosnoop
TIME(s) COMM PID DISK T SECTOR BYTES LAT(ms)
0.123 mysql 2345 sda W 1234567 4096 1.2
0.145 kworker/u:0 0 sda R 7654321 8192 0.8
```

输出字段:

· TIME(s):I/O 完成时间(秒)
· COMM:发起 I/O 的进程名
· PID:进程 ID(0 表示内核线程)
· DISK:磁盘设备
· T:类型(R=读,W=写)
· SECTOR:起始扇区
· BYTES:I/O 大小(字节)
· LAT(ms):I/O 延迟(毫秒)

内核版本要求

· Linux 4.1+(同 biolatency)

7. pwru:网络数据包路径追踪

解决的问题

· 在内核网络栈中追踪数据包的完整路径,查看哪些函数处理了该数据包,以及何时被丢弃。
· 特别适合排查复杂的网络问题,如连接建立失败、数据包丢失、XDP/TC 规则异常等。

使用方式

pwru 是一个独立项目(cilium/pwru),需要单独安装。

```
pwru [选项] [过滤表达式]
```

常用选项:

· --filter-trace:过滤追踪点(如 tcp_v4_connect)
· --output-skb:打印 skb 地址
· --output-tuple:打印五元组信息

示例

追踪发往 80 端口的数据包:

```
$ sudo pwru 'tcp.dport == 80'
2023/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_connect
2023/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_xmit
2023/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 官方文档获取更多示例。

http://www.cnnetsun.cn/news/1310852.html

相关文章:

  • 基于ESP32-C3的智能卷帘电机闭环控制系统设计
  • LightTools VBA宏实战:如何一键提取杂散光分析数据(附完整代码)
  • wan2.1-vae多行业应用:教育课件插图、游戏原画草稿、建筑效果图生成
  • Phi-3 Forest Lab效果展示:对齐人类认知节奏的分步推理+自然停顿输出
  • Cosmos-Reason1-7B多场景:农业采摘机器人果实承重与夹持力推理
  • 美胸-年美-造相Z-Turbo效果展示:惊艳的半写实AI绘画作品集
  • YOLOv8鹰眼系统快速入门:无需深度学习基础,开箱即用
  • 从欧拉到RK4:IMU姿态解算中的数值积分方法选择与实践
  • Stable Yogi Leather-Dress-Collection 环境变量与配置文件详解:定制你的专属生成服务
  • 告别云端!GPT-OSS-20B本地部署指南:开源可控,16GB Mac就能跑
  • C# WinForm中动态调用外部EXE并实现多参数传递的实战指南
  • Phi-3-Mini-128K网络应用开发:基于Vue3构建智能问答管理后台
  • Oracle直方图实战:如何用DBMS_STATS优化SQL性能(附真实案例)
  • Prompt工程入门:从零开始设计高效AI提示词的完整指南(2024最新版)
  • Nano-Banana在软件测试中的应用:自动化测试脚本生成
  • 手把手教你用flv.js实现WebSocket直播流播放(附完整测试代码)
  • 从Windows转Mac必看!对照表式整理两系统快捷键差异(含M系列芯片适配问题)
  • 音频处理实战:如何用EQ参数整定优化你的音乐作品(避坑指南)
  • DeEAR语音情感识别实操手册:自定义阈值导出‘高唤醒预警’或‘低自然度告警’事件
  • 二阶系统动态特性揭秘:如何通过改变R/C值优化阶跃响应?
  • 结构光3D测量实战:如何用HPF模型搞定高动态范围表面重建(附完整代码)
  • 雄迈摄像头开发避坑大全:截屏无声/录像卡顿的7个解决方案
  • 3个技术民主化工具让用户实现Windows/Office正版化自由
  • Nanobot智能写作助手:内容生成与风格优化
  • Stable Yogi Leather-Dress-Collection新手指南:Streamlit界面操作与错误排查手册
  • 利用快马ai一键生成quartus ii安装向导,三步搞定fpga开发环境搭建
  • Z-Image-Turbo-辉夜巫女惊艳效果展示:LoRA微调下高还原度巫女角色图集
  • Qwen3-ASR-0.6B在游戏中的语音交互功能实现
  • wan2.1-vae惊艳案例:生成可直接用于3D建模参考的正交视角线稿
  • TQVaultAE:解放泰坦之旅玩家的装备管理革命