Linux SystemTap tool
SystemTap 是 Linux 下的一个强大的动态追踪工具,主要用于内核空间的性能分析与问题诊断。它允许用户编写探测脚本来插入追踪点(probe)并收集内核或用户态程序的运行时信息,功能类似于 DTrace、ftrace、eBPF 等工具,但更侧重灵活性与脚本化能力。
SystemTap 主要组成
| 组件 | 说明 |
|---|---|
stap | 主命令行工具,负责编译和运行脚本 |
.stp | SystemTap 脚本文件,定义 probe 和 handler |
staprun | 用于运行 SystemTap 生成的内核模块 |
stapio | 用户态 I/O 通道程序,数据从内核模块传回用户态 |
SystemTap runtime | 内核模块运行时支持库 |
kernel module (.ko) | stap 编译 .stp 生成的临时内核模块 |
SystemTap 工作流程原理
- 用户编写
.stp脚本
probe kernel.function("do_sys_open") {
printf("open called with filename: %s\n", argstr)
}
stap编译脚本
SystemTap 使用内建编译器(前端解析 + C 代码生成)将脚本编译为一个内核模块。其流程为:
.stp 脚本
↓
解析与语义分析(frontend)
↓
转换为 C 代码(C backend)
↓
调用 gcc 编译为 .ko 模块
- 加载内核模块并执行 probe
staprun 被用来加载生成的内核模块。内核模块中注册 probe handler(通过 kprobe、tracepoints、uprobes 等)并等待触发。
- 内核模块运行时回传数据
内核模块运行后,每当匹配的 probe 被触发,就会调用对应的 handler,采集的数据通过 relayfs 或 netlink 回传给用户态,由stapio打印或写文件。
SystemTap 支持的探测点类型
| 类型 | 示例 | 说明 |
|---|---|---|
kprobe | kernel.function("vfs_read") | 内核函数入口 |
kretprobe | kernel.function("vfs_read").return | 内核函数返回 |
tracepoint | kernel.trace("sched_switch") | 使用静态 tracepoint |
uprobes | process("/bin/ls").function("main") | 用户态程序函数 |
timer | timer.s(1) | 每秒触发 |
begin/end | probe begin {} | 程序开始和结束 |
SystemTap 与其他工具比较
| 工具 | 特点 | 适用场景 |
|---|---|---|
| SystemTap | 强脚本语言,功能强大,但需内核模块支持 | 内核分析、复杂事件逻辑 |
| ftrace | 内核内建,低开销,配置简单 | 低层函数跟踪 |
| perf | 高性能采样,支持硬件事件 | 性能瓶颈定位 |
| eBPF | 安全、可持久运行,社区活跃 | 云原生监控,内核透明追踪 |
SystemTap 的优缺点
优点
- 脚本化语法简洁,可读性强
- 支持复杂条件逻辑与计数器
- 可追踪用户态与内核态
- 内核级别动态插桩,能力强大
缺点
- 编译模块需要 debug kernel headers 或内核源代码
- 加载内核模块具有一定安全隐患
- 兼容性依赖内核版本,容易 break
- 不支持非 root 用户(或需授权)
实际示例
示例 1:统计某个系统调用调用次数
global open_count
probe kernel.function("do_sys_open") {
open_count++
}
probe end {
printf("open 被调用了 %d 次\n", open_count)
}
示例 2:追踪进程上下文切换
probe kernel.trace("sched_switch") {
printf("%s -> %s\n", $prev_comm, $next_comm)
}
SystemTap 安装与使用注意事项
安装依赖(以 Ubuntu 为例):
sudo apt install systemtap systemtap-runtime linux-headers-$(uname -r)
检查内核调试符号支持:
stap -v -e 'probe vfs.read { exit() }'
如果提示缺少 debug symbols,建议安装:
sudo apt install linux-image-$(uname -r)-dbgsym
总结
SystemTap 提供了强大、灵活的追踪能力,适合进行内核级别的性能调优和调试。相比 ftrace/perf 更适合需要定制逻辑和跨层次分析的高级场景。但由于其编译模块的方式限制了灵活性,在现代系统中逐渐被 eBPF 替代。
1011

被折叠的 条评论
为什么被折叠?



