ebpf学习

简介: ebpf学习

WSL2搭建ebpf环境

默认情况下,由于缺少所需的内核模块,EBPF 程序不会在 WSL2 上运行。以下示例错误是
此问题的指示:
modprobe: 错误: ../libkmod/libkmod.c:586 kmod_search_moddep() 无法打开 moddep 文件 '/lib/modules/4.19.84-microso
ft-standard/modules.dep.bin'
modprobe:致命:在目录 /lib/modules/4.19.84-microsoft-standard 中找不到模块 kheaders
chdir(/lib/modules/4.19.84-microsoft-standard/build): 没有那个文件或目录

要解决此问题,您需要使用缺少的内核模块重建 WSL2 内核。以下说明适用于 Ubuntu 18.04 WSL2。

git clone https://github.com/microsoft/WSL2-Linux-Kernel.git
cd WSL2-Linux-Kernel
sudo apt install flex bison build-essential libelf-dev libncurses-dev libssl-dev
cp Microsoft/config-wsl .config

修改.config

CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
# [optional, for tc filters]
CONFIG_NET_CLS_BPF=m
# [optional, for tc actions]
CONFIG_NET_ACT_BPF=m
CONFIG_BPF_JIT=y
# [for Linux kernel versions 4.1 through 4.6]
CONFIG_HAVE_BPF_JIT=y
# [for Linux kernel versions 4.7 and later]
CONFIG_HAVE_EBPF_JIT=y
# [optional, for kprobes]
CONFIG_BPF_EVENTS=y
# Need kernel headers through /sys/kernel/kheaders.tar.xz
CONFIG_IKHEADERS=y
CONFIG_NET_SCH_SFQ=m
CONFIG_NET_ACT_POLICE=m
CONFIG_NET_ACT_GACT=m
CONFIG_DUMMY=m
CONFIG_VXLAN=m

编译并安装内核

sudo apt install dwarves
export KERNELRELEASE=$(uname -r)
make KERNELRELEASE=$KERNELRELEASE -j 4
make KERNELRELEASE=$KERNELRELEASE modules -j 4
sudo make KERNELRELEASE=$KERNELRELEASE modules_install 
ls /lib/module/$(uname -r)
sudo mount -t debugfs debugfs /sys/kernel/debug

cd ./WSL2-Linux-Kernel-linux-msft-wsl-5.10.102.1/tools/bpf/bpftool
make
make install

安装bpf

sudo apt install bpfcc-tools

执行命令验证是否安装成功

execsnoop-bpfcc
sudo apt-get install -y make gcc libssl-dev bc libelf-dev libcap-dev \
  clang gcc-multilib llvm libncurses5-dev git pkg-config libmnl-dev bison flex \
  graphviz

编译bcc

git clone https://github.com/iovisor/bcc.git
cd bcc
git submodule update --init 
mkdir /opt/bcc
cmake .. -DCMAKE_INSTALL_PREFIX=/usr
make -j4
make install

bpftrace

安装

对于 Ubuntu 19.04+、RHEL8+ 等系统,你可以直接运行下面的命令来安装 bpftrace:

# Ubuntu19.04+
apt install bpftrace
# RHEL8/CentOS8sudo 
dnf install -y bpftrace

而对于其他旧版本的系统或其他的发行版,你可以通过源代码编译的形式安装。至于具体的步骤,你可以参考它的安装文档,这里我就不展开讲了。

安装好 bpftrace 之后,你就可以执行 bpftrace -l 来查询内核插桩和跟踪点了。比如你可以通过以下几种方式来查询:


# 查询所有内核插桩和跟踪点
sudo bpftrace -l

# 使用通配符查询所有的系统调用跟踪点
sudo bpftrace -l 'tracepoint:syscalls:*'

# 使用通配符查询所有名字包含"execve"的跟踪点
sudo bpftrace -l '*execve*'

Ubuntu编译安装

sudo apt-get install -y libbpfcc-dev

sudo apt-get update
sudo apt-get install -y \
  bison \
  cmake \
  flex \
  g++ \
  git \
  libelf-dev \
  zlib1g-dev \
  libfl-dev \
  systemtap-sdt-dev \
  binutils-dev \
  libcereal-dev \
  llvm-12-dev \
  llvm-12-runtime \
  libclang-12-dev \
  clang-12 \
  libpcap-dev \
  libgtest-dev \
  libgmock-dev \
  asciidoctor
git clone https://github.com/iovisor/bpftrace
mkdir bpftrace/build; cd bpftrace/build;
../build-libs.sh
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j8
sudo make install

bpftrace默认安装到/usr/local/bin/bpftrace,工具默认位置 /usr/local/share/bpftrace/tools,可以通过使用-DCMAKE_INSTALL_PREFIX=/usr/local​改变安装位置。

问题

No such file or directory: /sys/kernel/debug/tracing/available_filter_functions

bpftrace -l
software:alignment-faults:
software:bpf-output:
software:context-switches:
software:cpu-clock:
software:cpu-migrations:
software:dummy:
software:emulation-faults:
software:major-faults:
software:minor-faults:
software:page-faults:
software:task-clock:
hardware:backend-stalls:
hardware:branch-instructions:
hardware:branch-misses:
hardware:bus-cycles:
hardware:cache-misses:
hardware:cache-references:
hardware:cpu-cycles:
hardware:frontend-stalls:
hardware:instructions:
hardware:ref-cycles:
No such file or directory: /sys/kernel/debug/tracing/available_filter_functions

原因:需要挂载debugfs

sudo mount -t debugfs debugfs /sys/kernel/debug

使用

bpftrace 的一个核心概念是探针点,即 eBPF 程序可以连接到的(内核或用户空间的)代码中的测量点,可以分成以下几大类:

kprobe——内核函数的开始处 kretprobe——内核函数的返回处 uprobe——用户级函数的开始处 uretprobe——用户级函数的返回处 tracepoint——内核静态追踪点 usdt——用户级静态追踪点 profile——基于时间的采样 interval——基于时间的输出 software——内核软件事件 hardware——处理器级事件
所有可用的 kprobe / kretprobe、tracepoints、software 和 hardware 探针可以通过这个命令列出:

 sudo bpftrace -l

uprobe / uretprobe 和 usdt 是用户空间探针,专用于某个可执行文件。

通过 bpftrace 过滤语法使用 PID 过滤出某个特定进程调用的系统调用:

sudo bpftrace -e 't:syscalls:sys_enter_* / pid == 1234 / { @[probe] = count(); }'

分析每个进程正在写的字节数:

 sudo bpftrace -e 't:syscalls:sys_exit_write /args->ret > 0/ { @[comm] = sum(args->ret); }'

bpftrace 连接操作块到写系统调用的返回探针(t:syscalls:sys_exit_write),然后使用过滤器丢掉代表错误代码的负值(/arg->ret > 0/)。

映射的键 comm 代表调用系统调用的进程名;内建函数 sum() 累计每个映射项或进程写的字节数;args 是一个 bpftrace 内建指令,用于访问追踪点的参数和返回值。如果执行成功,write 系统调用返回写的字节数,arg->ret

用于访问这个字节数。

参考资料

github

手册页

参考指南

教程

超好用的 Linux 性能工具:bpftrace
Installing bcc

Enable EBPF on WSL2

相关文章
|
网络协议 Linux Android开发
探索eBPF:Linux内核的黑科技(下)
探索eBPF:Linux内核的黑科技
|
5月前
|
存储 编解码 安全
阿里云服务器8核16G、8核32G、8核64G最新实例收费标准与活动价格参考
阿里云服务器8核16G、8核32G、8核64G属于较高的配置,是中大型企业用户在选择配置时选择较多的,在阿里云目前的活动中,第9代云服务器有这几个配置可选,其中计算型c9i实例8核16G配置5958.52元1年起,通用型g9i实例8核32G配置7551.94元1年起,内存型r9i实例8核64G配置9937.12元1年起领取阿里云优惠券之后可获满减优惠。本文将详细介绍阿里云这几款配置不同实例规格的收费标准与当下的活动价格,以供参考选择。
1087 17
|
存储 安全 Linux
谈谈优雅的钩子--bpftrace
bpftrace是一个内核跟踪工具,简单来说就是在函数上挂个钩子,挂上钩子后就可以将函数的入参和返回值取出来再放入程序进行二次编程,最终能让程序按照我们的意图来对函数进行观测。
|
Java 编译器 Linux
JVM/编译器/CPU,究竟谁是卧底?一个曾经困扰我一个月的 bug
任何复杂的系统都可能因为一个小小的疏漏而无法运转,本文记录了一个困扰作者一个月的 bug 最终拨云见日的过程。
|
Windows
windows 安装mpv player
windows 安装mpv player
414 2
|
存储 人工智能 数据中心
Q3财报:阿里云收入增长13%至317.42亿元
Q3财报:阿里云收入增长13%至317.42亿元
1126 13
|
人工智能 算法 编译器
AscendC从入门到精通系列(一)初步感知AscendC
Ascend C是CANN推出的一种编程语言,专为算子开发设计,支持C/C++标准,旨在提高开发效率与运行性能。通过Ascend C,开发者能在昇腾AI处理器上高效实现自定义算法。本文档介绍了如何使用Ascend C编写和运行一个简单的“Hello World”程序,包括核函数的编写、主程序调用及CMake配置,展示了Ascend C的基本使用流程。
|
数据采集 算法 vr&ar
基于国产化芯片的神经腕带技术方案,实现META神经腕带效果,创新交互方式
唯理科技发布了一款基于自研WLS128芯片的神经腕带产品,能够通过采集前臂肌肉神经电与肢体运动信息实现自然手势识别。该产品具备微弱肌电信号采集、多通道SEMG数据采集、低功耗设计、高采样率、专业算法支持等特性,支持多种数据格式导出及第三方数据接口,应用场景广泛。唯理科技是国内少数拥有自研芯片的脑电脑机接口技术厂商,致力于为客户提供一体化的软硬件解决方案。
|
负载均衡 监控 网络协议
Nginx:负载均衡小专题(三)
Nginx:负载均衡小专题(三)
654 1
|
数据采集 人工智能 供应链
案例分析:西门子智能工厂
案例分析:西门子智能工厂
1867 0