bcc 工具集:execsnoop / opensnoop / biolatency 速查
更新时间:2026-09-19。bcc(BPF Compiler Collection)提供一批基于 eBPF 的现成排障工具,覆盖进程、文件、IO、网络、调度。它们不需要改代码、开销低,可直接在生产短时运行。要自定义探针看 bpftrace,单函数延迟看 funclatency。
一、execsnoop:谁在被执行
bash
execsnoop # 实时打印所有新进程(execve):PID PPID 命令 参数
execsnoop -t # 带时间戳
execsnoop --count # 仅统计每个程序被执行的次数
execsnoop -P 1234 # 只看某父进程拉起的子进程典型用途:
- 找出周期性卡顿元凶:某脚本/cron/健康检查在频繁 fork(如每秒 shell 一次),传统 top 因为进程太短根本抓不到,execsnoop 专抓这种「短生命周期」进程。
- 容器启动时确认实际执行的入口命令;排查「谁在偷偷跑 curl/wget」。
二、opensnoop:进程在打开什么文件
bash
opensnoop # 全系统 open/openat 事件:PID 进程 文件路径 返回值
opensnoop -p 1234 # 只看某进程
opensnoop -n nginx # 按进程名
opensnoop -f /etc/passwd # 只看某路径
opensnoop -e # 只看打开失败(ENOENT/权限),定位缺配置/路径错用途:
- 配置/依赖排查:程序报「找不到文件」,用
-e直接看它到底尝试打开了哪些路径(含拼写错误、权限拒绝)。 - 理解软件行为:启动时读了哪些 so/配置/证书;排查库加载(ldd/注入相关)。
- 安全审计:非预期的敏感文件访问。
三、biolatency:块 IO 延迟分布
bash
biolatency # 持续输出磁盘 IO 延迟直方图(默认微秒),Ctrl+C 出汇总
biolatency -m # 毫秒
biolatency -F # 按设备分别统计
biolatency -p 1234 # 只看某进程发起的 IO
biolatency 10 1 # 10 秒输出一次、共 1 次bash
usecs : count distribution
64 -> 127 : 1820 |****************************************|
128 -> 255 : 412 |********* |
512 -> 1023 : 30 | |
4096 -> 8191 : 2 | | ← 长尾它回答「IO 实际多慢」的分布,比 iostat 的平均 await 更能暴露长尾慢 IO(偶发几百 ms 的卡顿)。右尾桶偏多 → 盘/云盘抖动、队列深、后台 GC/检查点竞争。压测时配合 fio 交叉验证。
四、其它高频 bcc 工具速查
| 工具 | 看什么 | 典型问题 |
|---|---|---|
| runqlat | 线程等运行队列多久 | CPU 不足/调度延迟导致的慢 |
runqlen | 运行队列长度(几线程在等 CPU) | 判断是否真的 CPU 饱和 |
offcputime | 线程不在线程上的时间(等 IO/锁) | 火焰图式找「等在哪」 |
ext4slower/xfsdist | 文件系统慢操作/延迟分布 | FS 层慢于块层? |
tcpretrans | TCP 重传统计 | 网络质量/缓冲区问题(配合 ss) |
tcplife | TCP 连接生命周期与收发量 | 短连接风暴 |
cachestat | 页缓存命中率 | 判断读是否穿透到磁盘 |
memleak | 用户态内存分配未释放统计 | native 内存泄漏(配合 pmap) |
vfscount/vfsstat | VFS 操作计数 | 文件操作热点 |
五、使用前提与注意
- 需要较新内核(一般 ≥4.9,功能完整建议 4.18+/5.x,开 BTF 更好),安装
bpfcc-tools/bcc 包,通常要 root。 - 容器内运行需宿主支持 eBPF 并有相应 capability(
CAP_BPF/CAP_SYS_ADMIN)或特权。 - 工具本身低开销但别无限开着,定位到就停;高频事件工具在超繁忙机器上仍有成本。
- 不同发行版命令名可能带内核版本后缀(如
execsnoop-bpfcc)。
坑
- 用 iostat 平均值判断「磁盘没问题」,忽视 biolatency 右尾的偶发慢 IO。
- 怀疑进程卡死却只看 ps,漏掉 execsnoop 能抓到的高频短命脚本。
- opensnoop 没看到读取就断定没读配置,实际可能在工具启动前已读完或用了静态链接/直连 syscall。
- 内核太老/无权限导致工具加载失败,先确认内核版本与 BPF 支持。
总结
bcc 提供一组即取即用的 eBPF 排障工具:execsnoop 抓新进程 execve、专杀频繁 fork 的短命脚本问题,opensnoop 跟踪文件打开、用 -e 定位配置缺失与错误路径,biolatency 输出块 IO 延迟直方图、比 iostat 平均 await 更能发现长尾抖动,再辅以 runqlat、offcputime、tcpretrans、cachestat、memleak 覆盖调度、等待、网络、缓存和泄漏;它们低开销可短时上生产,但需要较新内核、root/BTF 支持,定位后应及时停止。