LWN:用BPF异步采集stack trace!

eBPF 内存泄露检测原理 详细介绍 eBPF 开发内存泄露检测工具的原理 阅读详情

关注了就能看到更多这么棒的文章哦~

Capturing stack traces asynchronously with BPF

By Daroc Alden
June 19, 2024
LSFMM+BPF
Gemini-1.5-flash translation
https://lwn.net/Articles/978736/

Andrii Nakryiko 在 2024 年的 Linux 存储、文件系统、内存管理和 BPF 峰会 (Linux Storage, Filesystem, Memory Management, and BPF Summit) 上主持了一场会议,介绍了使用 BPF 捕获堆栈跟踪的 API,以及如何使这些 API 更实用。BPF 程序可以捕获正在运行的进程的当前堆栈跟踪(stack trace),包括系统调用执行中位于内核的部分,这对于诊断性能问题等非常有用。但现有的 API 存在一些重大问题。

获取 BPF 中堆栈跟踪的现有方法是创建一个用于保存 trace 的元素的 BPF 映射(map),然后从 BPF 端调用 bpf_get_stackid() ,该函数返回此映射的唯一 ID,Nakryiko 解释道。然后,在用户空间中,程序可以进行正常的映射查找从而来检索堆栈跟踪。内核还捕获并存储一些相关信息,例如 ELF 构建 ID 和文件偏移量,这有助于确定堆栈跟踪对应于哪个程序,以便进行离线分析。他表示,这个 API 听起来相当简单,但不幸的是它有一些麻烦之处。

它可以捕获用户空间堆栈跟踪或内核堆栈跟踪,但不能同时捕获两者。内核支持捕获两者,只是 BPF API 无法表达出想同时要两者,Nakryiko 说。此外,也无法知道实际捕获的堆栈有多大;程序员只能希望他们的堆栈展开代码在正确的位置停止。这都是缺陷,但不是大问题,因为没有人抱怨过。

最后一个麻烦是内核会自动执行堆栈去重。如果捕获的堆栈跟踪与现有的堆栈跟踪匹配,内核将返回现有 ID。这种行为在理论上听起来很棒,因为去重可以节省空间,但用于存储堆栈跟踪的映射没有处理哈希冲突的逻辑。堆栈跟踪会被哈希并放置到映射中相应的位置,但每个位置只能容纳一个堆栈跟踪。因此,哈希冲突(哈希相同但实际上 trace 内容不同)在捕获大量堆栈跟踪时既频繁又不可避免。API 允许程序员指定在冲突时保留旧堆栈跟踪还是新堆栈跟踪,但这只是给他们留下了两个糟糕的选择:丢失数据或损坏数据。基于哈希的堆栈去重还使得清除映射中的条目产生了天生的竞争冲突。

Nakryiko 提出的新 API 通过让 BPF 程序处理内存管理来解决这些问题:它提供一个缓冲区,内核在其中捕获堆栈跟踪,然后 BPF 程序可以自由地以对应用程序最有意义的方式与用户空间共享该缓冲区。他指出,Meta 的所有用例(除一个外)都已切换到新的 API。但是,仍然有一些潜在的改进空间。目前,堆栈是同步捕获的。这是一个问题,因为 API 可以从任何地方调用,包括不允许出现页面错误(page fault)的上下文中。

如果正在检查的程序的一部分被换出(paged out),这意味着存储在这些页面上的信息可能无法被采集到。这只会影响用户空间堆栈跟踪,因为内核始终保持在内存中。这对使用基于 DWARF 的堆栈展开的程序来说是一个特殊问题,因为当进行捕获时,DWARF 调试信息不太可能存在于内存中。

Nakryiko 希望新的 API 是异步的,以便它可以等待必要的(供用户空间捕获)信息被换入。但是,这对 /kernel/ 堆栈跟踪不起作用,因为内核无法像用户空间那样暂停下来等待。另一方面,在内核返回用户空间之前,捕获用户空间堆栈跟踪可以被推迟而不会改变返回的信息,因为进程直到那时才会被冻结。他说,“返回用户空间”是一个很好的上下文,因为内核可以等待内存被换入等等。

所有这些单独的约束在提出的 API 设计中被汇集起来。Nakryiko 建议使用一个函数返回堆栈跟踪的唯一 ID。ID 就像是预留的一样——它是稳定的,可以被记录、传递给用户空间等等。一旦收到 ID,就会将堆栈跟踪捕获到保留的缓冲区中。内核跟踪是同步捕获的,但用户空间跟踪是在返回用户空间时捕获的。在相应映射中查找堆栈捕获将返回 EAGAIN ,直到捕获内容准备好。内核不会执行去重,使得删除元素以一种合理的方式工作。一位观众询问这是否意味着可能存在具有不同 ID 的相同堆栈跟踪,Nakryiko 确认情况确实如此。Daniel Borkmann 指出,如果操作是异步的,那么也可以扩展映射本身,而现有的 API 无法做到这一点。

Nakryiko 说,API 的一部分还没有想好:如何让用户知道堆栈跟踪何时准备好。他说,最简单的解决方案是不发送通知,而是强制用户轮询。稍微复杂一些的是,每当任何跟踪准备好时,都会发出映射范围的 epoll 通知。或者,映射中的每个槽位都可以有单独的 epoll 通知——但这将是浪费文件描述符。最后,最有效的方法是建立一个 BPF 环形缓冲区,将 ID 放入其中,以便在它们准备好时进行有效的通知和消费。

一位观众指出,Nakryiko 基本上描述了 io_uring 背后的机制,并建议说这可能是最合适的机制。Nakryiko 对 io_uring 是否适合不太确定,但承认了这种可能性。另一位观众询问他们是否可以将可扩展的环形缓冲区放入 BPF arena 中。Nakryiko 认为这不会有帮助,因为 BPF 子系统中已经有很多环形缓冲区,在 arena 中重新实现一个不会真正起到帮助。他确实注意到,如果他们切换到将整个堆栈跟踪放入环形缓冲区,他们就可以在环形缓冲区中包含丢弃通知(drop notification)。

Yu 指出,API 可以使用回调而不是通知:在完成时运行另一个 BPF 程序,并让用户决定如何通知用户空间。这引发了关于不同机制的长时间讨论,以及它们如何在灵活性与简单性之间权衡。Nakryiko 确实说他不赞成试图将太多功能从内核中移出的机制,因为内核已经对堆栈跟踪有良好的内置支持。一个例子是用户空间返回探测如何破坏堆栈跟踪——内核拥有所有必要的信息来修复这个问题,而更灵活的机制只会把这个工作推给用户。

在会议时间结束之前,讨论没有得出明确的结论,但内核中 BPF 及其他地方已经有很多机制用于在操作完成时通知用户空间,因此这似乎不太可能成为 API 设计的症结所在。考虑到 BPF 与 BPF 类型格式 (BTF, BPF Type Format) 的紧密集成以及对内核和用户空间中跟踪点(tracepoints)的支持,BPF 已经具有相当好的调试支持;看起来一些正在进行的工作可以帮助进一步扩展这种支持。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

832c1288a2fd54040a1599b2ac6af59f.jpeg

Capturing stack traces asynchronously with BPF Andrii Nakryiko在2024年Linux峰会上提出改进BPF堆栈跟踪API的方案。现有API存在三大缺陷:1)无法同时捕获用户态和内核态堆栈;2)无法获知捕获的堆栈大小;3)基于哈希的去重机制导致数据丢失或损坏。新提案让BPF程序自主管理内存,将堆栈捕获到指定缓冲区,并支持异步操作(用户态堆栈在内核返回时捕获)。目前Meta已基本采用新API,但关键问题仍未解决:如何高效通知用户态堆栈准备就绪。会议讨论了多种方案,包括轮询、epoll通知和环形缓冲区等。虽然未达成最终结论,但新设计将显著提升BP 阅读详情

相关推荐

A look at what‘s possible with BPF arenas

BPF arena是一种内存区域,允许在BPF中编写任意数据结构,验证器在此可以更宽松地检查指针。在2025年的Linux峰会上,Emil Tsalapatis报告了其在编写sched_ext调度器时使用arena的经验。尽管整体上对arena感到满意,但他指出最大的问题是内核指针无法存储在arena中,这限制了其使用。目前,开发者需要将数据结构分为两部分存储:一部分在arena中,另一部分在BPF map中,以持有内核对象的引用。这种分割虽然可行,但降低了arena的便利性。Tsalapatis希望BPF

mounter625的专栏 849

bcc:调用栈采集的学习和使用

栈的ebpf

BuildUp 1758

Android13配置selinux让system应用可读sys,proc,SN号

Android13预置的system应用,需要读/sys, /proc目录,读(SN)serial number号, 需要修改selinux配置,否则会报avc错.其修改方法会比Android11复杂一些.。

zmlovelx(帅得不敢出门 程序员群31843264) 2654

Linux 内核观测技术BPF

BPF允许任何人在Linux内核之中执行任意的代码,这听起来的十分危险,但是由于有着使得这一过程变的相当的安全。BPF时内核的一个模块,所有的BPF程序都必须经过它的审查才能够被加载到内核之中去运行。验证器执行的就是对BPF虚拟机加载的代码进行。这一步的目的是保证程序可以按照预期去结束,而不会产生死循环拜拜浪费系统资源。验证器会创建一个DAG(有向无环图),将BPF程序的每个执行首位相连之后去执行DFS(深度优先遍历),当且仅当每个路径都能达到DAG的底部才会通过验证。之后其会执行。

0 error(s) 3353

OpenVPN 新增 windows 客户端

虚拟私人网络(Virtual Private Network,简称VPN)是一种网络技术,它允许用户通过公共网络(如互联网)建立一个安全的连接通道。本文介绍如何添加 windows 客户端。

利昂的技术存档 3765

使用SSE流式输出(Javaweb前后端实战)

SSE(Server-Sent Events)是一种在Web应用中实现单向实时通信的技术。通过SSE,服务器可以主动向客户端发送更新,而无需客户端不断发起请求。这对于需要实时更新的应用场景(如聊天应用、实时数据监控等)非常有用。(服务端单向传输客户端,长连接)

记得开心一点嘛的博客 1万+

ebpf_bcc_tools之stacksnoop(跟踪进程指定内核函数堆栈调用信息)

ebpf实用案例之跟踪进程指定内核函数堆栈调用信息

ljbcharles的专栏 1637

微信小程序网关逆向分析:从协议、签名到会话管理的安全架构剖析

在现代Web与移动应用开发中,API网关作为客户端与后端服务之间的关键通信枢纽,承担着协议转换、流量调度、安全防护与性能优化等核心职责。其工作原理通常涉及统一的请求路由、身份认证、参数校验与响应聚合。从技术价值看,深入理解网关机制不仅能帮助开发者构建更健壮、可扩展的微服务架构,还能为安全评估、性能调优与故障排查提供基础。在移动生态如微信小程序中,网关设计尤为关键,它需要处理微信特有的登录态、数据加密与防重放攻击等安全需求。本文聚焦于微信小程序网关的逆向分析方法,通过结合网络抓包与代码反编译技术,深入解析其通

weixin_29323493的博客 442

eBPF 函数调用中的一些常用标志

这些标志主要用于在不同的 eBPF 函数调用中指定额外的操作选项。

CeerDecy的博客 1107

摄像头visio_最全面弱电智能VISIO图标集(百个),高大上方案就靠这个了

原标题:最全面弱电智能VISIO图标集(百个),高大上方案就靠这个了不会用Visio,Visio画拓扑画的很丑,怎么办?本期sin66小编免费分享一份最全面的弱电智能VISIO图标集(百个)给大家,以后画拓扑、做方案,直接高大上起来!需要本期资料直接看文末!!接下来我们一起看一下这些Visio图标大全:我们从下图可以看出前端设备主要是由枪机,筒机,无线摄像头,半球,球机,USB摄像头等构成,对于绘...

weixin_39644915的博客 1万+

多传感器融合SLAM指南:如何结合视觉与激光雷达提升建图精度

本文深入探讨了多传感器融合SLAM技术,详细解析了如何将视觉传感器与激光雷达(特别是3D激光雷达)进行深度融合以提升建图精度与鲁棒性。文章从传感器特性分析、数据同步标定、前端融合策略(松耦合与紧耦合)到后端优化与地图构建,提供了完整的实战指南,并重点介绍了V-LOAM等经典融合框架的核心思想,旨在帮助开发者构建适应复杂动态环境的高精度SLAM系统。

weixin_29056145的博客 535

《BPF( 伯克利数据包过滤器 ) Performance Tools》 第二章 技术背景

下图是Sasha Goldshtein用户态预定义静态跟踪(user-level statically defined tracing, USDT)提供了一个用户空间版的跟踪点机制。BCC的USDT支持是Sasha Goldshtein实现的,bpfrace的USDT支持是由笔者和Matheus Marchini完成的。用户态的软件有很多与跟踪和日志相关的技术,而且许多应用程序自身也内置了自定义的事件日志系统,可以根据需要随时开启。USDT与众不同之处在于,它依赖于外部的系统跟踪器来唤起。

weixin_55255438的博客 2478

【Python机器学习】零基础掌握TweedieRegressor广义线性回归模型

本次文章主要介绍了如何使用Tweedie回归模型预测电动汽车的实际续航里程。基于车速、气温和驾驶习惯等多种因素,模型能够准确地预测出电动汽车的续航里程,从而为生产商和消费者提供有用的信息。优点总结,Tweedie回归模型在处理具有多元性和高度散布的数据方面表现出色,特别适用于需要考虑多种影响因素的预测任务。优点名称对应描述说明多元性强可以同时处理多种类型和维度的数据高度可定制允许用户自定义损失函数和正则项对异常值鲁棒能够较好地处理数据中的异常值易于解释参数和预测结果都相对容易解释。

Mr数据杨 1005

BPF程序类型

 ???? hello everyone !!!BPF没有明确的分类,可以将其分为两类:跟踪提供系统行为及系统硬件的直接信息。也可以访问特定程序的内存区域,从运行进程中提取执行跟踪信息,还可以访问进程分配的特定资源,文件描述符、cpu、内存。网络检测和控制系统的网络流量。可以对网络接口数据包进行过滤,甚至可以完全拒绝数据包。BPF程序可以附加到网络驱动程序接收数据包的网络事件中,也可以附加到数据包传递给用户空间的网络事件。man bpf 获得更多知识:BPF(2)  &nbsp

process的博客 781

Python爬虫教程:如何爬取多平台电商商品信息(价格、评价、库存)

本文介绍了如何编写一个跨平台电商商品爬虫,爬取多个平台的商品信息,包括商品名称、价格、评价等数据。通过Python的爬虫库(如requestsSelenium)和数据处理库(如pandasmatplotlib)的结合,我们可以高效地获取和分析电商平台上的商品信息。

2201_76125261的博客 917

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

LWN:在今后十年让BPF保持活力!

关注了就能看到更多这么棒的文章哦~Modernizing BPF for the next 10 yearsBy Daroc AldenJune 7, 2024LSFMM+BPFGemini-1.5-flash translationhttps://lwn.net/Articles/977013/BPF 最初采用来作为对数据包过滤的一个通用化处理方案,这发生在十多年前。在那之后,BPF 发生了巨...

Linux News搬运工 1848

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

LWN:BPF 里新的共享内存方案!

关注了就能看到更多这么棒的文章哦~A proposal for shared memory in BPF programsBy Daroc AldenFebruary 21, 2024Gemini translationhttps://lwn.net/Articles/961941/2021 年 2 月 6 日,Alexei Starovoitov 提交了一系列的补丁(patch series)给...

Linux News搬运工 503

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

入门即享受!coolbpf 硬核提升 BPF 开发效率

本文先通过对 BPF 知识的介绍,带领大家入门 BPF,然后介绍 coolbpf 的远程编译(原名 LCC,LibbpfCompilerCollection),意为酷玩 BPF,目标把复杂的 BPF 开发和编译过程简化,本文还会以一个示例来体验 coolbpf 的享受式开发。...

数据库技术 345

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

通过本篇 eBPF 入门实践教程,我们学习了如何使用 eBPF 程序进行性能分析。在这个过程中,我们详细讲解了如何创建 eBPF 程序,监控进程的性能,并从 ring buffer 中获取数据以分析栈回溯。我们还学习了如何使用 perf_event_open() 函数设置性能监控,并将 BPF 程序附加到性能事件上。在本教程中,我们还展示了如何编写 eBPF 程序来捕获进程的内核和用户空间栈信息,进而分析程序性能瓶颈。通过这个例子,您可以了解到 eBPF 在性能分析方面的强大功能。

云微的blog 1402

ftrace一个内核中的追踪器

GitHub - aliyun/surftrace: surftrace is a tool that allows you to surf the linux kernelsurftrace is a tool that allows you to surf the linux kernel - GitHub - aliyun/surftrace: surftrace is a tool that allows you to surf the linux kernelhttps://github.com/

maimang1001的专栏 1260

eBPF/Ftrace

no space left on device 无处遁形 最近在生产环境中遇到了几次创建容器报错 ”no space left on device“ 失败的案例,但是排查过程中发现磁盘使用空间和 inode 都比较正常。在常规的排查方式都失效的情况下,有没有快速通用思路可以定位问题根源呢? 本文是在单独环境中使用 eBPF + Ftrace 分析和排查问题流程的记录,考虑到该方式具有一定的通用性,特整理记录,希望能够起到抛砖引玉的作用。 作者水平有限,思路仅供参考,难免存在某些判断或假设存在不足,欢迎

thinker 689

(译)BPF技巧和窍门:bpf_trace_printk() 和 bpf_printk() 指南

原文:Andrii Nakryiko’s Blog --BPF tips & tricks: the guide to bpf_trace_printk() and bpf_printk() 任何BPF 程序总是需要一些调试才能使其正常工作。 不幸的是,目前还没有 BPF 调试器,所以下一个最好的办法是在周围撒上类似 printf() 的语句,看看 BPF 程序中发生了什么。 printf() 的 BPF 等价物是 bpf_trace_printk() 。 在这篇博文中,我们将了解如何使用它、它的

nan的博客 1万+

C语言:二、函数

C语言-函数 2.1.函数概述一 2.2.函数概述二 2.3.函数无返回参数,无返回值带一个参数 2.4.函数形式参数作用域及生存期 2.5.函数形式参数和局部变量的异同点 2.6.有一个参数有返回值的函数 2.7.有两个参数的函数,实现加法运算 2.8.实现两数据加减乘除 2.9.两数加减乘除,可选算法 2.10.前面的大综合,小计算器 2.11.函数总结 ...

GatoWong的博客 404

eBPF监控工具bcc系列八BPF C

在之前的bcc代码中我们知道其程序是分为两部分的,一部分是C语言,另一部分是基于Python的。本篇是关于C语言部分的。 1. 事件和参数 1.1 kprobes 使用kprobe的语法是: kprobe__kernel_function_name 其中kprobe__是前缀,用于给内核函数创建一个kprobe(内核函数调用的动态跟...

weixin_34409822的博客 2804

【Linux】BPF学习笔记 - BCC工具[6]

【BPF】学习笔记 - BCC工具[6] 本学习笔记来自于阅读 Brendan Gregg的《BPF Performance Tools》 BPF编译器集合(BCC)是一个开放源代码项目,其中包含用于构建BPF软件的编译器框架和库。 它是BPF的主要前端项目,受到BPF开发人员的支持. BCC还包含70多个现成的BPF性能分析和故障排除工具 BCC 组件: BCC包含有关工具,手册页和示例文件的...

Linoy 1561

eBPF介绍

本文主要是对eBPF进行介绍,带大家了解eBPF是什么、通过eBPF可以做些什么事情。1.BPF起源BPF源头起源于一篇1992年的论文,这篇论文主要提出一种新的网络数据包的过滤的框架,如...

宋宝华 1万+
上一篇: LWN:实时内核的嵌套下半部相关的锁!
下一篇: LWN:内核CVE编号是如何分配的!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值