先安装bpftrace:
apt-get install bpftrace #ubuntu系统
dnf install bpftrace ##fedroa系统
我通过ubuntu的apt安装的是0.14发行版,但bpftrace会出现"段错误"。我源码安装都没用,太🍀蛋了!!!
网上查阅到的解析就是,你再安装一遍新版本,v-0.14版本太老了。下载APPImage安装吧。
编写test.bt:
kprobe:ext2_read_folio
{
@start[tid] = nsecs;
printf("kprobe\n");
print(kstack());
}
kretprobe:ext2_read_folio
{
$us = (nsecs - @start[tid]) / 100;
printf("kretprobe, duration %d\n", $us);
delete(@start[tid]);
print(kstack());
}
然后执行命令
bpftrace test.bt &
mkfs.ext2 -F image
mount image /mnt
echo something > /mnt/file
echo 3 > /proc/sys/vm/drop_caches
cat /mnt/filetest.bt 脚本通过以下方式跟踪 ext2_read_folio 脚本中包含两个探针(kprobe 和 kretprobe),记录进入read函数和出read函数的时间戳,并计算。
BCC (BPF Compiler Collection) 是一个用于创建高效内核追踪和操作工具的工具包,基于扩展的伯克利包过滤器(eBPF)技术。本指南详细介绍了在Ubuntu 22.04上安装和验证BCC的步骤。
这是最简单快捷的安装方法,适用于大多数用户。
sudo apt-add-repository ppa:hadret/bpfcc
sudo apt-get updatesudo apt-get install -y bpfcc-tools python3-bpfcc# 列出已安装的BCC工具
find /usr -name "*-bpfcc" -type f | sort
# 验证Python模块
python3 -c "import bcc; print(bcc.__file__)"
# 测试运行BCC程序(例如execsnoop)
sudo execsnoop-bpfcc -h如果你需要最新版本或自定义构建,可以从源代码安装。
# 安装基本依赖
sudo apt-get update
sudo apt-get install -y bison build-essential cmake flex git libedit-dev \
libllvm14 llvm-14-dev libclang-14-dev python3 zlib1g-dev libelf-dev \
libfl-dev python3-pip
# 安装其他依赖
sudo apt-get install -y arping clang-14 dh-python libdbus-1-dev libluajit-5.1-dev \
luajit libpcap-dev libpython3-dev libzip-dev python3-netaddr python3-pyroute2
# 安装内核头文件
sudo apt-get install -y linux-headers-$(uname -r)cd ~
git clone https://github.com/iovisor/bcc.git
# 如果遇到网络问题,可以使用国内镜像:
# git clone https://gitee.com/mirrors/bcc.gitmkdir -p ~/bcc/build && cd ~/bcc/build
cmake -DCMAKE_INSTALL_PREFIX=/usr -DPYTHON_CMD=python3 ..
make -j$(nproc)
sudo make install# 验证Python模块
python3 -c "import bcc; print(bcc.__file__)"
# 测试BCC工具
sudo /usr/share/bcc/tools/execsnoop#!/usr/bin/python3
# 文件名: test_bcc.py
from bcc import BPF
# 定义BPF程序
program = """
int hello(void *ctx) {
bpf_trace_printk("Hello, BCC!\\n");
return 0;
}
"""
# 加载BPF程序
b = BPF(text=program)
b.attach_kprobe(event=b.get_syscall_fnname("clone"), fn_name="hello")
# 打印头部
print("正在跟踪clone()系统调用...")
print("按Ctrl+C退出")
# 读取并打印trace输出
try:
b.trace_print()
except KeyboardInterrupt:
pass运行此脚本:
chmod +x test_bcc.py
sudo ./test_bcc.pyBCC安装后提供了许多强大的工具,包括:
execsnoop-bpfcc - 跟踪新进程的执行opensnoop-bpfcc - 跟踪open()系统调用tcptracer-bpfcc - 跟踪TCP连接tcpconnect-bpfcc - 跟踪主动TCP连接tcpaccept-bpfcc - 跟踪被动TCP连接biosnoop-bpfcc - 跟踪块I/O延迟funccount-bpfcc - 统计函数调用次数stackcount-bpfcc - 统计内核堆栈轨迹使用这些工具时需要加上sudo权限。
sudo bpftrace -e 'kprobe:call_timeout { printf("Caller: %s\n", kstack); }'
sudo bpftrace -e 'kprobe:xprt_set_retrans_timeout_rtt { printf("Caller: %s", kstack); }'