首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏linux驱动个人学习

    BPF简介

    阅读目录 什么是BPF程序: BPF工作原理: BPF关键组件: 4. 这个新版本被命名为 eBPF (意思是 “extended BPF”),与此同时,将以前的 BPF 变成 cBPF(意思是 “classic” BPF)。 BPF工作原理: BPF关键组件: BPF Hooks BPF映射: BPF程序和用户空间程序通过BPF映射通信; BPF映射以键/值保存在内核,可以被任何BPF程序访问,用户空间的程序可以通过文件描述符访问 ,并将统计信息保存到BPF映射,用户态程序可以通过BPF映射获取数据包统计信息; BPF辅助函数(BPF Helper Function):如其他语言生态会提供丰富的库提供大量的API函数,BPF也包含各种常用的辅助函数 ,提供操作内核数据和BPF映射的工具类函数; 优点:通过定义和维护BPF辅助函数,由BPF辅助函数维护者处理Linux内核版本的迭代更新,对开发者透明,形成稳定的API接口; BPF辅助函数列表:

    1.9K31编辑于 2022-05-10
  • 来自专栏山河已无恙

    BPF:BCC(BPF Compiler Collection)工具集认知

    ——村上春树 简单介绍 BCC(BPF Compiler Collection)是一个开源项目,全称为BPF编译器集合,主要用于构建BPF(Berkeley Packet Filter,特别是eBPF, 即扩展BPF)软件。 (BPF,使用 perf_event_open()) PMC 事件(BPF,使用 perf_event_open()) 过滤(使用 BPF 程序) 调试打印输出(使用 bpf_trace_printk( ) 频率统计(通过 BPF 映射表实现) 直方图(支持以 2 的幂为区间,或线性以及自定义区间,通过 BPF 映射表实现) 时间戳和时间差(通过 bpf_ktime_get_ns()和 BPF 程序实现 需要开启以下内核配置选项:CONFIG_BPF=y、CONFIG_BPF_SYSCALL=y、CONFIG_BPF_EVENTS=y、CONFIG_ BPF_JIT=y,还有CONFIG_HAVE_EBPF_JIT

    83310编辑于 2024-06-21
  • 来自专栏linux驱动个人学习

    BPF BTF 详解

    介绍 BTF(BPF Type Format)是内嵌在BPF(Berkeley Packet Filter)程序中的数据结构描述信息。 BPF原本是用于数据包过滤的编程语言,但随着eBPF(extended BPF)的发展,它的用途已经扩展到多种内核子系统中,包括性能监测、网络安全和配置管理等。 BTF(BPF 类型格式)是一种元数据格式,对与 BPF 程序 /map 有关的调试信息进行编码。BTF 这个名字最初是用来描述数据类型。后来,BTF 被扩展到包括已定义的子程序的函数信息和行信息。 函数签名能够更好地实现 bpf 程序/函数的内核符号。行信息有助于生成源注释的翻译字节码、JIT 代码和验证器的日志。 类型和字符串部分(section)是 BTF 内核 API 的一部分,描述了 bpf 程序所引用的调试信息(主要是与类型有关的)。这两个部分将在 BTF_Type_String 章节中详细讨论。

    94210编辑于 2024-03-08
  • 来自专栏大卫李的技术分享

    BPF数据传递的桥梁——BPF Map(一)

    目录 TL;DR 为什么需要BPF Map BPF Map是什么 如何创建BPF Map 如何操作BPF Map 开发BPF Map示例程序 分析代码 示例程序的运行效果 BPF Map背后的fd分析 /linux-bpf-learning/tree/master/bpf/bpf-maps 为什么需要BPF Map 通过消息传递来触发程序中的行为是软件工程中广泛使用的技术。 在内核空间的程序创建BPF Map并返回对应的文件描述符,在用户空间运行的程序就可以通过这个文件描述符来访问并操作BPF Map,这就是为什么BPF Map在BPF世界中是桥梁的存在了。 如何操作BPF Map BPF Map也有自己的CRUD,除了bpf_map_create是创建BPF Map操作之外,下面列出了其他主要操作, bpf_map_lookup_elem(map, key 彩蛋 讲了上面的BPF Map背后原理,可以看到只要能知晓BPF Map的fd就能访问里面的数据,那么其他非BPF程序是否也能访问BPF Map?

    5.2K30发布于 2020-08-25
  • 来自专栏nginx遇上redis

    BPF过滤器

    (1)BPF本质上来说是一个设备驱动(devicedriver),能够被应用程序用来读取网络上通过这个网络适配器的包。 但是BPF又是一个特殊的驱动,因为它并没有直接控制网络适配器,而是网络适配器真正的设备驱动调用BPF来传递数据。 (2)BPF正常情况下被用作诊断工具去检查与本机相连的网络的流通状况。 一个BPF设备能够配置一个filter,根据这个filter的特征,来忽略或者接收到来的包。 (3)BPF拥有两个组件: the network tap 和 the packet filter 。 但是当BPF在这个接口上面监听时,网络设备驱动将首先调用 BPF的network tap函数。这个tap函数将包送入每一个监听程序的filter。 (6)监听进程执行read系统调用去从BPF(hold buffer)接收包,并将阻塞于此。

    1.5K10发布于 2019-10-15
  • 来自专栏云微的一点分享

    eunomia-bpf 和 wasm-bpf 项目的 3 月进展

    eunomia-bpf 项目是一个开源项目,旨在提供一组工具,用于在 Linux 内核中更方便地编写和运行 eBPF 程序。在过去一个月中,该项目取得了一些新的进展,以下是这些进展的概述。 首先,eunomia-bpf 动态加载库进行了一些重要的更新。该库现在支持 btf hub,这使得在低内核版本上移植 eBPF 程序更加容易。 其次,Wasm-bpf 项目也进行了一些更新。该项目添加了一系列的 examples,这些 examples 关注于安全、网络、追踪等多个方向。 Wasm-bpf 项目还添加了 Rust 语言的 Guest SDK 支持,并尝试添加了 Go 语言的 Guest SDK 支持。 最后,eunomia-bpf 还新增了一个名为 GPTtrace 的 demo 项目。该项目使用 ChatGPT 自动化生成 eBPF 程序和追踪,有助于用户更轻松地创建和追踪自定义的系统事件。

    33110编辑于 2023-03-13
  • 来自专栏山河已无恙

    如何使用 BPF 监控 Linux 内存情况:Linux 内存调优之 BPF 内存监控分析

    写在前面 博文内容整理自 《BPF Performance Tools》 书中 内存部分 对书中提到BPF工具配合实际Demo进行说明,以及一些变体的输出 涉及下面一些内存问题的 BPF 观测 Demo 根据所跟踪事件的发生频率不同,以及对应的 BPF 程序,运行时仍有可能造成 10%左右的性能损耗。在极端情况下甚至可能将软件运行速度降至原先的 1/10。  *  * See BPF Performance Tools, Chapter 8, for an explanation of this tool.  *  * See BPF Performance Tools, Chapter 8, for an explanation of this tool.  *  * See BPF Performance Tools, Chapter 7, for an explanation of this tool.

    53910编辑于 2025-07-08
  • 来自专栏云微的一点分享

    Wasm eBPF = Wasm-bpf

    Wasm-bpf 是一款基于 WebAssembly 的 eBPF 库、工具链和运行时,它可以帮助您利用 CO-RE 的 eBPF 运行时和 WebAssembly 运行时(例如 WAMR)构建 eBPF 借助 Wasm-bpf 编译工具链和运行时,我们可以使用 Wasm 将 eBPF 程序编写为跨平台的模块,使用 C/C++ 和 Rust 编写程序。 一样,从云端一行命令获取 Wasm 轻量级容器镜像,并运行任意 eBPF 程序: # push to Github Packages ecli push https://ghcr.io/eunomia-bpf /sigsnoop:latest # pull from Github Packages ecli pull https://ghcr.io/eunomia-bpf/sigsnoop:latest # Github 开源地址:https://github.com/eunomia-bpf/wasm-bpf

    55920编辑于 2023-02-17
  • 来自专栏云计算与大数据

    bpf | eXpress Data Path| XDP

    the TCP/IP stack 它不会替换 TCP/IP 堆栈 It works in concert with TCP/IP stack along with all the benefits of BPF 它与 TCP/IP 堆栈以及 BPF 的所有优点协同工作 XDP Packet Processing Overview The XDP packet process includes an in kernel BPF 程序执行数据包解析、表查找、创建/管理有状态筛选器、封装/取消封装数据包等处理。 lookups, and application processing leveraging BPF programs which are portable to userspace and other 通过数据包检查和操作功能、流和表查找以及利用可移植到用户空间和其他操作系统的 BPF 程序的应用程序处理,BPF 的可扩展性保持不变。

    97810编辑于 2022-04-18
  • 来自专栏大卫李的技术分享

    调试你的BPF程序

    底层架构有关,那是因为BPF底层是由11个64位寄存器、1个计数器和1个512字节BPF stack组成。 第一个谜团已经解开了,在看第二谜团之前,我们来想一个问题,既然BPF辅助函数对于参数个数是有限制的,那一个BPF程序中调用BPF辅助函数会不会有限制? 答案是可能会有的。 这是什么意思呢? 这里就要说到BPF程序更多的限制了。BPF程序目前是无法使用普通共享库的,通常的做法是把BPF程序的常用库代码放在头文件中,然后在主程序中引用。 BPF程序编译后是一组连续的BPF指令,而不是非连续的,因为非连续的指令会导致BPF程序无法成功加载到内核。 除了bpf_trace_printk函数可以添加日志之外,还可以使用bpf_perf_event_output函数(如果你使用BCC,它的入口函数是BPF_PERF_OUTPUT),据说性能更好。

    5.2K31发布于 2020-05-25
  • 来自专栏Serverless+

    使用 BPF 统计网络流量

    本文介绍使用 BPF 统计网络流量。 大杀器 BPFBPF 显然是这个问题的完美解决方案。我们需要的只是累计出站流量,如果能放到内核态执行,意味着我们不需要拷贝网络数据包。 下面是一个使用 libbpf 编写的程序,它的作用与上述 libpcap 的作用一致: #include <vmlinux.h> #include <bpf/bpf_helpers.h> #include <bpf/bpf_tracing.h> int ifindex = 0; __u64 traffic = 0; SEC("tp_btf/netif_receive_skb") int BPF_PROG 结论 本文通过实例演示了使用 libbpf 编写 BPF 程序,实现在内核态高效统计网络流量的方案。

    4.4K90发布于 2021-03-21
  • 来自专栏云计算与大数据

    bpf| 系统分析工具

    bpf 最初是为bsd操作系统开发,全称是 「Berkeley Packet Filter」 ,翻译过来是 「伯克利包过滤器」 ,顾名思义,它是在伯克利大学诞生的,1992年Steven McCanne 和 Van Jacobson 写了一篇 《The BSD Packet Filter: A New Architecture for User-level Packet Capture》论文 用户使用bpf 虚拟机的指令集(bpf字节码)定义过滤器表达式,然后传递给内核, 由解释器执行。 当确定了所需的钩子时,可以使用 bpf 系统调用将 eBPF 程序加载到 Linux 内核中。这通常使用一个可用的 eBPF 库来完成。下一节将介绍可用的开发工具链。 /linux/post/bpf-a-tour-of-program-types https://ebpf.io/what-is-ebpf/

    1.6K10编辑于 2022-04-18
  • 来自专栏数据库相关

    高性能:3-为何性能分析工具需要BPFbpf performance tools读书笔记】

    性能工具之所以使用扩展的BPF,部分原因在于它的可编程性。BPF程序可以执行自定义等待时间计算和统计摘要。仅这些功能就可以构成一个有趣的工具,并且还有许多其他具有这些功能的跟踪工具。 使BPF与众不同的是,它还高效且生产安全,并且内置于Linux内核中。使用BPF,您可以在生产环境中运行这些工具,而无需添加任何新的内核组件。 让我们看一些输出和一个图表,以了解性能工具如何使用BPF。该示例来自我发布的早期BPF工具bitehist,该工具以直方图的形式显示了磁盘I/O的大小: ? 使用BPF,bitesize程序的步骤为: 1. 在内核中:启用对磁盘I / O事件的检测,并附加一个由bitesize定义的自定义BPF程序。 2. 在内核中,对于每个事件:运行BPF程序。 它仅获取字节字段,并将其保存到自定义BPF映射直方图中。 3. 在用户空间中:一次读取BPF地图直方图并打印出来。 此方法避免了将事件复制到用户空间并对其进行重新处理的开销。

    1.2K21发布于 2020-03-06
  • 来自专栏Serverless+

    使用 BPF 自定义安全组

    这一篇文章我们继续探索 BPF 在网络领域的应用:使用 BPF 来实现安全组。 XDP 与 BPF XDP 是 eXpress Data Path 的缩写,在 Linux 内核中为 BPF 提供了一个框架,用于实现高性能的可编程的数据包处理。 它在整个软件栈的起始点,即网络驱动程序收到以太网帧的时刻运行 BPF 程序。 回到本文的主题,我们通过把安全组规则翻译成 BPF 程序,利用 XDP 挂载至网卡设备上执行,即可达成目标。 实现上述功能的 BPF 程序如下: #include <linux/bpf.h> #include <linux/if_ether.h> #include <linux/in.h> #include < 在整个程序中,对于指针边界的判断是必需的,若缺失,会导致程序不能通过内核 BPF 验证器的校验。(在程序中,我们对不认识/不完整的数据都予以放过)最后编译为二进制文件 sg.bpf.o。

    2.1K70发布于 2021-04-01
  • 来自专栏人人都是极客

    高性能BPF内存分析工具解析

    这个时候BPF工具更高效,性能损耗更低的优势就体现出来了。 BPF 相关内存分析工具 此外,还有一些用于内存分析的BPF工具: kmem、kpages、slabratetop、numamove oomkill oomkill是一个BCC和bpftrace工具,

    1.6K30编辑于 2022-07-12
  • 来自专栏数据库相关

    高性能:7-可用于CPU分析的BPF工具【bpf performance tools读书笔记】

    可用于CPU分析的BPF工具,见下图标注的这些命令 ? 下表的这些工具有些是属于BCC或者bpftrace,或为这本书创建的。一些工具同时出现在BCC和bpftrace中。 该工具通过检测 sched:sched_process_exit 跟踪点及其参数来工作,并且还使用bpf_get_current_task(),以便可以从任务结构中读取开始时间(不稳定的接口详细信息)。 即使对BPF进行了优化,以这些速率,即使每个事件增加一微秒也会导致明显的开销。需要小心使用runqlat这个工具。 有关BPF开销的一些实际测量值,请参见第18章,每个事件通常小于一微秒。

    5.9K21发布于 2020-03-06
  • 来自专栏数据库相关

    高性能:8-可用于Memory分析的BPF工具【bpf performance tools读书笔记】

    BPF工具效率更高,开销也更小。 hardware statistics, hardware sampling Memory-related   PMC statistics and event sampling 用于内存分析相关的BPF process按进程显示swap情况 hfaults Book Faults Shows huge   page faults, by process按进程显示巨页错误情况 此外,还有几个用于内存分析的BPF

    2.9K11发布于 2020-03-06
  • 来自专栏charlieroro

    BPF CO-RE 示例代码解析

    现在以该工具来展示如何使用BPF CO-RE。 CO-RE的基本步骤如下,: 生成包含所有内核类型的头文件vmlinux.h; 使用Clang(版本10或更新版本)将BPF程序的源代码编译为.o对象文件; 从编译好的BPF对象文件中生成BPF skeleton 头文件(对应runqslower的BPF对象文件为runqslower.bpf.o,也可以通过bpftool gen skeleton runqslower.bpf.o生成skeleton头文件) ; 在用户空间代码中包含生成的BPF skeleton 头文件(BPF skeleton 头文件是给用户空间使用的); 最后,编译用户空间代码,这样会嵌入BPF对象代码,后续就不用发布单独的文件。 > /* most used helpers: SEC, __always_inline, etc */ #include <bpf/bpf_core_read.h> /* for BPF CO-RE

    2.8K30发布于 2021-02-04
  • 来自专栏小脑斧科技博客

    linux 内核跟踪神器 BPF 及实战

    BPF 就提供了这样的观测手段。 BPF 是 Berkeley Packet Filter 的缩写,它诞生于 1992 年,用来提升网络包过滤工具的性能,直到 2014 年,被正式并入 Linux 内核主线,由此,BPF 成为了一个更通用的执行引擎 实际上,网络抓包工具 tcpdump 就是通过调用内核的 BPF 工具来实现的,起初 BPF 就是为了 tcpdump 这样想要观测网络事件的工具而服务的,但可想而知,既然网络包可以作为观测的事件源,那么 经过扩展后的 BPF 缩写为 eBPF,但也经常仍被称为 BPF,实际上,现在 linux 内核中只有一个 BPF 执行隐层,它同时支持 eBPF 与经典的 BPF 程序,因此,在实际使用中无需区分。 3.1 BCC BCC 是最早用于开发 BPF 跟踪程序的高级语言框架,它提供了一个编写内核 BPF 程序的 C 语言环境,同时提供了供其他高级语言,诸如 C++、Python、Java 调用的用户端接口

    4.9K10编辑于 2022-06-27
  • 来自专栏深度技术专栏

    BPF实现用户态tracing

    BPF实现用户态tracing BPF是最近Linux内核领域热门的技术。 从Kernel 4.9之后,BPF已经成为一个完善的内核扩展工具,BPF在内核里运行一个sandbox,用于执行BPF的字节码(bytecode), 在执行BPF程序前,BPF的检查器会对BPF程序的字节码进行安全检查 用BCC工具编写BPF程序进行tracing BCC是用于编写BPF程序的开发框架和编译器。目前BPF程序主要用C语言来写,但是不支持C的全部语法,比如不支持循环。 BCC调用LLVM把BPF的C代码转成BPF的字节码,然后经过BPF检查器的检验,检验通过的BPF字节码成功加载到sandbox里运行。 BPF的C代码,用字符串的方式定义给bpf_src变量。

    3.5K21发布于 2020-07-14
领券