您现在的位置是:网站首页>技术百科技术百科

巧用 Linux Tracer

小大寒2024-01-01[技术百科]博学多闻

巧用 Linux Tracerdtrace4linux是一个由Paul Fox主导的项目,旨在将Sun DTrace移植到Linux,但尚不完整,属于实验性工具。Oracle Linux的DTrace是一个较为成熟的项目,已经包含了多种有用的提供者。sysdig是一个新型跟踪器,支持系统调用事件,具有tcpdump类语法和lua后处理功能。该文还提到了ftrace、perf_events、eBPF等工具,以及它们在Linux性能分析中的应用,并提供了相关的阅读资源和示例代码。 ‌ 《原网页

巧用 Linux Tracer

跟踪器是一个高级的性能分析和故障排除工具,但不要让它吓到你……如果你使用过 strace(1) 或 tcpdump(8) – 那你已经使用过一个跟踪器。系统跟踪器能够看到的不仅仅是系统调用或数据包,因为它们通常可以跟踪任何内核或应用程序软件。

Linux 上有如此多的跟踪器,以至于选择让人眼花缭乱。每个跟踪器都有一个官方(或非官方)的独角兽吉祥物,我们甚至有足够多的吉祥物来做一档儿童节目。

你应该使用哪个跟踪器?

我为两个受众群体回答了这个问题:大多数人,以及性能/内核工程师。这也会随着时间的推移发生变化,所以我可能每年都需要发布一次跟进。

对于大多数人

大多数人(开发人员、系统管理员、DevOps、SRE 等)不会深入学习系统跟踪器。这里是你最有可能需要了解和操作跟踪器的内容:

1. 使用 perf_events 进行 CPU 性能分析

使用 perf_events 来进行 CPU 性能分析。可以将分析结果可视化为 火焰图。例如:

        git clone --depth 1 https://github.com/brendangregg/FlameGraph
        perf record -F 99 -a -g -- sleep 30
        perf script | ./FlameGraph/stackcollapse-perf.pl | ./FlameGraph/flamegraph.pl > perf.svg
        

Linux perf_events(也叫做“perf”,因为它是通过该命令使用的)是 Linux 用户的官方跟踪器/性能分析器。它包含在内核源代码中,并且得到了很好的维护(目前正在快速增强)。它通常通过 linux-tools-common 包进行安装。

perf 可以做很多事情,但如果我只能推荐你学习其中一个,它就是 CPU 性能分析。尽管这技术上并不是“事件跟踪”,因为它是采样方式。最难的部分是让完整的堆栈和符号正常工作,我在我的 Linux Profiling at Netflix 演讲中涉及了 Java 和 Node.js 的内容。

2. 了解其他可能性

正如我的一位朋友曾说过:“你不需要知道如何操作 X 射线机,但你 确实 需要知道,如果你吞下了一枚硬币,X 射线是一个选择!”你需要知道跟踪器能够做什么,这样当你的业务真正需要时,你可以以后学习如何做,或者雇一个懂的人。

简而言之:几乎任何东西的性能都可以通过跟踪进行理解。文件系统内部、TCP/IP 处理、设备驱动、应用程序内部。阅读我的 lwn.net 关于 ftrace 的文章,并浏览我的 perf_events 页面,这都是一些跟踪(和性能分析)功能的例子。

3. 请求前端工具

如果你在购买性能分析工具(并且有许多公司销售这些工具),请要求提供 Linux 跟踪支持。想象一下一个直观的点击界面,可以暴露内核内部信息,包括不同堆栈位置的延迟热图。我在我的 Monitorama 演讲 中描述了这样一个界面。

我自己也创建并开源了一些前端工具,尽管是针对 CLI(而不是 GUI)。这些工具也可以帮助人们更快速、更轻松地从跟踪器中受益。例如,在我的 perf-tools 中,跟踪新进程:

        # ./execsnoop
        跟踪 exec()。按 Ctrl-C 结束。
           PID   PPID ARGS
         22898  22004 man ls
         22905  22898 preconv -e UTF-8
         22908  22898 pager -s
         22907  22898 nroff -mandoc -rLL=164n -rLT=164n -Tutf8
        [...]
        

在 Netflix,我们正在创建 Vector,一个实例分析工具,它也最终应该会支持 Linux 跟踪器。

对于性能或内核工程师

我们的工作要困难得多,因为大多数人可能会要求我们弄清楚如何追踪某些内容,以及应该使用哪个追踪工具。要正确理解一个追踪工具,通常需要花费至少一百个小时。了解所有Linux追踪工具,以便在它们之间做出理性决策,是一项庞大的任务。(我可能是唯一接近做到这一点的人。)

我推荐以下两种方式:

A) 选择一个功能强大的追踪工具,并对此进行标准化。这将涉及大量时间来弄清楚其细节和在测试环境中的安全性。我目前推荐使用最新版本的SystemTap(即从源码构建)。我知道有些公司选择了LTTng,并且对其很满意,尽管它不如SystemTap强大(不过,它更安全)。如果sysdig添加了tracepoints或kprobes,它也可能成为另一个候选工具。

B) 按照我在Velocity教程中的流程图进行。这意味着尽可能多地使用ftrace或perf_events,随着eBPF的集成,逐步使用它,然后使用SystemTap/LTTng等其他追踪工具来填补空白。这是我在Netflix当前工作的做法。

按追踪工具分类的评论:

1. ftrace

我喜欢Ftrace,它是内核黑客的最佳朋友。它内置在内核中,可以处理tracepoints、kprobes和uprobes,并提供一些功能:事件追踪,带可选过滤器和参数;事件计数和定时,在内核中汇总;以及函数调用流追踪。有关示例,请参见内核源中的ftrace.txt。它通过/sys进行控制,旨在由单个root用户使用(尽管你可以通过缓冲区实例进行黑客改造以支持多用户)。它的接口有时可能有些麻烦,但它非常可黑客化,而且有前端:主要的ftrace作者Steven Rostedt创建了trace-cmd,我也创建了perf-tools集合。我最大的不满是它不可编程,因此你不能例如保存并获取时间戳、计算延迟,然后将其存储为直方图。你需要将事件转储到用户级别,然后进行后处理,代价较高。通过eBPF,它可能变得可以编程。

2. perf_events

perf_events是Linux用户的主要追踪工具,它的源代码在Linux内核中,通常通过linux-tools-common包添加。也叫“perf”,它的前端通常用于追踪并将数据转储到文件(perf.data),它的效率相对较高(动态缓冲),然后再进行后处理。它能做大部分ftrace能做的事情。它不能进行函数调用流追踪,并且在可黑客化性上稍差(因为它具有更好的安全性/错误检查)。但它可以进行性能分析(采样)、CPU性能计数器、用户级堆栈转换,并且可以消费调试信息来进行带有局部变量的行级追踪。它还支持多个并发用户。与ftrace一样,它目前还不能在内核中编程,直到可能的eBPF支持(已经有补丁提案)。如果有一个我推荐大家学习的追踪工具,那就是perf,因为它能解决大量问题,并且相对安全。

3. eBPF

扩展伯克利数据包过滤器(eBPF)是一个内核中的虚拟机,可以高效地在事件上运行程序(JIT)。它最终可能为ftrace和perf_events提供内核编程功能,并增强其他追踪工具。目前,它由Alexei Starovoitov开发,尚未完全集成,但到4.1版本时,内核中已经有足够的功能支持一些令人印象深刻的工具:例如,块设备I/O的延迟热图。作为参考,请参见Alexei的BPF幻灯片,以及他的eBPF示例

4. SystemTap

SystemTap是最强大的追踪工具。它可以做所有事情:性能分析、tracepoints、kprobes、uprobes(来自SystemTap)、USDT、内核编程等。它将程序编译为内核模块并加载——这种方法在保证安全性方面很棘手。它也在树外开发,过去曾遇到过一些问题(崩溃或冻结)。许多问题并非SystemTap的错——它通常是第一个使用某些追踪功能的工具,也因此是第一个遇到bug的工具。SystemTap的最新版本要好得多(你必须从源代码编译),但许多人仍然对早期版本有所畏惧。如果你想使用它,建议在测试环境中花时间使用,并在irc.freenode.net的#systemtap频道与开发人员交流。(Netflix有容错架构,我们使用过SystemTap,但可能不像你们那样担心安全性。)我最大的抱怨是它似乎假定你有内核的调试信息,而我通常没有。事实上,它在没有这些信息的情况下也能做很多事情,但文档和示例较少(我已经开始在这方面提供帮助)。

5. LTTng

LTTng具有优化的事件收集,比其他追踪工具更高效,并且支持多种事件类型,包括USDT。它在树外开发。它的核心非常简单:通过一组小且固定的指令将事件写入追踪缓冲区。这有助于使其既安全又快速。缺点是没有简单的方式进行内核编程。我一直听说这不是大问题,因为它已经过优化,尽管需要后处理,但依然能够很好地扩展。它还开创了一种不同的分析技术,更像是记录所有感兴趣的事件的黑箱,可以在GUI中以后进行研究。我担心这样的记录会错过我没有预见到的事件,但我真的需要花更多时间研究它,看看它在实际中效果如何。这是我花时间最少的追踪工具(没有特别原因)。

6. ktap

ktap曾是一个非常有前景的追踪工具,它使用内核中的lua虚拟机进行处理,并且在没有调试信息和嵌入式设备上也能正常工作。它进入了staging阶段,一度看起来会赢得Linux的追踪竞赛。然后eBPF开始进行内核集成,ktap的集成被推迟,直到它能够使用eBPF而不是自己的虚拟机。由于eBPF的集成仍然在进行,ktap的开发者们已经等了很长时间。我希望它能在今年晚些时候重新启动开发。

7. dtrace4linux

dtrace4linux 是大多数时候由一个人(Paul Fox)进行的兼职工作,目的是将 Sun 的 DTrace 移植到 Linux。它令人印象深刻,一些提供程序已经能够工作,但距离完成还有一些距离,更多的是一个实验性工具(不安全)。我认为关于许可证的问题让人们对贡献保持谨慎:它可能永远无法进入 Linux 内核,因为 Sun 是在 CDDL 许可证下发布的 DTrace;Paul 对此的做法是将其作为一个附加工具。我很希望在 Linux 上看到 DTrace,并希望这个项目能够完成,曾经在加入 Netflix 时,我也打算花时间来帮助它完成。然而,我已经将时间花在了使用内建的跟踪工具 ftrace 和 perf_events 上。

8. OL DTrace

Oracle Linux DTrace 是一个将 DTrace 引入 Linux,特别是 Oracle Linux 的严肃项目。多年来的多个版本显示了稳步的进展。开发者们甚至提到了改进 DTrace 测试套件的计划,这显示出项目的有前景态度。许多有用的提供程序已经完成:syscall、profile、sdt、proc、sched 和 USDT。我仍在等待 fbt(函数边界跟踪,用于内核动态跟踪),它将在 Linux 内核上发挥出色的作用。它的最终成功将取决于是否能吸引人们使用 Oracle Linux(并支付支持费用)。另一个问题是,它可能并非完全开源:内核组件是开源的,但我还没看到用户级代码。

9. sysdig

sysdig 是一个新的跟踪工具,能够使用类似 tcpdump 的语法在系统调用事件上操作,并且可以进行 lua 后处理。它令人印象深刻,很高兴看到系统跟踪领域的创新。它的限制是,目前只能处理系统调用事件,并且它将所有事件转储到用户层进行后处理。你可以通过系统调用做很多事情,尽管我希望它支持 tracepoints、kprobes 和 uprobes。我还希望它支持 eBPF,以便进行内核内的汇总。目前,sysdig 的开发者正在添加容器支持。关注这个项目的动态。

进一步阅读

都是使用跟踪工具方面的:

lwn.net

perf_eventsperf_events 示例

BPF-tools

systemtap-lwtools,展示了如何在没有内核调试信息的情况下使用 SystemTap。

ktapktap 示例 页面包括一些一行命令和脚本,尽管这些是针对早期版本的。

dtrace4linux系统性能书 中包含了一些示例,并且过去为一些问题开发了一些小的修复,例如 时间戳

OL DTrace:由于这是 DTrace 的直接移植,早期关于 DTrace 的工作应该是相关的(链接太多,无法在这里列出;请在 我的主页 搜索)。一旦这个项目更加完整,可能会开发一些特定的工具。

sysdigfileslowersubsecond offset spectrogram 函数。

阅读完毕,很棒哦!

文章评论

站点信息

  • 网站地址:www.xiaodahan.com
  • 我的QQ: 3306916637