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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【云原生技术研究】 从bpftrace看如何利用eBPF实现内核追踪
bpftrace提供了一种快速利用eBPF实现动态追踪的方法,可以作为简单的命令行工具或者入门级编程工具来使用。本文以bpftrace为例,介绍如何利用eBPF实现内核的动态追踪。
绿盟科技研究通讯
2020/09/01
2.5K0
【云原生技术研究】 从bpftrace看如何利用eBPF实现内核追踪
Linux 可观测性 BPF&eBPF 以及 BCC&bpftrace 认知
对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》
山河已无恙
2024/01/17
7690
Linux 可观测性 BPF&eBPF 以及 BCC&bpftrace 认知
BPF:BCC(BPF Compiler Collection)工具集认知
不必太纠结于当下,也不必太忧虑未来,当你经历过一些事情的时候,眼前的风景已经和从前不一样了。——村上春树
山河已无恙
2024/06/21
4470
BPF:BCC(BPF Compiler Collection)工具集认知
eBPF 入门开发实践教程一:介绍与快速上手
Linux内核一直是实现监控/可观测性、网络和安全功能的理想地方, 但是直接在内核中进行监控并不是一个容易的事情。在传统的Linux软件开发中, 实现这些功能往往都离不开修改内核源码或加载内核模块。修改内核源码是一件非常危险的行为, 稍有不慎可能便会导致系统崩溃,并且每次检验修改的代码都需要重新编译内核,耗时耗力。
云微
2023/02/24
1.6K0
技术分享 | 如何使用 bcc 工具观测 MySQL 延迟
爱可生测试团队成员,主要负责 TXLE 开源项目相关测试任务,擅长 Python 自动化测试开发,最近醉心于 Linux 性能分析优化的相关知识。
爱可生开源社区
2020/03/26
1.7K0
技术分享 | 如何使用 bcc 工具观测 MySQL 延迟
eBPF 概述:第 3 部分:软件开发生态
在本系列的第 1 部分和第 2 部分中,我们对 eBPF 虚拟机进行了简洁的深入研究。阅读上述部分并不是理解第 3 部分的必修课,尽管很好地掌握了低级别的基础知识确实有助于更好地理解高级别的工具。为了理解这些工具是如何工作的,我们先定义一下 eBPF 程序的高层次组件:
用户7686797
2021/11/24
7370
eBPF 概述:第 3 部分:软件开发生态
eBPF技术简介
“eBPF 是我见过的 Linux 中最神奇的技术,没有之一,已成为 Linux 内核中顶级子模块,从 tcpdump 中用作网络包过滤的经典 cbpf,到成为通用 Linux 内核技术的 eBPF,已经完成华丽蜕变,为应用与神奇的内核打造了一座桥梁,在系统跟踪、观测、性能调优、安全和网络等领域发挥重要的角色。为 Service Mesh 打造了具备 API 感知和安全高效的容器网络方案 Cilium,其底层正是基于 eBPF 技术”
CNCF
2020/08/24
17.8K1
eBPF技术简介
基于ebpf的性能工具-bpftrace
在现代计算机系统中,了解系统的内部运行情况对于诊断问题、优化性能以及进行安全监控至关重要。bpftrace作为一款强大的跟踪工具,为开发人员和系统管理员提供了一种独特的方式来监视和分析Linux系统的内部运行。本文描述bpftrace的原理和使用。
Rice加饭
2023/09/02
9290
基于ebpf的性能工具-bpftrace
eBPF 入门开发实践教程一:Hello World,基本框架和开发流程
在本篇博客中,我们将深入探讨eBPF(Extended Berkeley Packet Filter)的基本框架和开发流程。eBPF是一种在Linux内核上运行的强大网络和性能分析工具,它为开发者提供了在内核运行时动态加载、更新和运行用户定义代码的能力。这使得开发者可以实现高效、安全的内核级别的网络监控、性能分析和故障排查等功能。
云微
2023/08/14
1.5K0
BPF 之巅:洞悉 Linux 系统和应用性能
BPF 是近年来Linux 系统技术领域一个巨大的创新。作为 Linux 内核的一个关键发展节点,其重要程度不亚于虚拟化、容器、SDN 等技术。
博文视点Broadview
2021/04/29
3.2K0
BPF 之巅:洞悉 Linux 系统和应用性能
强劲的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
eBPF 入门开发实践指南一:介绍 eBPF 的基本概念、常见的开发工具
Linux内核一直是实现监控/可观测性、网络和安全功能的理想地方,但是直接在内核中进行监控并不是一个容易的事情。在传统的Linux软件开发中,实现这些功能往往都离不开修改内核源码或加载内核模块。修改内核源码是一件非常危险的行为,稍有不慎可能便会导致系统崩溃,并且每次检验修改的代码都需要重新编译内核,耗时耗力。
云微
2023/02/24
8220
eBPF 概述:第 3 部分:软件开发生态
在本系列的第 1 部分和第 2 部分中,我们对 eBPF 虚拟机进行了简洁的深入研究。阅读上述部分并不是理解第 3 部分的必修课,尽管很好地掌握了低级别的基础知识确实有助于更好地理解高级别的工具。为了理解这些工具是如何工作的,我们先定义一下 eBPF 程序的高层次组件:
233333
2023/11/27
3270
eBPF 概述:第 3 部分:软件开发生态
eBPF学习 – 入门
BPF是Berkeley Packet Filter(伯克利数据包过滤器)得缩写,诞生于1992年,其作用是提升网络包过滤工具得性能,并于2014年正式并入Linux内核主线。 BPF提供一种在各种内核事件和应用程序事件发生时允许运行一小段程序的机制,使得内核完全可编程,允许用户定制和控制他们的系统以解决相应的问题。 BPF是一项灵活而高效的技术,由指令集、存储对象和辅助函数等几部分组成。其采用了虚拟指令集规范,运行时BPF模块提供两个执行机制:解释器和即时编译器(JIT)。在实际执行前,BPF指令必须通过验证器(verifer)的安全性检查以确保BPF程序自身不会崩溃或者损坏内核。 扩展后的BPF通常缩写为eBPF,但是官方的说法仍然是BPF,并且内核中也只有一个执行引擎即BPF(扩展后的BPF)。
全栈程序员站长
2022/11/08
1.1K0
eBPF学习 – 入门
eBPF原理介绍与编程实践
注:本文包括了ebpf的原理介绍、流程分析、相关资料链接、工具编写实战等,可以选择感兴趣的部分直接阅读;鉴于作者语文水平有限,很多地方描述可能不清楚,有错误或疑问欢迎指出交流
johnazhang
2022/07/18
2.7K1
eBPF 入门开发实践教程零:介绍 eBPF 的基本概念、常见的开发工具
eBPF 是一项革命性的技术,起源于 Linux 内核,可以在操作系统的内核中运行沙盒程序。它被用来安全和有效地扩展内核的功能,而不需要改变内核的源代码或加载内核模块。eBPF 通过允许在操作系统内运行沙盒程序,应用程序开发人员可以在运行时,可编程地向操作系统动态添加额外的功能。然后,操作系统保证安全和执行效率,就像在即时编译(JIT)编译器和验证引擎的帮助下进行本地编译一样。eBPF 程序在内核版本之间是可移植的,并且可以自动更新,从而避免了工作负载中断和节点重启。
云微
2023/08/12
2.9K0
eBPF 入门开发实践教程零:介绍 eBPF 的基本概念、常见的开发工具
好技能 | 如何开发第一个 eBPF 程序
理解了整个收包过程以后,我们就能明确知道Linux收一个包的CPU开销了。首先第一块是用户进程调用系统调用陷入内核态的开销。第二块是CPU响应包的硬中断的CPU开销。第三块是ksoftirqd内核线程的软中断上下文花费的。
穿过生命散发芬芳
2024/11/22
1180
好技能 | 如何开发第一个 eBPF 程序
【eBPF笔记前篇】介绍、开发环境搭建、原理简介、case
之前一个老板说“xxx组的同学是一定要把eBPF用到得心应手”,因为之前是做性能压测相关工作,个人感觉压测其实并不复杂,复杂的是压测后的问题定位,而eBPF则是定位问题的有效工具,我们可以透过eBPF去洞悉内核的运行状态,帮助我们去做故障诊断、网络优化、性能监控、以及安全控制等生产环境中的各种问题。
历久尝新
2022/02/11
5.7K0
【eBPF笔记前篇】介绍、开发环境搭建、原理简介、case
LINUX 性能专家 Brendan Gregg博文拜读系列<1>-附九张性能图片
在深入Linux系统的复杂世界中,性能优化始终是SRE关注的热点。最近在拜读国际著名的 LINUX 性能专家 Brendan Gregg 的个人博客和技术书籍。他的工作不仅涵盖了系统性能的监控和分析,还深入探讨了性能问题的根源及其解决方案。通过他的个人博客和技术书籍,我们可以窥见Linux性能优化的精髓,学习到如何利用各种工具和方法来提升系统效率,确保应用的顺畅运行。将会结合 Brendan Gregg博文与个人理解 出一个拜读系列博文。
五分钟学SRE
2024/04/10
8640
LINUX 性能专家 Brendan Gregg博文拜读系列<1>-附九张性能图片
BPF 和 Go: Linux 中的现代内省形式
本文将向你介绍为什么我们需要像 BPF 这样的东西,并帮助你了解何时及如何使用它,以及它是如何帮助作为工程师的你改进你正在进行的项目的。我们还将研究它与 Go 相关的一些详细信息。
深度学习与Python
2021/12/28
7760
BPF 和 Go: Linux 中的现代内省形式
推荐阅读
相关推荐
【云原生技术研究】 从bpftrace看如何利用eBPF实现内核追踪
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档