Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >linux 内核跟踪神器 BPF 及实战

linux 内核跟踪神器 BPF 及实战

作者头像
用户3147702
发布于 2022-06-27 09:08:07
发布于 2022-06-27 09:08:07
4.5K0
举报

1. 引言

作为一个程序员,在日常工作中,我们往往对于程序的运行情况十分关注,而随着计算机系统变得越来越复杂,人们想要详细地了解软件和系统内核的行为也变得越来越困难,这导致在计算机系统中,“黑天鹅”事件越来越多,甚至很多“黑天鹅”事件其实是长期没有被发现的“灰犀牛”事件。因此,从系统中收集和分析数据显得至关重要。此时,一个能够监控、嗅探内核运行状态的工具包就显得十分重要了,BPF 就是这样一个工具包。

2. BPF 和 eBPF

linux 内核提供了 CPU 调度器、网络调度器、文件调度器等重要功能,我们经常会去使用它们提供的系统调用来与操作系统内核进行交互,但我们如何观测它们的运行状态呢?BPF 就提供了这样的观测手段。

BPF 是 Berkeley Packet Filter 的缩写,它诞生于 1992 年,用来提升网络包过滤工具的性能,直到 2014 年,被正式并入 Linux 内核主线,由此,BPF 成为了一个更通用的执行引擎,可以完成多种任务,尤其是可以创建先进的性能分析工具

实际上,网络抓包工具 tcpdump 就是通过调用内核的 BPF 工具来实现的,起初 BPF 就是为了 tcpdump 这样想要观测网络事件的工具而服务的,但可想而知,既然网络包可以作为观测的事件源,那么,CPU 采样计数器、内核系统调用、用户态函数调用等等都可以作为事件源,于是扩展 BPF 支持这些事件的观测就显得顺理成章了。

经过扩展后的 BPF 缩写为 eBPF,但也经常仍被称为 BPF,实际上,现在 linux 内核中只有一个 BPF 执行隐层,它同时支持 eBPF 与经典的 BPF 程序,因此,在实际使用中无需区分。

下图展示了 linux 内核中一个通用的系统软件栈,以及 BPF 性能工具可以进行观测的观测点:

3. BCC、bpftrace 和 IO Visor

尽管有了 BPF 指令,我们就可以对内核进行跟踪、嗅探、采样等操作获取内核中的运行数据来进行分析,但直接使用 BPF 指令过于繁琐复杂,所以我们希望能够有封装好的工具直接方便快捷地使用,甚至使用高级语言进行编程,于是,BCC、bpftrace 两大工具集就诞生了。

3.1 BCC

BCC 是最早用于开发 BPF 跟踪程序的高级语言框架,它提供了一个编写内核 BPF 程序的 C 语言环境,同时提供了供其他高级语言,诸如 C++、PythonJava 调用的用户端接口。BCC 的成功,产生了 libbcc 和 libbpf 两个函数库,他们提供了使用 BPF 程序对事件进行观测的库函数。

通常,我们直接使用 BCC 提供的工具就可以实现我们需要的功能,但如果我们希望开发一个常态化监控的后台进程,或者是开发复杂的脚本,甚至希望能够调用其他语言的库来实现更为复杂的功能,此时 BCC 就是一个非常强大的工具。

3.2 bpftrace

bpftrace 是新近出现的专门用于创建 BPF 工具的高级语言支持框架,使用 bpftrace 编写跟踪程序非常方便、快捷,你也可以阅读 bpftrace 工具的源码,非常简洁易懂。和 BCC 一样,bpftrace 也是基于 libbcc 和 libbpf 构建的。

依赖于 bpftrace 强大的语法,针对于单行程序、短小的脚本来说,bpftrace 可以快速实现其功能。

3.3 IO Visor

IO Visor 是一个 Linux 基金会项目,BCC 和 bpftrace 都不在内核代码中维护,而是由 IO Visor 在 Github 中维护的:

https://github.com/iovisor/bcc https://github.com/iovisor/bpftrace

4. 安装 BCC 与 bpftrace

参考 github 仓库中的 readme,我们可以快速安装 BCC 和 bpftrace 仓库。

它们都需要使用 Linux4.9 版本以上内核。

4.1 安装 BCC

如果你使用的是 ubuntu 系统,你需要执行:

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

或者:

sudo snap install bcc

如果你是用的是 RedHat,你需要执行:

sudo yum install bcc-tools

不过最方便的是直接使用官方封装好的 docker 镜像来启动:

sudo docker run -it -v /usr/src:/usr/src:ro -v /lib/modules/:/lib/modules:ro -v /sys/kernel/debug/:/sys/kernel/debug:rw --net=host --pid=host --privileged quay.io/iovisor/bcc:latest bash

安装完成后,BCC 工具通常会被默认放置在 /sbin 目录下,并且以 -bpfcc 为后缀,或者在 /usr/share/bcc/tools 目录下。

4.2 安装 bpftrace

ubuntu 下你需要执行:

sudo apt install bpftrace

fedora 下你需要执行:

sudo dnf install -y bpftrace

同样,你也可以使用 docker 镜像来启动:

sudo docker run -it -v /usr/src:/usr/src:ro -v /lib/modules/:/lib/modules:ro -v /sys/kernel/debug/:/sys/kernel/debug:rw --net=host --pid=host --privileged quay.io/iovisor/bpftrace:latest bash

安装完成后,bpftrace 的二进制文件通常会放到 /usr/local/bin/bpftrace,bpftrace 工具则会被安装到 /usr/local/share/bpftrace/tools 中,或者直接放置到 /usr/local/bin 下。

5. 快速上手 BCC & bpftrace

5.1 使用 BCC 工具跟踪进程执行

既然完成了 BCC 的安装,你是不是已经跃跃欲试,想要执行一个命令来实践一下了呢?

那么,我们就来执行一个监控系统中进程创建的工具 -- execsnoop

下图是我开启 execsnoop 工具后,用 C 语言编写一个 hello_world 程序并执行后的信息:

5.2 用 bpftrace 跟踪进程执行

下面的代码以 syscall:sys_enter_openat 作为插桩点,实现了对每个进程执行 open() 系统调用的跟踪:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小脑斧科技博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[C++11] 右值引⽤与移动语义
在C++中,左值(lvalue)和右值(rvalue)是两种不同的表达式类型,它们的主要区别在于它们在内存中的状态和使用方式。
DevKevin
2024/10/28
2330
[C++11] 右值引⽤与移动语义
【C++修炼之路】27.右值引用
以下所要讲到的,以及右值引用的都是为了提高性能,这是其他语言所不具备的,而本文章就围绕了大量的场景将右值引用的细节分割并逐个击破。
每天都要进步呀
2023/03/28
3360
【C++修炼之路】27.右值引用
C++11『右值引用 ‖ 完美转发 ‖ 新增类功能 ‖ 可变参数模板』
自从C++98以来,C++11无疑是一个相当成功的版本更新。它引入了许多重要的语言特性和标准库增强,为C++编程带来了重大的改进和便利。C++11的发布标志着C++语言的现代化和进步,为程序员提供了更多工具和选项来编写高效、可维护和现代的代码
北 海
2023/11/17
7220
C++11『右值引用 ‖ 完美转发 ‖ 新增类功能 ‖ 可变参数模板』
C++11移动语义与右值引用
C++11新标准中一个最主要的特性就是提供了移动而非拷贝对象的能力。如此做的好处就是,在某些情况下,对象拷贝后就立即被销毁了,此时如果移动而非拷贝对象会大幅提升性能。参考如下程序:
恋喵大鲤鱼
2019/02/22
1.1K0
【C++】右值引用全面揭秘:解锁 C++11 的性能革命与移动语义奥秘!
引用就是给对象取别名,右值引用就是给右值取别名,左值引用就是给右值取别名。右值引用和左值引用在语法形式上是类似的:
HZzzzzLu
2024/12/26
2260
【C++】右值引用全面揭秘:解锁 C++11 的性能革命与移动语义奥秘!
C++11新特性 右值引用与新的类功能
在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。相比于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言。相比较而言,C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更强大,而且能提升程序员的开发效率,公司实际项目开发中也用得比较多,所以我们要作为一个重点去学习。C++11增加的语法特性非常篇幅非常多,我们这里没办法一 一讲解,所以本节主要讲解实际中比较实用的语法。
用户11317877
2024/10/16
2200
C++11新特性 右值引用与新的类功能
【C++】C++11的新特性 --- 右值引用与移动语义
C++中,一个表达式不是右值就是左值。C语言中:左值可以位于赋值对象的左边,右值则不能。在C++中就没有这么简单了。在C++中的左右值可以通过是否可以取地址来区分:
叫我龙翔
2024/07/20
1510
【C++】C++11的新特性 --- 右值引用与移动语义
C++11的简单介绍(上)
在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。相比于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言。相比较而言,C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更强大,而且能提升程序员的开发效率,公司实际项目开发中也用得比较多,所以我们要作为一个重点去学习。C++11增加的语法特性非常篇幅非常多,我们这里没办法一 一讲解,所以本篇博文主要讲解实际中比较实用的语法。
ahao
2024/03/19
1830
C++11的简单介绍(上)
C++ —— 剑斩旧我 破茧成蝶—C++11
1. C++11以后想统⼀初始化⽅式,试图实现⼀切对象皆可⽤{}初始化,{}初始化也叫做列表初始化
迷迭所归处
2024/11/20
1890
C++ —— 剑斩旧我 破茧成蝶—C++11
【C++11】{}/右值引用/移动语义/类型分类/引用折叠/完美转发--C++
C++11 是 C++ 的第二个主要版本,并且是从 C++98 起的最重要更新。它引入了大量更改,标准化了既有实践,并改进了对 C++ 程序员可用的抽象。在它最终由 ISO 在 2011 年 8 月 12 日采纳前,人们曾使用名称“C++0x”,因为它曾被期待在 2010 年之前发布。C++03 与 C++11 期间花了 8 年时间,故而这是迄今为止最长的版本间隔。从那时起,C++ 有规律地每 3 年更新一次。
小志biubiu
2025/02/27
1670
【C++11】{}/右值引用/移动语义/类型分类/引用折叠/完美转发--C++
【c++】一篇文章带你了解c++11的新特性&&c++11详解
在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。
用户10925563
2024/08/06
3080
【c++】一篇文章带你了解c++11的新特性&&c++11详解
【C++进阶篇】C++11新特性(中篇)
右值引用本质就是移动(挪动)资源,原因在于右值一般是马上要被销毁的资源,同时在函数返回值中可以减少拷贝问题。
熬夜学编程的小王
2025/06/10
840
【C++进阶篇】C++11新特性(中篇)
【C++11】可变参数模板/新的类功能/lambda/包装器--C++
成员变量声明时给缺省值是给初始化列表用的,如果没有显示在初始化列表初始化,就会在初始化列表用这个却绳子初始化,这个我们在类和对象部分讲过了,点击跳转,可以查看我的主页哦.
小志biubiu
2025/02/27
2760
【C++11】可变参数模板/新的类功能/lambda/包装器--C++
C++进阶:C++11(列表初始化、右值引用与移动构造移动赋值、可变参数模版...Args、lambda表达式、function包装器)
C++进阶:C++11(列表初始化、右值引用与移动构造移动赋值、可变参数模版…Args、lambda表达式、function包装器)
是Nero哦
2024/05/25
4330
C++进阶:C++11(列表初始化、右值引用与移动构造移动赋值、可变参数模版...Args、lambda表达式、function包装器)
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
c++11 标准的发布为 c++ 带来了革命性的变化,引入了许多强大的新特性,使代码更简洁、高效且现代化。这些特性不仅提升了开发效率,还优化了性能,是现代 c++ 编程的重要基石。本篇文章,我们将重点探讨 c++11 的几个核心改进:列表初始化、右值引用和移动语义、类的新默认成员函数以及lambda表达式。
ephemerals__
2025/04/10
1860
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11:新特性&右值引用&移动语义
在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。相比于 C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中 约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言。相比较而言, C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更 强大,而且能提升程序员的开发效率,公司实际项目开发中也用得比较多,所以我们要作为一个 重点去学习。
小陈在拼命
2024/12/24
1940
C++11:新特性&右值引用&移动语义
【C++】C++11
C++11 是 C++ 的第⼆个主要版本,并且是从 C++98 起的最重要更新。它引⼊了⼤量更改,标准化了既 有实践,并改进了对 C++ 程序员可⽤的抽象。在它最终由 ISO 在 2011 年 8 ⽉ 12 ⽇采纳前,⼈们曾使⽤名称“C++0x”,因为它曾被期待在 2010 年之前发布。C++03 与 C++11 期间花了 8 年时间,故⽽这是迄今为⽌最⻓的版本间隔。从那时起,C++ 有规律地每 3 年更新⼀次。
用户11290673
2025/02/05
1880
【C++】C++11
【C++航海王:追寻罗杰的编程之路】C++11(二)
圈起来的是C++11中的一些几个新容器,但是实际最有用的是unordered_map和 unordered_set。
枫叶丹
2024/06/04
1200
【C++航海王:追寻罗杰的编程之路】C++11(二)
深入理解C++11右值引用与移动语义:高效编程的基石
在现代C++编程中,性能优化和资源管理一直是开发者追求的目标。C++11引入的右值引用(rvalue reference)和移动语义(move semantics)为解决这些问题提供了强有力的工具。通过右值引用,我们能够更高效地处理临时对象;而移动语义的引入,则进一步优化了对象的资源转移和管理。在这篇文章中,我们将深入探索右值引用和移动语义的核心概念、实现原理,以及它们在实际开发中的应用场景。
suye
2024/11/21
2460
深入理解C++11右值引用与移动语义:高效编程的基石
【C++11(中)】—— 我与C++的不解之缘(三十一)
但是这样未必有些太麻烦了,如果我们还要传递4、5、6个甚至更多参数的,那还要一个个去实现。
星辰与你
2025/04/05
1090
【C++11(中)】—— 我与C++的不解之缘(三十一)
推荐阅读
相关推荐
[C++11] 右值引⽤与移动语义
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档