[转帖]linux 内核跟踪神器 BPF 及实战

linux,内核,跟踪,神器,bpf,实战 · 浏览次数 : 0

小编点评

**引言** 随着计算机系统变得越来越复杂,人们想要详细地了解软件和系统内核的行为也变得越来越困难。由于系统中“黑天鹅”事件越来越多,很多“黑天鹅”事件其实是长期没有被发现的“灰犀牛”事件,因此,从系统中收集和分析数据显得至关重要。 **BPF 和 eBPF 内核工具** BPF (Berkeley Packet Filter) 是一种内核工具,用于监控并分析网络流量。BPF 可以在内核代码中动态地添加代码,来收集和分析内核运行状态。 BPF 是一种扩展 Berkeley Packet Filter 的缩写,它在 2014 年被正式并入 Linux 内核主线。 **BCC、bpftrace 和 IO Visor** * **BCC** 是一个高级语言框架,用于开发 BPF 跟踪程序。 * **bpftrace** 是一个专用于创建 BPF 工具的高级语言支持框架。 * **IO Visor** 是一个 Linux 基金会项目,提供 BPF 工具的封装。 **安装和配置** * **BCC**:使用 `sudo apt install bpfcc-tools linux-headers-$(uname -r)` 或 `sudo snap install bcc` 安装。 * **bpftrace**:使用 `sudo apt install bpftracefedora` 或 `sudo dnf install -y bpftrace` 安装。 * **IO Visor**:使用 `sudo docker run` 或 `docker run` 等方法安装。 **快速上手** * 使用 `execsnoop` 工具跟踪进程创建的工具 `hello_world`。 * 使用 `bpftrace` 跟踪进程执行 `sys_enter_openat` 系统调用。 **总结** BPF、bcc、bpftrace 和 IO Visor 是用于监控内核运行状态的工具,它们可以帮助我们跟踪进程执行、收集内核性能数据并分析事件源。

正文

https://cloud.tencent.com/developer/article/2031857?areaSource=103001.19&traceId=rX8kmZPurwFtXqEtY-bY-

 

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++、Python、Java 调用的用户端接口。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() 系统调用的跟踪:

与[转帖]linux 内核跟踪神器 BPF 及实战相似的内容:

[转帖]linux 内核跟踪神器 BPF 及实战

https://cloud.tencent.com/developer/article/2031857?areaSource=103001.19&traceId=rX8kmZPurwFtXqEtY-bY- 1. 引言 作为一个程序员,在日常工作中,我们往往对于程序的运行情况十分关注,而随着计算机系统

[转帖]linux中内核的一个不错的参数somaxconn

最近发现很多内核优化参数都记不住了,写下文章来备记,方便以后查看. 编辑 /etc/sysctl.conf 文件,在里面加入如下内容:(有注释) #设置系统对最大跟踪的TCP连接数的限制(CentOS 5.6无此参数) net.ipv4.ip_conntrack_max = 25000000 #最大

[转帖]linux【监控】BCC – 用于Linux性能监视,网络和更多的动态跟踪工具

https://blog.51cto.com/ghostwritten/5344917 文章目录​ ​1. ubuntu安装bcc​​​ ​2. centos安装bcc​​​ ​3. cachestat 缓存统计​​​ ​4. cachetop 缓存命中​​​ ​5. filtop 跟踪内核中文件的

[转帖]使用 Crash 工具分析 Linux dump 文件

前言 Linux 内核(以下简称内核)是一个不与特定进程相关的功能集合,内核的代码很难轻易的在调试器中执行和跟踪。开发者认为,内核如果发生了错误,就不应该继续运行。因此内核发生错误时,它的行为通常被设定为系统崩溃,机器重启。基于动态存储器的电气特性,机器重启后,上次错误发生时的现场会遭到破坏,这使得

[转帖]bcc/ebpf 安装及示例(2019)

http://arthurchiao.art/blog/bcc-ebpf-tutorial-zh/ eBPF 是 Linux 内核近几年最为引人注目的特性之一,通过一个内核内置的字节码虚拟机,完 成数据包过滤、调用栈跟踪、耗时统计、热点分析等等高级功能,是 Linux 系统和 Linux 应用 的功

[转帖]Linux内核Memory Barrier

https://zhuanlan.zhihu.com/p/138886949 硬件模型 Memory barrier跟cache的实现有很强的相关性, 掌握cache的实现硬件对理解memory barrier很有帮助. 以基本的MESI协议为例, 它主要实现了4种状态: Modified. Cac

[转帖]【技术剖析】9. 使用 NMT 和 pmap 解决 JVM 资源泄漏问题

https://bbs.huaweicloud.com/forum/thread-168749-1-1.html 作者:宋尧飞 > 编者按:笔者使用 JDK 自带的内存跟踪工具 NMT 和 Linux 自带的 pmap 解决了一个非常典型的资源泄漏问题。这个资源泄漏是由于 Java 程序员不正确地使

[转帖]BCC-Tool 工具使用

1. 概述 BCC是一个用于跟踪内核和操作程序的工具集,其软件包中包含了一些有用的工具和例子,它扩展了BPF(Berkeley Packet Filters),通常被称为eBPF , 在Linux3.15中首次引入,但大多数BCC的功能需要Libux4.1及以上版本。 BCC使用C语言进行内核检测,

[转帖]Linux kernel内存管理之overcommit相关参数

前言 了解 linux kernel内存管理,首先可以从用户空间的角度来看kernel的内存管理,执行ls /proc/sys/vm的命令,就可以看到vm运行的所有参数,其中就包含了跟overcommit相关的参数。 Memory overcommit概念介绍 要了解这类参数首先要理解什么是comm

[转帖]Linux性能分析:理解系统平均负载

Linux系统中,平均负载是指单位时间内,处于可运行状态和不可中断状态的进程数。它不仅包括了正在使用CPU的进程,也包括处于不可打断的睡眠状态的进程—它们是在等待其它系统资源如磁盘 I/O 等的进程。而CPU使用率,是单位时间内CPU繁忙情况的统计,跟平均负载并不一定完全对应。 有诸多方式监测系统平