systemtap 工具集介绍
在文章Linux 系统动态追踪技术介绍中, 我们提到了 systemtap
相关的技术. systemtap 在 Linux 系统排错方面一直占据着很重要的角色, 其提供了很成熟的调试符号及复杂的探针处理程序, 可以在系统调用, 用户空间及内核空间几个方面实现细粒度的跟踪分析, 更详细的介绍可以参考 dynamic-tracing. systemtap-toolkit
工具集则是在此基础上,搜集并整理的一些常用的分析工具, 方便对 Linux
系统中一些疑难问题的跟踪处理. 下面的工具列表部分来源于网络, 进行了简单修改以支持 staprun
方式运行时可以指定额外的参数. 具体见参考部分.
工具列表
io
biolatency.stp 获取块设备 I/O 延迟的分布.
disktop.stp 显示当前 I/O 读写的进程.
iotop.stp 取 io 占用最高的前 15 个进程.
fs
accessfile_bypid 显示指定进程读写的文件信息.
fsslower.stp 获取读写延迟较大的进程.
net
dropwatch.stp 查看数据包被 drop
的信息.
tcp_conn.stp 记录 tcp 的连接信息.
tcp_recv_queue.stp 显示指定 tcp 端口的 recv 状态的队列信息.
tcp_retrans.stp 查看指定 tcp 端口的数据包重传信息.
syscall
execve.stp 获取所有执行 execve
系统调用的进程信息.
threads_times.stp 统计线程在用户态和内核态运行的时间百分比.
topsys.stp 显示系统调用的信息.
编译运行说明
由于 systemtap 没有集成到内核主版本中, 再加上其可以动态的编译成 Linux 的内核模块, 因此实际的使用中需要我们在系统中安装内核版本对应的 header
以及 debug
相关的开发包. 以 RedHat/Centos
系统为例, systemtap
工具脚本的运行需要以下安装包:
kernel-3.10.0-957.27.2.el7.x86_64
kernel-headers-3.10.0-957.27.2.el7.x86_64
kernel-devel-3.10.0-957.27.2.el7.x86_64
kernel-debuginfo-3.10.0-957.27.2.el7.x86_64
kernel-debuginfo-common-x86_64-3.10.0-957.27.2.el7.x86_64
systemtap-4.0-9.el7.x86_64
在通过 stap
运行工具的时候需要进行以下 5 个阶段:
+----------+ +----------+ +-------------+ +----------+ +------+
| 解析脚本 | -> | 处理分析 | -> | 转为 C 代码 | -> | 编译模块 | -> | 运行 |
+----------+ +----------+ +-------------+ +----------+ +------+
如果系统安装了对应内核版本的 debuginfo, debuginfo-common
开发包, 可以通过以下两种方式运行工具:
直接运行
直接运行方式需要安装上述提到的所有依赖.
# stap tcp_conn.stp
TIME EUID UID GID CMD PID PORT IP_SOURCE
Tue Oct 29 19:48:11 2019 CST 996 996 994 redis-server 35307 6379 10.1.1.19
编译模块运行
编译为内核模块后, 通过 staprun
方式运行, 如果其他主机的内核版本和编译模块所在的主机相同, 可以直接拷贝模块到其他系统中使用 staprun
运行:
# stap -r `uname -r` tcp_conn.stp -m tcp_conn.ko -p4 #第四阶段
Truncating module name to 'tcp_conn'
tcp_conn.ko
# staprun tcp_conn.ko destport=6379
=> Only capture port: 6379
TIME EUID UID GID CMD PID PORT IP_SOURCE
Tue Oct 29 19:52:52 2019 CST 996 996 994 redis-server 35307 6379 10.1.1.19
可以预见, 这种方式适合线上系统的排错, 如下所示, 以内核模块方式运行线上系统仅需要以下安装包:
kernel-3.10.0-957.27.2.el7.x86_64
kernel-headers-3.10.0-957.27.2.el7.x86_64
kernel-devel-3.10.0-957.27.2.el7.x86_64
systemtap-runtime-4.0-9.el7.x86_64
参考
systemtap
systemtap-lwtools
youzan-systemtap-toolkit
openresty-systemtap-toolkit