在前八篇文章中,我们构建了完整的 LGTM 可观测性栈,并掌握了日志、指标、链路追踪的采集与分析。但所有这些数据都依赖于应用主动插桩------无论是手动埋点还是自动注入,都需要应用"配合"才能产生数据。eBPF(Extended Berkeley Packet Filter) 彻底改变了这个游戏规则:它让你无需修改应用代码、无需重启服务,就能从 Linux 内核深处观测系统的每一个角落。本文从 eBPF 的技术原理出发,系统讲解 BCC 和 bpftrace 工具集的使用、自定义探针的开发、以及 eBPF 在生产环境中的部署考量,帮你掌握零侵扰可观测性的核心技能。
一、eBPF 是什么?
eBPF 是一项革命性的 Linux 内核技术,它允许用户在内核中运行安全沙箱化的程序,而无需修改内核源码或加载内核模块。
eBPF 的核心能力:
动态追踪:在任意内核函数或用户态函数入口/出口附加探针
零侵扰:无需修改应用代码、无需重启服务
低开销:eBPF 程序经过 JIT 编译为原生机器码,开销极低
eBPF 的可观测性价值在于:它能观测到应用"不告诉你的东西" ------系统调用、网络包、内存分配、调度延迟,这些都是应用层插桩难以触及的领域。
二、eBPF 可观测性的独特价值

eBPF 让你能够观测到 "黑盒"状态下的系统行为------这正是排查疑难杂症时的杀手锏。
三、BCC:开箱即用的 eBPF 工具集
BCC(BPF Compiler Collection) 提供了 100+ 个预编译的 eBPF 工具,覆盖 CPU、内存、磁盘、网络等各个维度。
3.1 常用 BCC 工具

3.2 实战:使用 runqlat 分析调度延迟
bash
# 运行 runqlat,显示 CPU 调度延迟分布
sudo runqlat-bpfcc 5 # 采样 5 秒
输出示例:
text
@usecs:
[0, 1) 12345 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|
[1, 2) 2345 |@@@@@@@|
[2, 4) 123 |@@|
[4, 8) 12 | |
...
如果大量延迟落在高区间(> 1000us),说明进程经常在 CPU 队列中等待,可能是 CPU 资源不足或调度策略问题。
3.3 实战:追踪文件打开(opensnoop)
bash
# 实时监控所有文件打开事件
sudo opensnoop-bpfcc -T
# 只监控特定进程
sudo opensnoop-bpfcc -p 1234
四、bpftrace:一行代码的动态追踪
bpftrace 是 eBPF 的高级追踪语言,语法简洁,适合快速临时排查。
4.1 安装与验证
bash
# Ubuntu/Debian
sudo apt install bpftrace
# 验证
sudo bpftrace -e 'BEGIN { printf("Hello eBPF!\n"); }'
4.2 常用探针类型

💡 建议:优先使用 tracepoint 而非 kprobe,因为 tracepoint 是内核预定义的稳定接口,对性能影响更小。
4.3 一行式实战
追踪所有 open 系统调用:
bash
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_open { printf("%s -> %s\n", comm, str(args->filename)); }'
统计各进程的系统调用次数:
bash
sudo bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[comm] = count(); }'
追踪容器内的文件访问:
bash
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat /str(args->filename) != ""/ { printf("PID %d: %s\n", pid, str(args->filename)); }'
4.4 脚本化追踪
将复杂逻辑写入脚本文件(.bt 文件):
bash
# save as trace_open.bt
tracepoint:syscalls:sys_enter_open
{
@opens[comm] = count();
}
interval:s:10
{
print(@opens);
clear(@opens);
}
执行:
bash
sudo bpftrace trace_open.bt
五、Grafana Beyla:eBPF 自动插桩工具
Grafana Beyla 是一个基于 eBPF 的零代码自动插桩工具,无需修改应用代码即可采集 HTTP/gRPC 服务的 Trace 和 Metrics。
5.1 Beyla 的核心能力
零代码插桩:无需修改应用代码,无需重新编译
自动生成 Trace:基于 eBPF 自动捕获 HTTP/gRPC 请求
OpenTelemetry 兼容:生成的 Trace 符合 OTel 标准
Kubernetes 原生:以 DaemonSet 形式部署
5.2 Beyla 2.5 的新特性
Beyla 2.5 支持 Go 应用手动 Span 添加------在自动插桩的基础上,开发者可以手动添加业务逻辑 Span,实现自动与手动的混合插桩。
5.3 部署 Beyla(Kubernetes)
yaml
# beyla-daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: beyla
spec:
selector:
matchLabels:
app: beyla
template:
metadata:
labels:
app: beyla
spec:
hostNetwork: true
containers:
- name: beyla
image: grafana/beyla:latest
env:
- name: BEYLA_OPEN_PORT
value: "8080,9090"
- name: BEYLA_OTEL_EXPORTER_OTLP_ENDPOINT
value: "http://tempo-distributor:4317"
securityContext:
privileged: true
六、Cilium + Hubble:网络可观测性
Cilium 是基于 eBPF 的 CNI 网络插件,Hubble 是其内置的网络可观测性平台。
6.1 Hubble 的核心能力
零侵扰采集:基于 eBPF 捕获所有网络流量
L3-L7 可观测性:从 IP 层到 HTTP/gRPC 应用层
实时流量查看:类似 tail -f 的网络流量日志
安全策略验证:可视化 NetworkPolicy 执行情况
6.2 使用 Hubble CLI 查看流量
bash
# 查看所有网络流量
hubble observe
# 过滤特定命名空间
hubble observe --namespace production
# 过滤特定 Pod
hubble observe --from-pod frontend-xxx --to-pod backend-xxx
# 查看 HTTP 请求详情
hubble observe --protocol http
七、eBPF 生产环境部署考量
7.1 性能开销
eBPF 在生产环境中的性能开销已被广泛验证:
典型 CPU 开销:低于 2%
最大 CPU 开销:不超过 5%
Meta 的 Strobelight:通过 eBPF 将 CPU 周期降低 20%
Alibaba Cloud:通过 eBPF 将基础设施成本降低 19%
7.2 部署最佳实践
优先使用 tracepoint:替代 kprobe,减少对内核稳定性的影响。
限制采样频率:高频采样可能增加开销,根据需求设置合理的采样率。
使用 eBPF 验证器:确保程序通过内核验证器检查,不会导致内核崩溃。
监控 eBPF 自身:监控 eBPF 程序的资源消耗,设置告警。
八、小结
eBPF 是一项革命性的内核技术,允许在内核中运行安全沙箱程序,实现零侵扰可观测性。
BCC 提供了 100+ 个开箱即用的 eBPF 工具,覆盖 CPU、内存、磁盘、网络各维度。
bpftrace 是 eBPF 的高级追踪语言,支持一行式动态追踪和脚本化分析。
Grafana Beyla 是基于 eBPF 的零代码自动插桩工具,无需修改应用代码即可采集 Trace 和 Metrics。
Cilium + Hubble 提供基于 eBPF 的网络可观测性,支持 L3-L7 流量可视化和安全策略验证。
生产环境开销:eBPF 典型 CPU 开销低于 2%,Meta、阿里巴巴等大型企业已在大规模生产环境中验证。