什么是bpftrace?
bpftrace 是一个用于编写和运行 eBPF 程序的高级语言和工具。它允许用户通过简洁的语法编写追踪脚本,监控系统中的各种事件,如函数调用、系统调用、内存分配等。
目前我们在使用libbpf进行Linux可观测性软件的开发工作,使用bpftrace进行探针位置可行性验证是一个非常简单好用的工具。
安装bpftrace
在安装之前,请确保你的系统内核版本至少为4.9,并且启用了eBPF支持。
Debian/Ubuntu系统:
sudo apt-get update
sudo apt-get install bpftrace
Centos/OpenEuler
sudo yum update
sudo yum install bpftrace
tracepoint追踪系统调用
bpftrace脚本文件通常以.bt
结尾。你可以直接在命令行上编写和运行bpftrace脚本,也可以将脚本保存到文件中再运行。
示例:打印每次调用open
系统调用时的进程ID和文件名
bpftrace -e 'tracepoint:syscalls:sys_enter_open { printf("PID %d opening file: %s\n", pid, str(args->filename)); }'
在上面的命令中:
-e
选项用于指定一个bpftrace脚本。tracepoint:syscalls:sys_enter_open
是事件探针(probe),表示我们要追踪的事件。(进入/sys/kernel/tracing/events/syscalls,可以看到系统的所有系统调用){ printf("PID %d opening file: %s\n", pid, str(args->filename)); }
是事件触发时执行的操作。
kprobe追踪内核函数调用
bpftrace 允许用户追踪内核函数的调用,例如追踪do_sys_open
函数的入口和出口:
bpftrace -e 'kprobe:do_sys_open { printf("Entering do_sys_open: PID %d\n", pid); }'
bpftrace -e 'kretprobe:do_sys_open { printf("Exiting do_sys_open: PID %d\n", pid); }'
uprobe追踪用户空间函数调用
使用uprobe
和uretprobe
来追踪用户空间函数调用。例如,追踪/bin/bash
中的readline
函数:
bpftrace -e 'uprobe:/bin/bash:readline { printf("Calling readline\n"); }'
bpftrace -e 'uretprobe:/bin/bash:readline { printf("Finished readline\n"); }'
使用bpftrace的变量和内置函数
bpftrace 提供了丰富的变量和内置函数来获取各种系统信息。例如,使用@
定义的映射(map)可以统计某个事件的发生次数:
bpftrace -e 'tracepoint:syscalls:sys_enter_open { @counter[comm] = count(); }'
常用命令总结
bpftrace -l
:列出系统中所有可用的探针。bpftrace -e 'script'
:运行内联的bpftrace脚本。bpftrace script.bt
:运行保存在文件中的bpftrace脚本。bpftrace -v
:启用详细模式。
bpftrace 是一个功能强大且灵活的工具,适用于各种系统监控和调试任务。通过掌握bpftrace的基本命令和用法,您可以在不影响系统性能的前提下,深入了解系统和应用程序的行为,为性能优化和问题排查提供有力支持。
希望这篇教程能帮助你快速上手bpftrace,并应用于实际工作中。如有任何问题或建议,欢迎在评论区留言讨论。