首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Linux 可观测性 BPF&eBPF 以及 BCC&bpftrace 认知
对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》
山河已无恙
2024/01/17
8120
Linux 可观测性 BPF&eBPF 以及 BCC&bpftrace 认知
eBPF 介绍_bcp方案是什么意思
Tcpdump 是Linux 平台常用的网络数据包抓取及分析工具,tcpdump 主要通过libpcap 实现,而libpcap 就是基于eBPF。
全栈程序员站长
2022/11/08
8720
eBPF 介绍_bcp方案是什么意思
BPF:BCC(BPF Compiler Collection)工具集认知
不必太纠结于当下,也不必太忧虑未来,当你经历过一些事情的时候,眼前的风景已经和从前不一样了。——村上春树
山河已无恙
2024/06/21
4920
BPF:BCC(BPF Compiler Collection)工具集认知
大规模储能技术_新技术储备
可执行与可链接格式 (英语:Executable and Linkable Format,缩写 ELF,此前的写法是 Extensible Linking Format),常被称为 ELF格式,在计算中,是一种用于可执行文件、目标代码、共享库和核心转储(core dump)的标准文件格式。
全栈程序员站长
2022/09/27
8970
大规模储能技术_新技术储备
eBPF技术简介
“eBPF 是我见过的 Linux 中最神奇的技术,没有之一,已成为 Linux 内核中顶级子模块,从 tcpdump 中用作网络包过滤的经典 cbpf,到成为通用 Linux 内核技术的 eBPF,已经完成华丽蜕变,为应用与神奇的内核打造了一座桥梁,在系统跟踪、观测、性能调优、安全和网络等领域发挥重要的角色。为 Service Mesh 打造了具备 API 感知和安全高效的容器网络方案 Cilium,其底层正是基于 eBPF 技术”
CNCF
2020/08/24
18.8K1
eBPF技术简介
eBPF编程入门与工具使用
将 eBPF 程序附加到跟踪点以及内核和用户应用探针点的能力,使得应用程序和系统本身的运行时行为具有前所未有的可见性。通过赋予应用程序和系统两方面的检测能力,可以将两种视图结合起来,从而获得强大而独特的洞察力来排除系统性能问题。
五分钟学SRE
2023/11/26
9650
eBPF编程入门与工具使用
M10F支持扩展卡吗_ibb与obb
几乎所有编程接口都可见于:内核源代码的include/uapi/linux/bpf.h文件中
全栈程序员站长
2022/09/30
1.2K0
M10F支持扩展卡吗_ibb与obb
【云原生技术研究】 从bpftrace看如何利用eBPF实现内核追踪
bpftrace提供了一种快速利用eBPF实现动态追踪的方法,可以作为简单的命令行工具或者入门级编程工具来使用。本文以bpftrace为例,介绍如何利用eBPF实现内核的动态追踪。
绿盟科技研究通讯
2020/09/01
2.6K0
【云原生技术研究】 从bpftrace看如何利用eBPF实现内核追踪
【云原生技术研究】BPF使能软件定义内核
BPF通过一种软件定义的方式,将内核的行为和数据暴露给用户空间,开发者可以通过在用户空间编写BPF程序,加载到内核空间执行,进而实现对内核行为的灵活管理和控制
绿盟科技研究通讯
2020/03/12
1.4K0
好技能 | 如何在CentOS上配置eBPF开发环境
优惠券是电商常见的营销手段,是营销平台中的一个重要组成部分,既可以作为促销活动的载体,也是重要的引流入口。在刚刚过去的电商大促周期内,各大电商平台都有配置不同类目、价位的优惠券,吸引用户下单购买。优惠券系统主要涵盖四个核心能力:创建、派发、使用、统计。
穿过生命散发芬芳
2024/11/25
1710
好技能 | 如何在CentOS上配置eBPF开发环境
eBPF 概述:第 3 部分:软件开发生态
在本系列的第 1 部分和第 2 部分中,我们对 eBPF 虚拟机进行了简洁的深入研究。阅读上述部分并不是理解第 3 部分的必修课,尽管很好地掌握了低级别的基础知识确实有助于更好地理解高级别的工具。为了理解这些工具是如何工作的,我们先定义一下 eBPF 程序的高层次组件:
用户7686797
2021/11/24
7490
eBPF 概述:第 3 部分:软件开发生态
eBPF 概述:第 3 部分:软件开发生态
在本系列的第 1 部分和第 2 部分中,我们对 eBPF 虚拟机进行了简洁的深入研究。阅读上述部分并不是理解第 3 部分的必修课,尽管很好地掌握了低级别的基础知识确实有助于更好地理解高级别的工具。为了理解这些工具是如何工作的,我们先定义一下 eBPF 程序的高层次组件:
233333
2023/11/27
3550
eBPF 概述:第 3 部分:软件开发生态
新手入门:探索 eBPF 的可观测性与安全性工作流
本文分享了学习 eBPF 的经验,eBPF 是一种新的云原生技术,其目标是改善可观测性和安全性工作流。我们可能感觉它的入门门槛很高,通过 eBPF 工具来辅助生产环境调试的步骤会很多。本文将会介绍如何使用相关的工具并将其应用到自己的开发中,请逐步迭代自己的知识,并将其用到更高级的使用场景中。最后,我们会讨论如何在 CI/CD 中实现自动化开发及其面临的挑战。
深度学习与Python
2023/08/10
5370
新手入门:探索 eBPF 的可观测性与安全性工作流
【玩转腾讯云】ebpf 学习梳理和测试使用
周五下午在公司的服务网格月度讨论会上,一位同事为大家分享了在服务网格中使用 ebpf 来优化提升 istio 中 sidecar 和 RS 间的通信效率。听过之后手痒难,想测试一把 ebpf。当这位同事在这方面做的还是比较深入的,而且给内核和 istio 中提交了pr。有兴趣的同学可以看看他的 github:https://github.com/ChenLingPeng 还有他的 blog。
黑光技术
2020/03/26
2.7K0
技术分享 | 如何使用 bcc 工具观测 MySQL 延迟
爱可生测试团队成员,主要负责 TXLE 开源项目相关测试任务,擅长 Python 自动化测试开发,最近醉心于 Linux 性能分析优化的相关知识。
爱可生开源社区
2020/03/26
1.8K0
技术分享 | 如何使用 bcc 工具观测 MySQL 延迟
eBPF 入门开发实践教程零:介绍 eBPF 的基本概念、常见的开发工具
eBPF 是一项革命性的技术,起源于 Linux 内核,可以在操作系统的内核中运行沙盒程序。它被用来安全和有效地扩展内核的功能,而不需要改变内核的源代码或加载内核模块。eBPF 通过允许在操作系统内运行沙盒程序,应用程序开发人员可以在运行时,可编程地向操作系统动态添加额外的功能。然后,操作系统保证安全和执行效率,就像在即时编译(JIT)编译器和验证引擎的帮助下进行本地编译一样。eBPF 程序在内核版本之间是可移植的,并且可以自动更新,从而避免了工作负载中断和节点重启。
云微
2023/08/12
3K0
eBPF 入门开发实践教程零:介绍 eBPF 的基本概念、常见的开发工具
bpf| 系统分析工具
eBPF is a revolutionary technology with origins in the Linux kernel that can run sandboxed programs in an operating system kernel. It is used to safely and efficiently extend the capabilities of the kernel without requiring to change kernel source code or load kernel modules.
heidsoft
2022/04/18
1.3K0
bpf| 系统分析工具
eBPF 入门开发实践指南一:介绍 eBPF 的基本概念、常见的开发工具
Linux内核一直是实现监控/可观测性、网络和安全功能的理想地方,但是直接在内核中进行监控并不是一个容易的事情。在传统的Linux软件开发中,实现这些功能往往都离不开修改内核源码或加载内核模块。修改内核源码是一件非常危险的行为,稍有不慎可能便会导致系统崩溃,并且每次检验修改的代码都需要重新编译内核,耗时耗力。
云微
2023/02/24
8420
[译]eBPF 概念和基本原理
大约一年前,有个朋友想要用 Rust 开发一个 EVM Assembler。在他的一再要求之下,我开始帮忙编写单元测试。那时候我还不大了解操作系统的相关知识,只好开始学习一些语法和词法方面的东西。很快这个事情就无以为继了,然而我对操作系统有了一些整体了解。之后他对 eBPF 赞赏有加时,我觉得我的春天又来了。
崔秀龙
2020/11/19
5.7K0
[译]eBPF 概念和基本原理
强劲的Linux Trace工具:bpftrace (DTrace 2.0) for Linux 2018
译者注:原作者是大名鼎鼎的性能分析专家:Brendan Gregg,现在工作在Netflix,之前工作在Sun,在Sun公司的时候,他就做了大量的性能分析和tracing相关的工作,在Sun的Solaris上存在一种传说中的性能分析和Debug神器: Dtrace,然而,可惜的是,在我们现在的Linux操作系统上并没有Dtrace神器(这可能是因为Dtrace是从Soloris操作系统的衍生品无法迁移到别的操作系统上),Brendan Gregg 在Netflix后,继续利用他的业余时间,利用他曾经在Soloris上的性能分析经验,和对Dtrace工具的理解,研发基于Linux操作系统上的上类似于Dtrace的工具,曾经他在早期的kernel版本上基于perf研发了perf-tools工具,后面在eBPF进入kernel后,开始基于eBPF做性能工具研发的工作,比如bcc工具集,最近又参与了bpftrace的工具。本文主要是Brendan Gregg在介绍 bpftrace在2018年的开发进展,以及对bpftrace的介绍和对Dtrace的区别介绍。
Linux阅码场
2019/06/04
6.2K0
强劲的Linux Trace工具:bpftrace (DTrace 2.0) for Linux 2018
推荐阅读
相关推荐
Linux 可观测性 BPF&eBPF 以及 BCC&bpftrace 认知
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档