eBPF 开发实践教程:基于 CO-RE,通过小工具快速上手 eBPF 开发

这是一个基于 CO-RE(一次编译,到处运行)的 eBPF 的开发教程,提供了从入门到进阶的 eBPF 开发实践,包括基本概念、代码实例、实际应用等内容。和 BCC 不同的是,我们使用 libbpf、Cilium、libbpf-rs、eunomia-bpf 等框架进行开发,包含 C、Go、Rust 等语言的示例。

这是一个基于 CO-RE(一次编译,到处运行)的 eBPF 的开发教程,提供了从入门到进阶的 eBPF 开发实践,包括基本概念、代码实例、实际应用等内容。和 BCC 不同的是,我们使用 libbpf、Cilium、libbpf-rs、eunomia-bpf 等框架进行开发,包含 C、Go、Rust 等语言的示例。

本教程不会进行复杂的概念讲解和场景介绍,主要希望提供一些 eBPF 小工具的案例(非常短小,从二十行代码开始入门!),来帮助 eBPF 应用的开发者快速上手 eBPF 的开发方法和技巧。教程内容可以在目录中找到,每个目录都是一个独立的 eBPF 工具案例。

教程关注于可观测性、网络、安全等等方面的 eBPF 示例。完整的代码和教程可以在 https://github.com/eunomia-bpf/bpf-developer-tutorial GitHub 开源仓库中找到。如果您认为本教程对您有所帮助,也请给我们一个 star 鼓励一下!

目录

入门示例

这一部分包含简单的 eBPF 程序示例和介绍。主要利用 eunomia-bpf 框架简化开发,介绍 eBPF 的基本用法和开发流程。

  • lesson 0-introduce eBPF 示例教程 0:核心概念与工具简介
  • lesson 1-helloworld eBPF 入门开发实践教程一:Hello World,基本框架和开发流程
  • lesson 2-kprobe-unlink eBPF 入门开发实践教程二:在 eBPF 中使用 kprobe 监测捕获 unlink 系统调用
  • lesson 3-fentry-unlink eBPF 入门开发实践教程三:在 eBPF 中使用 fentry 监测捕获 unlink 系统调用
  • lesson 4-opensnoop eBPF 入门开发实践教程四:在 eBPF 中捕获进程打开文件的系统调用集合,使用全局变量过滤进程 pid
  • lesson 5-uprobe-bashreadline eBPF 入门开发实践教程五:在 eBPF 中使用 uprobe 捕获 bash 的 readline 函数调用
  • lesson 6-sigsnoop eBPF 入门开发实践教程六:捕获进程发送信号的系统调用集合,使用 hash map 保存状态
  • lesson 7-execsnoop eBPF 入门实践教程七:捕获进程执行事件,通过 perf event array 向用户态打印输出
  • lesson 8-exitsnoop eBPF 入门开发实践教程八:在 eBPF 中使用 exitsnoop 监控进程退出事件,使用 ring buffer 向用户态打印输出
  • lesson 9-runqlat eBPF 入门开发实践教程九:捕获进程调度延迟,以直方图方式记录
  • lesson 10-hardirqs eBPF 入门开发实践教程十:在 eBPF 中使用 hardirqs 或 softirqs 捕获中断事件

高级文档和示例

我们开始构建完整的 eBPF 项目,主要基于 libbpf,并将其与各种应用场景结合起来,以便实际使用。

  • lesson 11-bootstrap eBPF 入门开发实践教程十一:在 eBPF 中使用 libbpf 开发用户态程序并跟踪 exec() 和 exit() 系统调用
  • lesson 12-profile eBPF 入门实践教程十二:使用 eBPF 程序 profile 进行性能分析
  • lesson 13-tcpconnlat eBPF入门开发实践教程十三:统计 TCP 连接延时,并使用 libbpf 在用户态处理数据
  • lesson 14-tcpstates eBPF入门实践教程十四:记录 TCP 连接状态与 TCP RTT
  • lesson 15-javagc eBPF 入门实践教程十五:使用 USDT 捕获用户态 Java GC 事件耗时
  • lesson 16-memleak eBPF 入门实践教程十六:编写 eBPF 程序 Memleak 监控内存泄漏
  • lesson 17-biopattern eBPF 入门实践教程十七:编写 eBPF 程序统计随机/顺序磁盘 I/O
  • lesson 18-further-reading 更多的参考资料:论文、项目等等
  • lesson 19-lsm-connect eBPF 入门实践教程:使用 LSM 进行安全检测防御
  • lesson 20-tc eBPF 入门实践教程二十:使用 eBPF 进行 tc 流量控制
  • lesson 21-xdp eBPF 入门实践教程二十一: 使用 XDP 进行可编程数据包处理

深入主题

这一部分涵盖了与 eBPF 相关的高级主题,包括在 Android 上使用 eBPF 程序、利用 eBPF 程序进行的潜在攻击和防御以及复杂的追踪。结合用户模式和内核模式的 eBPF 可以带来强大的能力(也可能带来安全风险)。

GPU:

持续更新中...

推荐书籍:《深入理解 eBPF 与可观测性》

在当今云原生、人工智能和大模型迅猛发展的时代,理解和优化操作系统性能变得尤为重要。龙蜥社区多位资深专家历时两年,联袂打造业内首本系统性穿透 Linux 内核观测技术指南——《深入理解 eBPF 与可观测性》。

本书不仅深入剖析了 eBPF 的底层原理和开发框架,结合了网络、内存、I/O、调度等六大领域,提供了原理和代码级的深度解析,包含了丰富的生产级实践代码,助力读者快速掌握 eBPF 技术,应用于网络流量分析、故障排查、性能调优等实际场景。

无论是内核开发者、运维工程师、eBPF 技术爱好者,还是可观测领域、操作系统领域专家,这本书都将成为您洞悉 Linux 系统的必备武器。

书籍推荐

欢迎关注我们的微信公众号,获取更多 eBPF 相关的技术文章、教程更新和社区动态!

微信公众号

eBPF 示例教程 0:核心概念与工具简介

这是一个全面的 eBPF 开发教程的第一部分,旨在通过实用的 eBPF 开发指导您从初学者到高级用户。它涵盖了基本概念、实际代码示例以及在现代系统中的应用。我们将不再专注于传统工具如 BCC,而是使用现代框架如 libbpf、Cilium、libbpf-rs 和 eunomia-bpf,并提供 C、Go 和 Rust 的示例。

eBPF 入门开发实践教程一:Hello World,基本框架和开发流程

在本篇博客中,我们将深入探讨eBPF(Extended Berkeley Packet Filter)的基本框架和开发流程。eBPF是一种在Linux内核上运行的强大网络和性能分析工具,它为开发者提供了在内核运行时动态加载、更新和运行用户定义代码的能力。这使得开发者可以实现高效、安全的内核级别的网络监控、性能分析和故障排查等功能。

eBPF 入门开发实践教程二:在 eBPF 中使用 kprobe 监测捕获 unlink 系统调用

eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具。它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。

eBPF 入门开发实践教程三:在 eBPF 中使用 fentry 监测捕获 unlink 系统调用

eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具。它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。

eBPF 入门开发实践教程四:在 eBPF 中捕获进程打开文件的系统调用集合,使用全局变量过滤进程 pid

eBPF(Extended Berkeley Packet Filter)是一种内核执行环境,它可以让用户在内核中运行一些安全的、高效的程序。它通常用于网络过滤、性能分析、安全监控等场景。eBPF 之所以强大,是因为它能够在内核运行时捕获和修改数据包或者系统调用,从而实现对操作系统行为的监控和调整。

eBPF 入门开发实践教程五:在 eBPF 中使用 uprobe 捕获 bash 的 readline 函数调用

eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具,它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。

eBPF 入门开发实践教程六:捕获进程发送信号的系统调用集合,使用 hash map 保存状态

eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具,它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。

eBPF 入门实践教程七:捕获进程执行事件,通过 perf event array 向用户态打印输出

eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具,它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。

eBPF 入门开发实践教程八:在 eBPF 中使用 exitsnoop 监控进程退出事件,使用 ring buffer 向用户态打印输出

eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具。它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。

eBPF 入门开发实践教程九:捕获进程调度延迟,以直方图方式记录

eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具。它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。

eBPF 入门开发实践教程十:在 eBPF 中使用 hardirqs 或 softirqs 捕获中断事件

eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具。它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。

eBPF 入门开发实践教程十一:在 eBPF 中使用 libbpf 开发用户态程序并跟踪 exec() 和 exit() 系统调用

eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具。它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。

eBPF 入门实践教程十二:使用 eBPF 程序 profile 进行性能分析

本教程将指导您使用 eBPF 程序和 Rust 实现进行性能分析。我们将利用内核中的 perf 机制,学习如何捕获函数的执行时间以及如何查看性能数据。

eBPF入门开发实践教程十三:统计 TCP 连接延时,并使用 libbpf 在用户态处理数据

eBPF (Extended Berkeley Packet Filter) 是一项强大的网络和性能分析工具,被应用在 Linux 内核上。eBPF 允许开发者动态加载、更新和运行用户定义的代码,而无需重启内核或更改内核源代码。

eBPF入门实践教程十四:记录 TCP 连接状态与 TCP RTT

eBPF (扩展的伯克利数据包过滤器) 是一项强大的网络和性能分析工具,被广泛应用在 Linux 内核上。eBPF 使得开发者能够动态地加载、更新和运行用户定义的代码,而无需重启内核或更改内核源代码。

eBPF 入门实践教程十五:使用 USDT 捕获用户态 Java GC 事件耗时

eBPF (扩展的伯克利数据包过滤器) 是一项强大的网络和性能分析工具,被广泛应用在 Linux 内核上。eBPF 使得开发者能够动态地加载、更新和运行用户定义的代码,而无需重启内核或更改内核源代码。这个特性使得 eBPF 能够提供极高的灵活性和性能,使其在网络和系统性能分析方面具有广泛的应用。此外,eBPF 还支持使用 USDT (用户级静态定义跟踪点) 捕获用户态的应用程序行为。

eBPF 入门实践教程十六:编写 eBPF 程序 Memleak 监控内存泄漏

eBPF(扩展的伯克利数据包过滤器)是一项强大的网络和性能分析工具,被广泛应用在 Linux 内核上。eBPF 使得开发者能够动态地加载、更新和运行用户定义的代码,而无需重启内核或更改内核源代码。

eBPF 入门实践教程十七:编写 eBPF 程序统计随机/顺序磁盘 I/O

eBPF(扩展的伯克利数据包过滤器)是 Linux 内核中的一种新技术,允许用户在内核空间中执行自定义程序,而无需更改内核代码。这为系统管理员和开发者提供了强大的工具,可以深入了解和监控系统的行为,从而进行优化。

eBPF 运行时安全性:面临的挑战与前沿创新

扩展伯克利数据包过滤器(eBPF)代表了我们与现代操作系统交互和扩展其能力方式的重大演变。作为一种强大的技术,它使得Linux内核能够响应事件运行沙盒程序,eBPF已成为系统可观察性、网络和安全特性的基石。

更多的参考资料:论文、项目等等

- 一个关于 eBPF 相关内容和信息的详细列表:<https://github.com/zoidbergwill/awesome-ebpf - eBPF 相关项目、教程:<https://ebpf.io/

eBPF 入门实践教程:使用 LSM 进行安全检测防御

eBPF (扩展的伯克利数据包过滤器) 是一项强大的网络和性能分析工具,被广泛应用在 Linux 内核上。eBPF 使得开发者能够动态地加载、更新和运行用户定义的代码,而无需重启内核或更改内核源代码。这个特性使得 eBPF 能够提供极高的灵活性和性能,使其在网络和系统性能分析方面具有广泛的应用。安全方面的 eBPF 应用也是如此,本文将介绍如何使用 eBPF LSM(Linux Security Modules)机制实现一个简单的安全检

eBPF 入门实践教程二十:使用 eBPF 进行 tc 流量控制

Linux 的流量控制子系统(Traffic Control, tc)在内核中存在了多年,类似于 iptables 和 netfilter 的关系,tc 也包括一个用户态的 tc 程序和内核态的 trafiic control 框架,主要用于从速率、顺序等方面控制数据包的发送和接收。从 Linux 4.1 开始,tc 增加了一些新的挂载点,并支持将 eBPF 程序作为 filter 加载到这些挂载点上。

eBPF 入门实践教程二十一: 使用 XDP 进行可编程数据包处理

在本教程中,我们将介绍 XDP(eXpress Data Path),并通过一个简单的例子帮助你入门。之后,我们将探讨更高级的 XDP 应用,例如负载均衡器、防火墙及其他实际应用。如果你对 eBPF 或 XDP 感兴趣,请在 Github 上为我们点赞!

在 Android 上使用 eBPF 程序

本文主要记录了笔者在 Android Studio Emulator 中测试高版本 Android Kernel 对基于 libbpf 的 CO-RE 技术支持程度的探索过程、结果和遇到的问题。 测试采用的方式是在 Android Shell 环境下构建 Debian 环境,并基于此尝试构建 eunomia-bpf 工具链、运行其测试用例。

通过 eBPF socket filter 或 syscall trace 追踪 HTTP 请求等七层协议 - eBPF 实践教程

在当今的技术环境中,随着微服务、云原生应用和复杂的分布式系统的崛起,系统的可观测性已成为确保其健康、性能和安全的关键要素。特别是在微服务架构中,应用程序的组件可能分布在多个容器和服务器上,这使得传统的监控方法往往难以提供足够的深度和广度来全面了解系统的行为。这就是为什么观测七层协议,如 HTTP、gRPC、MQTT 等,变得尤为重要。

eBPF 开发实践:使用 eBPF 隐藏进程或文件信息

eBPF(扩展的伯克利数据包过滤器)是 Linux 内核中的一个强大功能,可以在无需更改内核源代码或重启内核的情况下,运行、加载和更新用户定义的代码。这种功能让 eBPF 在网络和系统性能分析、数据包过滤、安全策略等方面有了广泛的应用。

eBPF 入门实践教程:用 bpfsendsignal 发送信号终止恶意进程

eBPF (扩展的伯克利数据包过滤器) 是 Linux 内核的一种革命性技术,允许用户在内核空间执行自定义程序,而不需要修改内核源代码或加载任何内核模块。这使得开发人员可以非常灵活地对 Linux 系统进行观测、修改和控制。

eBPF 教程: 文件操纵实现 sudo 权限提升

eBPF 的能力远不止简单的跟踪——它可以实时修改流经内核的数据。虽然这种能力为性能优化和安全监控提供了创新解决方案,但它也为传统安全工具可能遗漏的复杂攻击向量打开了大门。本教程演示了其中一种技术:使用 eBPF 通过操纵 sudo 读取 /etc/sudoers 时看到的内容,向非特权用户授予 root 访问权限。

eBPF 教程: 替换任意程序读取或者写入的文本

当你在 Linux 中读取文件时,你相信所看到的内容与磁盘上存储的内容一致。但如果内核本身在对你撒谎呢?本教程演示了 eBPF 程序如何拦截文件读取操作并在应用程序看到文本之前悄悄替换文本——为防御性安全监控和攻击性 rootkit 技术创造了强大的能力。

在应用程序退出后运行 eBPF 程序:eBPF 程序的生命周期

eBPF(Extended Berkeley Packet Filter)是 Linux 内核中的一项重大技术创新,允许用户在内核空间中执行自定义程序,而无需修改内核源代码或加载任何内核模块。这为开发人员提供了极大的灵活性,可以观察、修改和控制 Linux 系统。

eBPF 开发实践:使用 sockops 加速网络请求转发

eBPF(扩展的伯克利数据包过滤器)是 Linux 内核中的一个强大功能,可以在无需更改内核源代码或重启内核的情况下,运行、加载和更新用户定义的代码。这种功能让 eBPF 在网络和系统性能分析、数据包过滤、安全策略等方面有了广泛的应用。

eBPF 实践教程:使用 uprobe 捕获多种库的 SSL/TLS 明文数据

随着TLS在现代网络环境中的广泛应用,跟踪微服务RPC消息已经变得愈加棘手。传统的流量嗅探技术常常受限于只能获取到加密后的数据,导致无法真正观察到通信的原始内容。这种限制为系统的调试和分析带来了不小的障碍。

eBPF 实践教程:使用 eBPF 跟踪 Go 协程状态

Go 是 Google 创建的一种广受欢迎的编程语言,以其强大的并发模型而著称。Go 语言的一个重要特点是协程(goroutine)的使用——这些协程是轻量级、由 Go 运行时管理的线程,使得编写并发程序变得非常简单。然而,在实时环境中理解和跟踪这些协程的执行状态,尤其是在调试复杂系统时,可能会面临很大的挑战。

eBPF 开发实践教程:示例 32 - 结合 On-CPU 和 Off-CPU 分析的挂钟时间分析

性能瓶颈可能隐藏在两个截然不同的地方。你的代码可能在热循环中消耗 CPU 周期,也可能在空闲地等待 I/O、网络响应或锁竞争。传统的性能分析工具通常只关注故事的一面。但如果你能同时看到两者呢?

使用 eBPF 测量函数延迟

在现代软件系统中,了解函数的性能特性,尤其是那些对应用程序运行至关重要的函数的性能特性,是至关重要的。性能分析中的一个关键指标是函数延迟,即函数从开始到完成所花费的时间。通过分析函数延迟,开发人员可以识别瓶颈、优化性能,并确保系统在各种条件下高效运行。

eBPF 开发实践:使用 eBPF 修改系统调用参数

eBPF(扩展的伯克利数据包过滤器)是 Linux 内核中的一个强大功能,可以在无需更改内核源代码或重启内核的情况下,运行、加载和更新用户定义的代码。这种功能让 eBPF 在网络和系统性能分析、数据包过滤、安全策略等方面有了广泛的应用。

eBPF开发实践:使用 user ring buffer 向内核异步发送信息

eBPF,即扩展的Berkeley包过滤器(Extended Berkeley Packet Filter),是Linux内核中的一种革命性技术,它允许开发者在内核态中运行自定义的“微程序”,从而在不修改内核代码的情况下改变系统行为或收集系统细粒度的性能数据。

用户空间 eBPF 运行时:深度解析与应用实践

本文旨在对用户空间的 eBPF 运行时和对应的一些应用场景进行剖析和总结。尽管大多数人对基于内核的 eBPF 已有所了解,用户空间 eBPF 的进展和应用实践同样引人注目。本文还将探讨用户空间 eBPF 运行时与 Wasm 运行时的技术比较,后者在云原生和边缘计算领域已获得广泛的关注。我们也新开源了一个用户态 eBPF 运行时 bpftime。通过 LLVM JIT/AOT 后端支持,我们的基准测试表明 bpftime 是最快的用户空间

eBPF 实践:使用 Uprobe 追踪用户态 Rust 应用

eBPF,即扩展的Berkeley包过滤器(Extended Berkeley Packet Filter),是Linux内核中的一种革命性技术,它允许开发者在内核态中运行自定义的“微程序”,从而在不修改内核代码的情况下改变系统行为或收集系统细粒度的性能数据。

借助 eBPF 和 BTF,让用户态也能一次编译、到处运行

在现代 Linux 系统中,eBPF(扩展的 Berkeley Packet Filter)是一项强大而灵活的技术。它允许在内核中运行沙盒化程序,类似于虚拟机环境,为扩展内核功能提供了一种既安全又不会导致系统崩溃或安全风险的方法。

using BTF to verify userspace eBPF extensions

Here we will show how to use the type information of userspace application to verify the eBPF program which will access the userspace memory(include valid or invalid data structure memory access, pointer access, etc), an

使用 eBPF 跟踪 Nginx 请求

Nginx 是世界上最流行的 Web 服务器和反向代理之一,以其高性能、稳定性和低资源消耗而闻名。它广泛用于提供静态内容、负载均衡以及作为动态应用的反向代理。为了保持其性能优势,监控和优化 Nginx 的运行尤为重要,尤其是在处理大量请求时。利用 eBPF(扩展的伯克利包过滤器),可以深入了解 Nginx 的性能表现,识别瓶颈并进行优化,而无需修改源代码或重启服务。

使用 eBPF 跟踪 MySQL 查询

MySQL 是全球最广泛使用的关系型数据库管理系统之一。无论您是在运行小型应用程序还是大型企业系统,了解 MySQL 数据库的性能特征都至关重要。特别是了解 SQL 查询的执行时间以及哪些查询占用了最多的时间,有助于诊断性能问题,并优化数据库以提高效率。

eBPF 示例教程:使用 XDP 捕获 TCP 信息

扩展伯克利包过滤器(eBPF)是 Linux 内核中的一项革命性技术,允许开发者在内核空间内运行沙箱程序。它提供了强大的网络、安全和跟踪能力,无需修改内核源代码或加载内核模块。本教程重点介绍如何使用 eBPF 结合 Express Data Path(XDP),在数据包进入时的最早阶段直接捕获 TCP 头信息。

Network setup for bpf-developer-tutorial

In this tutorial, we will set up a simple network topology that simulates a load balancer using eBPF/XDP (Express Data Path). The setup includes a local machine, a load balancer (which can be enhanced with an XDP program

eBPF 开发者教程: 简单的 XDP 负载均衡器

在本教程中,我们将指导您如何使用eBPF(扩展的Berkeley Packet Filter)实现一个简单的XDP(eXpress Data Path)负载均衡器。只需使用C语言和libbpf库,无需外部依赖,这是一个适合开发者的实践指南,帮助您充分利用Linux内核的强大功能来构建高效的网络应用程序。

超越 eBPF 的极限:在内核模块中定义自定义 kfunc

你是否曾经觉得 eBPF 的能力有限?也许你遇到了现有 eBPF 功能无法实现目标的情况。或许你需要与内核进行更深层次的交互,或者标准 eBPF 运行时无法解决的性能问题。如果你曾经希望在 eBPF 程序中拥有更多的灵活性和强大功能,那么本教程正适合你。

eBPF 教程:BPF 调度器入门

欢迎来到我们深入探讨 eBPF 世界的教程,本教程将重点介绍 BPF 调度器!如果你希望将 eBPF 知识扩展到基础之外,你来对地方了。在本教程中,我们将探索 scxsimple 调度器,这是 Linux 内核版本 6.12 中引入的 schedext 调度类的一个最小示例。我们将带你了解其架构,如何利用 BPF 程序定义调度行为,并指导你编译和运行示例。到最后,你将对如何使用 eBPF 创建和管理高级调度策略有一个坚实的理解。

eBPF 示例教程:实现 scxnest 调度器

在系统性能优化不断发展的领域中,自定义和扩展内核行为的能力是非常宝贵的。实现这一目标的最强大工具之一是 eBPF(扩展的 Berkeley 包过滤器)。在本教程中,我们将探讨 scxnest 调度器的实现,这是一个先进的 eBPF 程序,利用了在 Linux 内核版本 6.12 中引入的 schedext 调度器类。在本指南结束时,您将了解如何构建一个复杂的调度器,该调度器根据 CPU 核心频率和利用率动态调整任务分配。

eBPF 实例教程:构建高性能 XDP 数据包生成器

需要对网络栈进行压力测试或测量 XDP 程序性能吗?传统的数据包生成器如 pktgen 需要内核模块或在用户态运行,开销很大。有更好的方法 - XDP 的 BPFPROGRUN 功能让你可以直接从用户态向内核快速路径注入数据包,速度可达每秒数百万包,而且不需要加载网络驱动。

eBPF 教程:追踪 CUDA GPU 操作

你是否曾经想知道CUDA应用程序在运行时底层发生了什么?GPU操作由于发生在具有独立内存空间的设备上,因此调试和性能分析变得极为困难。在本教程中,我们将构建一个强大的基于eBPF的追踪工具,让你实时查看CUDA API调用。

eBPF 教程:进程级能源监控与功耗分析

您是否想过应用程序到底消耗了多少能源?在数据中心和边缘设备中,能源效率正变得愈发重要,深入了解进程级别的功耗已成为系统优化的关键。本教程将带您构建一个基于 eBPF 的能源监控工具,它能以极低的系统开销实时洞察进程的功耗情况。

eBPF 教程:无需内核补丁修复故障的 HID 设备

你是否遇到过这样的情况:插入新鼠标或绘图板后发现在 Linux 上无法正常工作?也许 Y 轴反了,按钮映射错了,或者设备感觉完全坏了。传统的解决方法需要编写内核驱动,等待数周的审查,然后希望你的发行版能在明年某个时候提供这个修复。到那时,你可能已经买了另一个设备。

bpftrace一行教程

该教程通过12个简单小节帮助你了解bpftrace的使用。每一小节都是一行的命令,你可以尝试运行并立刻看到运行效果。该教程系列用来介绍bpftrace的概念。关于bpftrace的完整参考,见bpftrace手册。

eBPF 实例教程:基于 cgroup 的策略控制

你是否需要对容器或特定进程组实施网络访问控制,但又不想影响整个系统?或者你需要限制某些进程访问特定设备,同时允许其他进程正常使用?传统的 iptables 和设备权限是全局生效的,无法做到按进程组精细控制。

eBPF 实例教程:BPF Arena 零拷贝共享内存

你是否曾经尝试在 eBPF 中构建链表,却不得不使用笨拙的整数索引而不是真正的指针?或者需要在内核 BPF 程序和用户空间之间共享大量数据,却受困于昂贵的系统调用?传统的 BPF map 强制你绕过指针限制,并且每次访问都需要系统调用。如果你可以使用普通的 C 指针,并在内核和用户空间之间实现直接内存访问会怎样?

eBPF 教程:BPF 迭代器用于内核数据导出

你是否曾经尝试监控数百个进程,却不得不解析数千个 /proc 文件,只为找到你关心的几个进程?或者需要自定义格式的内核数据,但不想修改内核本身?传统的 /proc 文件系统访问速度慢、不灵活,即使你只需要一小部分过滤后的数据,也会强制你在用户空间处理大量数据。

eBPF 教程:BPF 工作队列用于异步可睡眠任务

你是否曾经需要你的 eBPF 程序睡眠、分配内存或等待设备 I/O?传统的 eBPF 程序在受限的上下文中运行,阻塞操作会导致系统崩溃。但是,如果你的 HID 设备需要在注入的按键事件之间进行时序延迟,或者你的清理例程需要在释放资源时睡眠怎么办?

eBPF 实例教程:BPF 动态指针处理可变长度数据

你是否曾经在编写 eBPF 包解析器时,被那些冗长的 dataend 边界检查搞得焦头烂额,而验证器仍然拒绝通过?是否尝试过用 ring buffer 发送可变长度事件,却发现自己只能用固定大小的结构体?传统的 eBPF 开发要求你在编译时静态证明内存安全性,当处理运行时才能确定的大小(比如包长度或用户配置的快照长度)时就会变得非常痛苦。

eBPF 教程:使用 BPF structops 扩展内核子系统

你是否想过扩展内核行为——比如添加自定义调度器、网络协议或安全策略——却因为编写和维护内核模块的复杂性而望而却步?如果你可以直接用 eBPF 定义这些逻辑,实现动态更新、安全执行和可编程控制,同时无需重新编译内核或担心系统稳定性呢?

eBPF 开发实践教程:基于 CO-RE,通过小工具快速上手 eBPF 开发

这是一个基于 CO-RE(一次编译,到处运行)的 eBPF 的开发教程,提供了从入门到进阶的 eBPF 开发实践,包括基本概念、代码实例、实际应用等内容。和 BCC 不同的是,我们使用 libbpf、Cilium、libbpf-rs、eunomia-bpf 等框架进行开发,包含 C、Go、Rust 等语言的示例。

eBPF 示例:使用 CUPTI 构建 GPU 火焰图分析器

您是否曾想过,您的哪部分 CPU 代码负责启动特定的 GPU 内核?CPU 分析器可以向您显示主机端的调用堆栈,但一旦工作移交给 GPU,它们就会失去可见性。另一方面,GPU 分析器详细说明了设备上发生的情况,但通常不会将其链接回启动它的特定 CPU 函数。这就产生了一个盲点,使得回答一个关键问题变得困难:“我的哪行代码导致了这个缓慢的GPU内核运行?”

eBPF 实例教程:使用内核跟踪点监控 GPU 驱动活动

当游戏卡顿或机器学习训练变慢时,答案就隐藏在 GPU 内核驱动内部。Linux 内核跟踪点暴露了实时的作业调度、内存分配和命令提交数据。与周期性采样并错过事件的用户空间分析工具不同,内核跟踪点以纳秒级时间戳和最小开销捕获每个操作。

eBPF 实例教程:跟踪 Intel NPU 内核驱动操作

神经处理单元(NPU)是 AI 加速的下一个前沿 - 直接内置于现代 CPU 中,无需消耗 GPU 功耗预算即可处理机器学习工作负载。Intel 的 Lunar Lake 和 Meteor Lake 处理器集成了专用 NPU 硬件,但当 AI 模型运行缓慢、推理失败或内存分配崩溃时,调试几乎不可能。NPU 驱动是一个黑盒,固件通信不透明,用户空间 API 隐藏了内核中真正发生的事情。

最后更新
2026年3月6日
首次发布
2023年8月10日
贡献者
yunwei37, github-actions[bot], 云微, oluceps

这个页面有帮助吗?