4

systemtap 工具集介绍

 2 years ago
source link: https://blog.arstercz.com//intro-to-systemtap-toolkit/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Written by arstercz

-  2022-04-13

systemtap 工具集介绍

在文章Linux 系统动态追踪技术介绍中, 我们提到了 systemtap 相关的技术. systemtap 在 Linux 系统排错方面一直占据着很重要的角色, 其提供了很成熟的调试符号及复杂的探针处理程序, 可以在系统调用, 用户空间及内核空间几个方面实现细粒度的跟踪分析, 更详细的介绍可以参考 dynamic-tracing. systemtap-toolkit 工具集则是在此基础上,搜集并整理的一些常用的分析工具, 方便对 Linux 系统中一些疑难问题的跟踪处理. 下面的工具列表部分来源于网络, 进行了简单修改以支持 staprun 方式运行时可以指定额外的参数. 具体见参考部分.

biolatency.stp 获取块设备 I/O 延迟的分布.
disktop.stp 显示当前 I/O 读写的进程.
iotop.stp 取 io 占用最高的前 15 个进程.

accessfile_bypid 显示指定进程读写的文件信息.
fsslower.stp 获取读写延迟较大的进程.

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.3.254.119

编译模块运行

编译为内核模块后, 通过 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.3.254.119

这种方式适合线上系统的排错, 如下所示, 以内核模块方式运行线上系统仅需要以下安装包:

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK