欢迎光临
专业Linux运维二十年

SystemTap

  1. SystemTap 简介

systemtap 是一款用于诊断 系统性能或功能问题的开源。它使得对运行中的 linux 系统进行诊断和调试变得更加便捷和高效。有了 systemtap,开发者和调试人员无需重新编译内核、安装新内核或重启系统等繁琐步骤。为了解决系统问题或提升性能,开发者只需编写一些脚本即可。systemtap 本身提供了一系列名为「tapset」的预定义脚本,开发者可以通过 systemtap 的命令行接口对正在运行的内核进行诊断和调试,从而避免了修改或插入调试代码、重新编译内核、安装内核和重启系统等繁琐工作。

  1. 原理

SystemTap 使用了一种类似于 awk 和 C 语言的脚本语言(类似于 Dtrace 的 D 语言)。它仅使用三种数据类型:整数(integers)、字符串(strings)以及关联数组(associative Arrays)。SystemTap 提供了完整的控制结构,包括块(blocks)、条件(conditionals)、循环(loops)和函数(functions)。语句分割符 ; 是可选的。变量无需声明类型,它们会根据上下文自动推测和检查。SystemTap 使用 kprobe 提供的接口来实现探测。对于每个探测点,需要定义探测点和相应的处理函数。探测点指的是 kprobe 中被探测的函数或指令地址(也称为内核事件),但在 SystemTap 中,用户可以指定源文件、源代码的某一行或一个异步事件,如周期性定时器。探测点使用层次化的命名方式,探测点处理函数可以立即输出数据,类似于 printk,并能查看内核数据。脚本随后被转换为 C 代码,并编译成内核模块。探测点根据内核的 DWARF 调试信息映射到内核的虚地址(因此 SystemTap 要求用户必须准备好可用的内核调试信息)。所有脚本内容在转换时进行严格检查,运行时也会进行检查(如无限循环、内存使用、递归和无效指针等),因此具有良好的安全性,不会影响正在运行的系统(这对于生产系统非常重要)。SystemTap 包含了一个黑名单,列出了不能被 SystemTap 探测的函数,因为它们可能导致无限探测循环、锁重入等问题。SystemTap 脚本文件的后缀是 .stp,使用 SystemTap 定义的脚本语言。一个 SystemTap 脚本描述了要探测的探测点,并定义了相关处理函数,每个探测点对应于一个内核函数、事件或函数内部的某个位置。关联的处理函数将在内核执行到相应探测点时被执行。tapsets 是一个脚本库,包含许多 tapset,每个 tapset 通常为某一内核子系统或特定功能块预定义了一套探测点、辅助函数或全局变量,供用户脚本或其他 tapset 引用。它们定义的一些数据可以被每个探测点处理函数或脚本使用,这些数据通常通过使用处理函数语句块(HSB Handler Statement Block)来导出,HSB 语句块中的变量就是被导出的数据。tapset 通常由该内核子系统的开发者或对子系统非常了解的开发者编写,使用脚本语言和 C 语言,并且已经经过测试和验证,可以安全使用。tapsets 是 SystemTap 发行包的一部分。SystemTap 实现了一个脚本转换器/翻译器,当用户执行一个 SystemTap 脚本时,SystemTap 首先对其进行分析和一些安全检查。如果脚本引用了 SystemTap 预定义的脚本库提供的函数,SystemTap 也将读取脚本库获取相应代码。对于一些内核变量或符号的引用,必须根据内核调试信息解析到相应地址。然后,脚本被转换为 C 代码,在此转换中,SystemTap 将根据需要添加必要的锁和安全检查代码。探测点之间共享的变量将被转换为适当的静态声明并保护,每组本地变量被转换到一个合成的调用帧结构中,以避免消耗内核的栈空间。关联到探测点的处理函数被封装成一个接口函数,该函数调用适当的 kprobe 接口函数来注册该探测点。生成的 C 代码包含了一些对运行时 tapset 的引用,运行时 tapset 库提供了许多 SystemTap 接口函数,如通用查询表、受限内存管理、启动、关闭、I/O 操作以及其他一些函数。生成的 C 代码编译链接后生成一个可加载的内核模块。为了快速获得运行结果,SystemTap 使用了 relayfs。加载生成的内核模块后,该模块的初始化函数初始化自身,然后调用 kprobe 接口函数注册脚本中定义的探测点。当内核运行到注册的探测点时,相应的处理函数被调用,用户在处理函数中的输出语句将调用 relayfs 接口函数输出结果数据,用户在处理函数中也可以调用一些内核的性能测量函数。当用户主动停止或脚本设定的条件满足时,模块将调用退出函数卸载已经注册的探测点并进行一些清理处理,然后卸载模块自身。SystemTap 在运行时启动了一个进程,专门负责通过 relayfs 读取模块的输出数据并即时输出给用户。

  1. Stap 命令详细参考

Stap 命令行参数详细介绍。

  1. 脚本语言

SystemTap 中有两个重要的概念:事件(event)和处理函数(handler)。在 SystemTap 执行一个脚本时,它会监控事件(event)。当事件发生时,Linux 内核就会执行处理函数(handler)。事件的类型包括开始/结束、定时器超时、会话终止等。处理函数就是在指定事件发生时需要执行的一些脚本语句。

  1. 附录

SystemTap 官网教程文档

以上就是SystemTap的详细内容,更多请关注php中文网其它相关文章!

脚本之家
赞(0) 打赏
未经允许不得转载:Linux老运维 » SystemTap

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫