深色模式
eBPF 可观测
摘要:eBPF 让你在不修改应用、不重启进程的前提下,从内核里拿到 TCP 连接、系统调用、文件访问和进程执行等数据。本文先用 bcc 工具集做即时诊断,再介绍用 eBPF 采集网络黄金指标并接入 Prometheus 的做法。
适用环境
bash
uname -r # 建议 4.9+,生产建议 5.x
cat /boot/config-$(uname -r) 2>/dev/null | grep -c 'CONFIG_BPF=y'
ls /sys/kernel/debug/tracing 2>/dev/null | head -3
# 安装 bcc 工具集
sudo yum install -y bcc-tools # Debian: apt-get install -y bpfcc-tools1
2
3
4
5
6
2
3
4
5
6
操作步骤
1. 用现成工具做即时诊断(零编码,最快见效)
bash
# 实时看哪些进程在发起 TCP 连接(含源目的地址与端口)
sudo tcpconnect
# 看 TCP 重传(重传高 = 网络质量差,是延迟抖动的常见根因)
sudo tcpretrans
# 按进程统计磁盘 I/O
sudo biosnoop
# 统计慢系统调用(超过阈值的 open/read/write)
sudo syscount -d 51
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
2. 用 bpftrace 写一行式探针
bash
# 统计 5 秒内各进程的系统调用次数
sudo bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[comm] = count(); } interval:s:5 { exit(); }'
# 追踪某文件的打开者
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat /str(args->filename) == "/etc/passwd"/ { printf("%s %d\n", comm, pid); }'
# 查看 TCP 连接建立的延迟分布
sudo bpftrace -e 'kprobe:tcp_connect { @start[tid] = nsecs; } kretprobe:tcp_connect /@start[tid]/ { @ns = hist(nsecs - @start[tid]); delete(@start[tid]); }'1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
3. 采集网络黄金指标(无需埋点即可获得服务的 RED 指标)
bash
# 部署 Cilium 的 Hubble 或 Pixie 这类 eBPF 可观测方案(按官方文档安装)
# 以 Hubble 为例,开启后可直接看服务间流量拓扑
hubble observe --all1
2
3
2
3
bash
# 用 Cilium 的 metrics 能力暴露 Prometheus 指标
cilium-agent --prometheus-serve-addr=:9962
curl -s http://127.0.0.1:9962/metrics | grep -c 'hubble'1
2
3
2
3
4. 用 eBPF 做无侵入链路补充
bash
# 基于 eBPF 的方案(如 Odigos、Beyla)可自动识别 HTTP/gRPC 调用并生成 span
# 以 Beyla 为例:指定要观测的进程端口,直接吐出 OTLP 数据
sudo BEYLA_PROMETHEUS_PORT=8999 \
OTEL_EXPORTER_OTLP_ENDPOINT=http://127.0.0.1:4317 \
BEYLA_OPEN_PORT=8080 \
/usr/local/bin/beyla1
2
3
4
5
6
2
3
4
5
6
5. 接入 Prometheus
yaml
scrape_configs:
- job_name: ebpf-network
static_configs:
- targets: ['127.0.0.1:9962']1
2
3
4
2
3
4
6. 与其它信号的配合原则
eBPF 覆盖"黑盒"视角(系统层发生了什么),应用埋点覆盖"白盒"视角(业务层为什么)。两者互补:eBPF 发现某服务 TCP 重传飙升后,再用链路定位到具体接口。
验证
bash
# 1) 内核支持 eBPF
sudo bpftool feature probe 2>/dev/null | head -5 || uname -r
# 2) bcc 工具能跑(发起一次外部连接后应有输出)
curl -s https://example.com -o /dev/null; sudo timeout 5 tcpconnect | head -5
# 3) 已加载的 eBPF 程序列表
sudo bpftool prog list 2>/dev/null | head -10
# 4) 指标端点有数据
curl -s http://127.0.0.1:9962/metrics | grep -m3 'hubble\|flow'1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
常见坑
WARNING
低内核版本或容器环境缺少 /sys/kernel/debug、CAP_BPF、CAP_SYS_ADMIN 权限时,eBPF 程序无法加载。容器里运行需显式授予相应 capability。
WARNING
tcpconnect 之类的实时追踪工具在高流量机器上开销不可忽视,长时间全量开启会影响业务。请限定时间窗口或只在排查期启用。
DANGER
eBPF 能采集到系统调用参数和文件内容,一旦采集范围过宽,等同于在内核层开了全量审计,可能捕获敏感数据。生产环境请明确采集白名单,并对输出做脱敏与访问控制。