SystemTap

1. 简介

  • SystemTap 是一个诊断 Linux 系统性能或功能问题的开源软件。它使得对运行时的Linux 系统进行诊断调式变得更容易、更简单。有了它,开发者或调试人员不再需要重编译、安装新内核、重启动等烦人的步骤。

  • 为了诊断系统问题或性能,开发者或调试人员只需要写一些脚本,而且 SystemTap 本身也提供了很多脚本,称为「tapset」方便开发,然后通过 SystemTap 提供的命令行接口就可以对正在运行的内核进行诊断调试,以前需要的修改或插入调试代码、重新编译内核、安装内核和重启动等这些琐碎的工作完全消除。

2. 原理

Systemtap 使用了类似于 awk 和 C 语言的脚本语言(类似于 Dtrace 的 D 语言)。

  • 它只使用了三种数据类型,整数(integers)、字符串(strings)以及关联数组(associative Arrays)。

  • 它有完整的控制结构,包括块(blocks)、条件(conditionals)、循环(loops)和函数(functions)。

  • 语句分割符 ; 是可选的。

  • 变量不需要声明类型,它们是根据上下文自动推测和检查的,它使用了 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 读去模块的输出数据并即时地输出给用户。

3. Stap命令

详细参考 Stap命令行参数详细介绍

4. 脚本语言

SystemTap 中有两个重要的概念: event 和 handler。

  • 在 SystemTap 执行一个脚本时,它会监控事件(event)。

  • 当事件发生时, Linux 内核就会执行 handler。

事件的类型有开始/结束、定时器超时、会话终止等。 handler 就是在制定事件发生时需要做的一些脚本语句。

详细参考SystemTap官网教程文档

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容