eBPF 是什么?在内核里安全挂钩子观测一切
答案:eBPF 是 Linux 内核的安全可编程观测框架——用户写一段代码加载进内核,用 kprobe/uprobe/tracepoint 挂到系统调用、文件 IO、网络、调度等事件上,实时、细粒度、低开销地拿到内核内部数据。上手用 bpftrace(一行脚本)或 bcc(Python/C 工具集)。
一、为什么会有 eBPF
传统观测要么看 /proc 快照(粗、有延迟),要么写内核模块(危险)。eBPF 让你"写一段小代码进内核",但加载前经过验证器做安全检查(保证终止、不越界、受限指令),既能看内核内部,又不会搞崩系统。
二、最快上手(三选一)
# 1. 用现成工具,零编写(bcc 自带几十个)
sudo biolatency # 块设备 IO 延迟分布直方图
sudo runqlat # 调度延迟分布
sudo execsnoop # 实时看新启动的进程
sudo tcpconnect # 看 TCP 连接事件
# 2. bpftrace 一行脚本(类 awk)
sudo bpftrace -e 'kprobe:vfs_read { @[comm] = count(); }'
# 3. bcc Python 写自定义工具
sudo python3 myscript.py三、能观测什么(典型场景)
| 场景 | 工具 | 看什么 |
|---|---|---|
| 调度延迟高 | runqlat | 进程在运行队列排队多久 |
| 存储慢 | biolatency | 块设备 IO 延迟分布 |
| 频繁起进程 | execsnoop | 谁在反复 exec |
| 网络连接风暴 | tcpconnect | TCP 连接来源/频率 |
| 文件被谁改 | opensnoop | 文件 open/读写事件 |
| OOM 被杀 | oomkill | 谁触发 OOM、杀了谁 |
四、环境要求
- 权限:root(或 CAP_BPF / CAP_SYS_ADMIN);
- 内核:bcc 需 4.4+,基础 bpftrace 4.1+;内核 5.8+ 支持 BPF CO-RE,工具可跨内核版本免重编译;
- 挂载:需要
debugfs/tracefs且开启 kprobes。
五、常见坑
- 权限不足:很多"Permission denied"是没 root / CAP_BPF;
- 内核太老:CO-RE 特性需要 5.8+,老内核得为每个内核版本编译;
- 容器里跑:容器缺内核符号/mount,一般要在宿主机跑或给特权;
- 验证器拒绝:代码写崩(越界/死循环)会被拒载,别硬来。
深度入口
- 工作原理、验证器、kprobe/uprobe/tracepoint、bcc 工具详解:eBPF 观测框架深入
- 与采样型工具的关系:perf 火焰图完全指南
- 系统调用内部机制:系统调用
FAQ
Q: eBPF 是什么?和传统性能工具区别在哪? A: 安全可编程观测框架,把代码加载进内核挂事件钩子,实时拿内核内部数据。区别:比 /proc 快照细、比内核模块安全(有验证器检查)。
Q: eBPF 怎么用?bcc 和 bpftrace 选哪个? A: bpftrace 一行脚本适合快速观测,bcc 用 Python/C 写复杂工具。生产可先用 bcc 自带工具(runqlat/biolatency/execsnoop 等)零编写。
Q: eBPF 能观测什么?给几个典型场景 A: 调度延迟(runqlat)、块设备 IO 延迟(biolatency)、新进程 exec(execsnoop)、TCP 连接(tcpconnect)、文件访问(opensnoop)、OOM(oomkill)。
Q: 跑 bcc/bpftrace 需要什么环境? A: root(或 CAP_BPF/CAP_SYS_ADMIN)+ 内核 4.4+,挂载 debugfs/tracefs。内核 5.8+ 支持 CO-RE 跨版本免编译。
Q: eBPF 和 perf 的关系? A: 互补。perf 采样出火焰图定位热点,eBPF 做事件级精准观测与延迟统计,可配合使用。
Q: eBPF 有安全风险吗? A: 有严格验证器保证终止、不越界、指令受限,越界/死循环会被拒载。仍需 root/CAP_BPF 权限,只跑可信工具即可。
一句话总结:eBPF 让你安全地把小段代码加载进内核挂事件钩子,用 bpftrace/bcc 一行就能观测调度、IO、网络、进程的细粒度数据,与 perf 的采样分析互补。