使用 SystemTap 对系统进行动态追踪

起因

之前跟章亦春(春哥)讨论如何排查系统的长尾问题的时候,春哥举了他之前在 Cloudflare 排查的一个例子,一个请求比较慢,所以需要确定是网络的问题,还是磁盘 IO 的问题,但这几个地方的 99.9% metric 都非常正常,所以推测应该是长尾问题。于是春哥在 TCP,I/O 相关的地方用 SystemTap 加上 probe,然后发现网络能正常的处理,但在一些 I/O 操作的时候有很慢的情况,确定了 I/O 有问题,最后在追查到磁盘有一个地方有损坏。

那时候我就对 SystemTap 印象深刻了。虽然之前也有很多动态追踪的实践,但通常还是对 perf 使用较多,对 SystemTap 的研究比较少,但这次交流之后,让我确定对于一些长尾疑难问题,SystemTap 是一个非常好的方法,值得花时间去研究一下,

介绍

SystemTap 是一个动态追踪工具,它使用 kprobes 组件去帮助用户更深入的学习和监控整个系统(无论是 kernel 还是 application)的状态,而且运行的时候只对系统有极小的开销。虽然很多工具像 netstat,ps,top,iostat 等也能够了解很多信息,但 SystemTap 能做到更多,譬如知道 application 和 operating system 之间的交互,不同进程的交互,不同 kernel subsystem 的交互,以及一些疑难杂症的排查等。

脚本处理

SystemTap 提供了一套脚本语言,让用户非常方便的编写自定义测量以及分析工具去定位问题。

image.png

当用户编写一个脚本 probe 文件之后,首先会经过 parse 生成 AST,然后在 elaborate 阶段,解析相关的符号和引用信息,然后在转成 C 的代码并编译成一个 kernel module。然后在 load module,开始 probe,运行结束之后,将收集的信息高效的传输给用户空间,然后 unload module。

脚本语言

SystemTap 的语法非常简单,如果熟悉 C,AWK 等语言的会非常容易上手,我们以一个非常简单的例子稍作说明:

global bt_stats
global quit

probe begin {
    warn("Start tracing. Wait for 10 sec to complete.\n")
}

probe process("/lib*/libc-2.17.so").function("__memcpy_ssse3_back") {
    if (pid() == target()) {
        if (quit) {
            foreach (bt in bt_stats) {
                print_ustack(bt)
                printf("\t%d\n\n", @count(bt_stats[bt]))
            }

            exit()
        } else {
            bt = ubacktrace()
            bt_stats[bt] <<< 1
        }

    }
}


probe timer.s(1) {
    quit = 1
}

上面是我之前想看 TiKV memcpy 到底在哪里调用的一个简单脚本。

变量

我们定义了两个全局变量,quitbt_stats,在 SystemTap 里面,变量需要提前声明,我们并不需要提前声明变量的类型,SystemTap 能自己判断这个变量的使用类型。上面的 quit 是一个 int 变量,我们在 1s 之后会将其设置为 1,然后程序退出。bt_stats 是一个类似 AWK 关联数组,它的 key 就是对应的堆栈,而 value 则是一个统计变量。

统计变量是 SystemTap 里面用来进行聚合操作的变量,譬如上面的 <<< 1,每次匹配了 memcpy 函数之后,我们就会记录下对应堆栈的次数。然后在结束的时候我们可以用统计函数,譬如 count,得到实际的个数。

Probe

Probe 就是定义了实际的探针 points,当对应的事件触发的时候,就会去调用对应 probe 的 block 代码,譬如上面我们 probe 了 process("/lib*/libc-2.17.so").function("__memcpy_ssse3_back"),我们知道 TiKV 进程会使用 libc 的 memcpy 函数,所以使用 process 从 libc 的 so 里面找到对应的 function。上面我们是知道对应的函数名字,也可以通过 function(name@file:line)等规则来匹配相关的函数。

我们也可以 probe kernel 函数,譬如 probe kernel.funcion(*init*) 来匹配所有 kernel 里面的 init 函数。所以如果要精通 SystemTap 来动态追踪,我们其实需要更深刻的去理解整个 kernel 的软件栈和 API。

SystemTap 也提供了 Tapsets 简化了一些 kernel 的 probe 编写,譬如我们可以通过 probe netdev.transmitprobe netdev.receive 来 probe 网络的包收发。

总结

上面简单的介绍了 SystemTap 的相关知识,可以看到,如果想更多了解,可以看 SystemtTap 自己的相关文档,也可以通过官方 example 深入学习。但要更加熟练的使用 SystemTap 进行诊断,对 Linux 整个软件栈的了解是必不可少的,所以后面看看 kernel 代码是有必要的。

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

推荐阅读更多精彩内容