3.1 Systemp 简介
从今天开始我们将学习第一个可编程的动态追踪工具 Systemtap。本节是 Systemtap 的一个基本介绍。
1. Systemtap 简介
动态追踪技术起源于 Solaris 系统的 DTrace。Dtrace 有 Linux Mac OS X 等系统的移植版,但是实现的都差强人意,不支持很多高级特性。Systemtap 是 Redhat 开源的 Linux 上的动态追踪工具,是 Linux 上目前最成熟的动态追踪框架。
1.1 Systemtap 框架
Systemtap 的框架如上图所示:
- Systemtap 并不是 Linux 内核的一部分,因此第一步需要把 Systemtap 自己的“小语言”脚本(有点像 D 语言)动态编译成一个 Linux 内核模块的 C 源码,并加载到内核才能运行
- Systemtap 使用的我们前面介绍的内核工具框架
- DWARF 是Linux的调试符号表格式
整个SystemTap脚本所做的,无非就是声明感兴趣的事件,然后添加对应的处理程序。当SystemTap脚本运行时,SystemTap会监控声明的事件;一旦事件发生,Linux内核会临时切换到对应的处理程序,完成后再重拾原先的工作。
可供监控的事件种类繁多:进入/退出某个函数,定时器到期,会话终止,等等。处理程序由一组SystemTap语句构成,指明事件发生后要做的工作。其中包括从事件上下文中提取数据,存储到内部变量中,输出结果。
1.2 Systemtap 的优缺点
Systemtap 有如下的优缺点:
- 首先,它并不是 Linux 内核的一部分,就是说它并没有与内核紧密集成,所以它需要一直不停地追赶主线内核的变化。
- 另一个缺点是,它需要动态编译,因此经常需要在线部署 C 编译器工具链和 Linux 内核的头文件。出于这些原因,SystemTap 脚本的启动相比 DTrace 要慢得多
- 无论是 DTrace 还是 SystemTap,其实都不支持编写完整的调试工具,因为它们都缺少方便的命令行交互的原语。所以我们才看到现实世界中许多基于它们的工具,其实最外面都有一个 Perl、Python 或者 Shell 脚本编写的包裹。比如 stap++
- SystemTap 的优点是它有非常成熟的用户态调试符号的自动加载,同时也有循环这样的语言结构可以去编写比较复杂的探针处理程序,可以支持很多很复杂的分析处理。
GitHub 上面,有很多针对像 Nginx、LuaJIT 和操作系统内核这样的系统软件,也有一些是针对更高层面的像 OpenResty 这样的 Web 框架。有兴趣的朋友可以查看 GitHub 上面的 nginx-systemtap-toolkit、perl-systemtap-toolkit 和 stappxx 这几个代码仓库。
2. stap 安装
SystemTap需要内核信息,这样才能注入指令。此外,这些信息还能帮助SystemTap生成合适的检测代码。 这些必要的内核信息分别包括在特定内核版本所对应的-devel,-debuginfo和-debuginfo-common包中。对于“标准版”内核(指按照常规配置编译的内核),所需的-devel和-debuginfo等包命名为:
- kernel-debuginfo
- kernel-debuginfo-common
- kernel-devel: 通常已经安装
下面是Centos7 安装过程的示例:
|
|
2.1 为其他计算机生成检测模块
为了避免为所有带监测机器配置 Systemtap 环境的问题,SystemTap提供了交叉检测(cross-instrumentaion)的功能:
- 在一台计算机上运行SystemTap脚本,生成在另一台机器上可用的SystemTap检测模块
- 目标机器仅需安装 systemtap-runtime 来使用生成的SystemTap检测模块
创建和分发的过程如下:
|
|
3. stap
stap
- 作用: 从SystemTap脚本中读取探测指令,把它们转化为C代码,构建一个内核模块,并加载到当前的Linux内核中运行
- 参数:
-v
让SystemTap会话输出更加详细的信息.重复该选项多次来提高执行信息的详尽程度-o file_name
: 将输出重定向到file_name-S size[,count]
: 将输出文件的最大大小限制成sizeMB,存储文件的最大数目为count-x process_id
: 设置SystemTap处理函数target()为指定PID,target() 是 systemtap 脚本的内置函数-c 'command'
: 运行command,并在command结束时退出。同时会把target()设置成command运行时的PID-e script
: 直接执行给定的脚本-F
: 进入SystemTap的飞行记录仪模式,并在后台运行该脚本
- man:
man probe::ioblock.request
3.1 stap 飞行记录模式
SystemTap的飞行记录仪模式允许你长时间运行一个SystemTap脚本,并关注最新的输出。飞行记录仪模式会限制输出的生成量。
飞行记录仪模式还可以分成两种:内存型(in-memory)和文件型(file)。无论哪一种 SystemTap脚本都是作为后台进程运行。
内存型:
有 -F
选项,但没有指定 -o
选项时启用,SystemTap会把脚本输出结果存储在内核内存的缓冲区内。默认情况下,缓冲区大小为1MB.你可以使用-s(小s)来调整这个值
|
|
文件型
同时指定 -F
,-o
选项时启用,-S选项来控制输出文件的大小和数目-S选项来控制输出文件的大小和数目。
|
|