讲师中心 微信公众号
AI工具推荐 视频效率加速

Linux如何使用BPF开发观测工具_LinuxeBPF探针开发教程

风杰大大_2351

风杰大大_2351

发布时间:2025-11-25 19:11:02

|

941人浏览过

|

来源于php中文网

原创

eBPF是Linux内核级运行时编程框架,可安全插入探针实现系统观测。通过kprobe、uprobe、tracepoint等机制,开发者能监控函数调用、系统调用耗时、内存分配及TCP状态变化。使用BCC工具可用Python快速开发原型,如跟踪openat调用;而生产环境推荐libbpf+CO-RE模式,以C语言编写、编译为BPF对象并加载执行,支持跨内核版本部署。常用探针包括kprobe(内核函数入口)、kretprobe(返回值捕获)、uprobe(用户空间函数)和tracepoint(稳定低开销接口),结合maps实现数据用户态交互,构建高效观测工具。

linux如何使用bpf开发观测工具_linuxebpf探针开发教程

在Linux系统中,BPF(Berkeley Packet Filter)早已超越最初的网络包过滤用途,演变为一个强大的内核级运行时编程框架。通过eBPF,开发者可以在不修改内校代码的前提下,安全地插入探针、收集性能数据、监控系统调用、追踪函数执行等。本文将带你了解如何使用BPF开发基本的系统观测工具。

理解eBPF与观测工具的基础

eBPF允许用户编写一段受限制的C代码,在特定内核事件触发时运行。这些事件包括函数入口/出口(kprobe/uprobe)、定时器、tracepoint、USDT探针等。程序编译后由内核验证安全性,再加载到内核空间执行,结果可通过映射(map)传回用户态进行处理。

常见观测场景包括:

  • 监控某个内核函数被调用的频率
  • 统计进程系统调用耗时
  • 跟踪内存分配行为
  • 分析TCP连接状态变化

要实现这些功能,你不需要重启系统或加载内核模块,只需借助现代工具链如BCC或libbpf + CO-RE即可。

使用BCC快速开发观测脚本

BCC(BPF Compiler Collection)是一套高层工具集,封装了编译、加载、映射交互等复杂流程,适合快速构建Python+eBPF的观测工具。

安装BCC(以Ubuntu为例):

apt-get install bpfcc-tools linux-headers-$(uname -r)

示例:监控openat系统调用次数

from bcc import BPF

eBPF程序

bpf_code = """ int trace_openat(struct pt_regs *ctx) { bpf_trace_printk("openat called\n"); return 0; } """

加载并附加到uprobe

b = BPF(text=bpf_code) b.attach_kprobe(event="sys_openat", fn_name="trace_openat")

打印内核日志

print("Tracing openat... Hit Ctrl-C to end.") try: while True: try: event = b.trace_readline() print(event) except KeyboardInterrupt: break except: pass

这段代码通过kprobe挂接到sys_openat函数入口,每次调用都会打印一行日志。bpf_trace_printk是简单的调试输出方式,适用于原型验证。

使用libbpf和CO-RE构建生产级工具

对于更复杂的场景,推荐使用C语言配合libbpf和CO-RE(Compile Once – Run Everywhere)模型。这种方式生成的程序独立于内核版本,更适合部署。

macOS UI 自动化技能包 —— 用 Python 控制你的 Mac
macOS UI 自动化技能包 —— 用 Python 控制你的 Mac

让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限

下载

基本步骤如下:

  • 编写带SEC段声明的C程序(.bpf.c)
  • 使用clang编译为ELF对象文件
  • 在用户态C程序中用libbpf加载并管理生命周期
  • 通过maps交换数据,例如perf buffer或hash map

示例片段:统计read调用次数

// trace_read.bpf.c #include "vmlinux.h" #include

SEC("kprobe/sys_read") int handle_entry(void *ctx) { __u64 pid_tgid = bpf_get_current_pid_tgid(); bpf_printk("read called by PID: %d\n", pid_tgid >> 32); return 0; }

char LICENSE[] SEC("license") = "GPL";

编译:

clang -O2 -target bpf -c trace_read.bpf.c -o trace_read.bpf.o

然后使用libbpf在宿主程序中加载该对象,并attach探针。

常用探针类型与选择建议

根据观测目标不同,应选择合适的探针机制:

  • kprobe:用于跟踪任意内核函数入口。如do_fork、tcp_v4_connect
  • kretprobe:捕获函数返回值和执行时间
  • uprobe:作用于用户空间程序的函数,比如libc中的malloc
  • tracepoint:稳定接口,开销小,优先选用。路径通常为/sys/kernel/debug/tracing/events/
  • USDT**:用户自定义静态探针,常用于应用层埋点

例如监听TCP连接建立:

b.attach_tracepoint(tp="sock:inet_sock_set_state", fn_name="trace_tcp_state")

此tracepoint会在TCP状态变更时触发,可用于绘制连接生命周期图。

基本上就这些。掌握eBPF的关键在于理解事件驱动模型和数据传递机制。从简单kprobe开始实践,逐步过渡到map聚合、定时采样、跨函数上下文追踪,就能构建出高效的系统观测工具。

热门AI工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

3200

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

269

2026.02.03

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

354

2023.09.25

java中break的作用
java中break的作用

本专题整合了java中break的用法教程,阅读专题下面的文章了解更多详细内容。

3060

2025.10.15

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

827

2025.10.24

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6979

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3345

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

4368

2025.08.29

Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

0

2026.11.02

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn