文章采集组合工具(Linux追踪系统高效/低开销的追踪工具(图))

优采云 发布时间: 2021-11-17 06:20

  文章采集组合工具(Linux追踪系统高效/低开销的追踪工具(图))

  译者序言

  Linux系统上有很多用于跟踪和调试的工具,比如内核态、用户态、网络、IO等不同层次的工具。这篇文章是从 Linux 跟踪系统和它们如何组合在一起翻译而来的 - Julia Evans。这是我在学习Systemtap原理时发现的资料。文章 我简单地讲了 Linux 跟踪系统和一些来龙去脉。事实上,它是有效的,大多数使用的工具或多或少都基于 文章 中提到的机制之一。

  多年来,我一直对 Linux 跟踪系统感到困惑。strace、ltrace、kprobes、tracepoints、uprobes、ftrace、perf、eBPF是如何连接在一起的,有什么意义?

  上周,我去了“Papers We Love”1,然后我和Kamal去了蒙特利尔理工大学(LTTng项目开始的地方)和Suchakra一起出去玩,最后我想我明白了所有这些部分是如何组合在一起的,现在,或多或少。但是,这个文章还是有一些错误,如果你发现任何错误,请告诉我!(推特 ID:b0rk)

  这篇文章文章我将strace放在一边(它是我最喜欢的工具)因为开销太高了这篇文章文章我们只会讨论相对高效/低开销的跟踪系统。这个 文章 与示例 采集器 无关(这是另一个话题!)。只是跟踪。

  上周学到的东西让我真正理解了——你可以把linux追踪系统拆分成数据源(追踪数据的来源)、采集数据源的机制(类似于ftrace)和追踪前端(以交互方式)采集/分析数据的工具)。整体看起来有些支离破碎,模糊不清,但至少是一种更容易理解的方式。

  以下是我们将要讨论的内容:

  “真香”数据采集机制的前端。那么我应该使用什么样的跟踪工具呢?希望这篇文章有用!

  它仍然有点复杂,但以这种方式分解它确实有助于我理解(感谢 Brendan Gregg 在 Twitter 上提出这样的分解!)

  图片版

  这里有 6 个草图总结了这个 文章 的内容:

  

  

  

  

  

  

  

  

  

  

  

  

  可以跟踪什么?

  您可能想要跟踪几种不同类型的事物:

  以上都是可能的,但是跟踪环境其实很复杂。

  数据源:kprobes、tracepoints、uprobes、dtrace probes等。

  好,我们来说说数据源!这是最有趣的部分——获取程序数据的地方太多了。

  我想将它们分为“探针”(kprobes/uprobes)和“跟踪点”(tracepoints/ltng-ust)。实际上,我认为我没有使用正确的术语。有 2 个不同的概念可以帮助您理解。

  探针

  接下来是 kprobes!那是什么?以下段落来自 LWN 文章 的一篇文章:

  KProbes 是一种 Linux 内核调试机制,也可用于监视生产系统中的内部事件。您还可以使用它来查找性能瓶颈、记录特定事件、跟踪问题等。

  回顾一下,基本上 kprobes 允许您在运行时动态更改 Linux 内核的汇编代码(例如,插入额外的汇编指令),并跟踪指令何时被调用。我认为kprobes是跟踪linux内核函数调用的,实际上它可以跟踪内核中的任意指令并检查寄存器。是不是很神奇?

  Brendan Gregg 有一个 krpobe 脚本,可以用来玩 krpboes。

  例如!让我们使用 kprobes 来跟踪在我们的计算机上打开的文件。我执行了以下命令:

  $ sudo ./kprobe 'p:myopen do_sys_open filename=+0(%si):string'

  之后,我的电脑立即输出正在打开的文件。干净整洁!

  您会注意到 kprobes 接口本身有点晦涩——例如,您必须知道 do_sys_open 的 filename 参数在 %si 寄存器中,并且您还必须取消引用该指针并告诉 kprobes 系统它是一个字符串。

  我认为 kprobes 在以下 3 种情况下很有用:

  您正在跟踪系统调用。所有的系统调用都有相应的内核函数,比如do_sys_open。你在调试一些网络栈或者文件IO性能问题,你对调用的内核函数足够了解,这对你跟踪它们很有帮助(不是不可能!毕竟linux内核也是代码)。您是内核开发人员,或者您正在尝试调试不经常发生的内核错误!(我不是内核开发人员)。

  长袍

  Uprobes有点像kprobes,只不过它不检测内核函数,而是用户空间函数(比如malloc)。您可以阅读 brendan gregg 在 2015 年发表的一篇文章 文章。

  我对uprobes工作原理的理解是:

  您决定要跟踪 libc 中的 malloc 函数。您要求 Linux 内核为您跟踪 libc 中的 malloc 函数。Linux找到加载到内存中的libc的副本(应该只有一个副本,与所有进程共享),然后更改malloc的代码很容易被追踪。Linux使用某种方式向你传递数据(后面我们会讲如何“require Linux”和“以某种方式获取数据”的原理)

  你可以用它做的一件事是监控其他人在他们的 bash 终端中输入的内容,这太棒了!

<p>[email protected]~/c/perf-tools> sudo ./bin/uprobe &#39;r:bash:readline +0($retval):string&#39;

Tracing uprobe readline (r:readline /bin/bash:0x9a520 +0($retval):string). Ctrl-C to end.

bash-10482 [002] d... 1061.417373: readline: (0x42176e

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线