首页 > 运维 > linux运维 > 正文

SystemTap

看不見的法師
发布: 2025-07-15 08:40:21
原创
593人浏览过
  1. SystemTap 简介

systemtap 是一款用于诊断 linux 系统性能或功能问题的开源工具。它使得对运行中的 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 读取模块的输出数据并即时输出给用户。

SystemTap

  1. Stap 命令详细参考

Stap 命令行参数详细介绍。

纳米搜索
纳米搜索

纳米搜索:360推出的新一代AI搜索引擎

纳米搜索 495
查看详情 纳米搜索
  1. 脚本语言

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

  1. 附录

SystemTap 官网教程文档

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

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号