动态追踪技术:Linux喜迎DTrace

简介:

通过前面几篇文章的介绍,我们已经可以通过一系列命令,从不同维度获得操作系统当前的性能运行情况。 另外,借助类似Ganglia这样的开源产品,持续不断地实施性能数据采集和存储,我们基于时间序列的历史性能图形,就可以大致判读出计算集群的资源消耗情况和变化趋势。 但是,仅仅这些还是不够的,在很多情况下,我们希望能够知道:“慢,是为什么慢;快,又是为什么快”。 如果要回答这个问题,就必须引入另外一件神兵利器:动态追踪技术(Dynamic Tracing)。

鉴于这套兵器过于复杂(牛逼),属于专家级技能, advanced performance analysis and troubleshooting tool。据称掌握该技能需要耗费大约100小时以上,所以如果不是对于系统性能问题有极致追求,以及变态般地技术狂热,建议绕过本文。

为了便于展开,今天先起个头,重点梳理下动态追踪技术的发展简史和目前的生态环境。更加具体详细的内容,会在后续的文章中陆续发表。

上月底,正当全国人民翘首以盼光棍节的时候,开源社区传来一则重要新闻: Linux 4.9-rc1发布,正式合并了一项重要特性:BPF追踪(Timed sampling)。

系统性能领域的国际导师Brendan Gregg,感动得都快哭了,当即在Twitter上表示这是一个重要的里程碑! 他随后又写了一篇长文《DTrace for Linux 2016》,以示庆祝。

As a long time DTrace user and expert, this is an exciting milestone! --Brendan Gregg

Linux 合并了BPF而已嘛,跟DTrace这个劳什子有什么关系呢?

DTrace 是动态追踪技术的鼻祖,源自 Solaris 操作系统,提供了高级性能分析和调试功能,它的源代码采用 CDDL 许可证,不兼容 Linux 内核使用的 GPLv2 许可证,无法直接移植。 当然,江湖上还有另外一种说法,Linux之所以一直没有原生支持DTrace,是因为Linus 觉得这玩意没什么必要。 Anyway,随着 BPF跟踪的最后主要功能合并到 Linux 4.9-rc1,Linux 现在有了类似 DTrace 的高级分析和调试功能。

Linux 这次合并的BPF(The Berkeley Packet Filter ),和Ganglia一样,来自于加州大学伯克利分校(这所大学很有意思,以后还要反复提到)。 BPF,顾名思义,最早只是一个纯粹的封包过滤器,大家比较熟知的netfilter,就是基于BPF实现的动态编译器。 后来在很多牛人的参与下,进行了扩展,得到了一个所谓的 eBPF,可以作为某种更加通用的内核虚拟机。 通过这种机制,我们其实可以在 Linux 中构建类似 DTrace 那种常驻内核的动态追踪虚拟机。

Linux 没有 DTrace(名字),但现在有了 DTrace(功能)

严格来说,DTrace这个词本身,已经并不是狭义上基于Solaris的那套工具了,而是代表的是后现代操作系统的一整套工具家族和方法论。

History

当时 Solaris 操作系统的几个工程师花了几天几夜去排查一个看似非常诡异的线上问题。 开始他们以为是很高级的问题,就特别卖力,结果折腾了几天,最后发现其实是一个非常愚蠢的、某个不起眼的地方的配置问题。 自从那件事情之后,这些工程师就痛定思痛,创造了 DTrace 这样一个非常高级的调试工具,来帮助他们在未来的工作当中避免把过多精力花费在愚蠢问题上面。 毕竟大部分所谓的“诡异问题”其实都是低级问题,属于那种“调不出来很郁闷,调出来了更郁闷”的类型。---《漫谈动态追踪技术》

通观DTrace的演变过程,几乎相当于一部现代操作系统系统的发展史,细查起来,极其复杂。 但是有两个人非常值得关注,一个是国际级的布道师,一个是国内的代表人物, 初学者完全可以通过阅读他们的文章、代码,甚至微博/Twitter动态,了解动态追踪技术的实际应用情况。

Brendan Gregg

前SUN性能工程师,最早的DTrace用户,出版了包括《性能之巅》在内的一大批书籍,囊括了性能问题领域的技术、工具、方法论等方方面面。 是动态追踪技术当之无愧的首席布道师。他维护的个人博客发布了大量的原创内容,并且持续保持着相当的活跃度。可以作为第一手的学习资料。

Twitter: 个人网站:

章亦春 网名 agentzh。开源项目OpenResty创始人,编写了很多 Nginx 的第三方模块, Perl 开源模块,以及最近一些年写的很多 Lua 方面的库。 他发表过的《漫谈动态追踪技术》,是目前唯一由Brendan认证的中文资料,入门首选。 另外,他本人也在目前的工作、开源项目运营中大量使用动态追踪技术。

Linux 追踪器选型

动态追踪技术最复杂的地方在于追踪器种类繁多,让人一时无从下手。 根据前人的一些经验总结,建议按照以下路径进行选择:

普通模式

适用于:开发者, 系统管理员, DevOps, SRE

CPU分析

perf_events的应用很广泛,配合Brendan Gregg老师研究的火焰图工具,可以分析程序在所有代码基的资源消耗,精确定位到函数级。 例如

进程追踪

 
 
  1. # ./execsnoop 
  2. Tracing exec()s. Ctrl-C to end
  3.    PID   PPID ARGS 
  4.  22898  22004 man ls 
  5.  22905  22898 preconv -e UTF-8 
  6.  22908  22898 pager -s 
  7.  22907  22898 nroff -mandoc -rLL=164n -rLT=164n -Tutf8 

HARD模式

适用于:性能或内核工程师

Understanding all the Linux tracers to make a rational decision between them a huge undertaking.

  1. ftrace 内核hacker的最爱。已经包含在内核,能够支持 tracepoints, kprobes, and uprobes, 并提供一些能力: 事件追踪, 可选择过滤器和参数; 事件计数和时间采样,内核概览;基于函数的路径追踪。
  2. perf_events Linux用户的主要追踪器之一,它的源代码在内核中,通常在一个 linux-tools-common包。
  3. eBPF 基于内核的虚拟机
  4. SystemTap 最强有力的追踪器。它可以做几乎所有的事情: 分析,打点, kprobes, uprobes (源子 SystemTap), USDT, 内核编程等。
  5. LTTng 事件收集器, 优于其它追踪器,支持多种事件类型,包括 USDT。
  6. ktap 一个很有前景的追踪器,基于lua内核虚拟机
  7. dtrace4linux 个人开发者业余产出 (Paul Fox) ,将 Sun DTrace迁移到 Linux。
  8. OL DTrace Oracle Linux DTrace,将 DTrace 迁移到Oracle Linux的实现。
  9. sysdig 一种新型追踪器, 能够基于类似tcpdump的命令操作 syscall events, 再用lua后处理。



作者:睿哥杂货铺
来源:51CTO

目录
相关文章
|
25天前
|
Linux 数据安全/隐私保护 虚拟化
Linux技术基础(1)——操作系统的安装
本文是龙蜥操作系统(Anolis OS) 8.4 的安装指南,用户可以从[龙蜥社区下载页面](https://openanolis.cn/download)获取ISO镜像。安装方法包括物理机的光驱和USB闪存方式,以及虚拟机中的VMware Workstation Pro设置。安装过程涉及选择语言、配置安装目标、选择软件集合和内核,设置Root密码及创建新用户。安装完成后,可通过文本模式或图形化界面验证系统版本,如Anolis OS 8.4,标志着安装成功。
|
28天前
|
Linux 数据处理 C++
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(一)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
69 0
|
28天前
|
网络协议 Ubuntu Linux
Linux 动态/静态配置ip网卡信息
Linux 动态/静态配置ip网卡信息
34 0
|
28天前
|
存储 Linux API
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(三)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
30 1
|
28天前
|
消息中间件 Linux 数据处理
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(二)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
30 1
|
3月前
|
Java Linux 程序员
Linux 下 JNA 调用动态连接库文件 so
Linux 下 JNA 调用动态连接库文件 so
59 0
|
26天前
|
网络协议 Shell Linux
【Shell 命令集合 网络通讯 】Linux 追踪数据包在网络中的路径 traceroute命令 使用指南
【Shell 命令集合 网络通讯 】Linux 追踪数据包在网络中的路径 traceroute命令 使用指南
34 0
|
3月前
|
监控 Linux Shell
【Linux技术专题】「夯实基本功系列」带你一同学习和实践操作Linux服务器必学的Shell指令(排查问题指令 - 下)
在线上排查问题时,查询日志、查看系统配置和分析操作系统信息是至关重要的。这些操作可以帮助我们深入了解软件和服务的兼容性,并解决潜在的问题。在本次学习中,我们将介绍并深入学习一些我在处理类似问题时常用的指令。通过掌握这些指令,你将能够更加高效地定位和解决线上问题,提高系统的稳定性和性能。让我们一同进入这个学习过程吧!
43 0
【Linux技术专题】「夯实基本功系列」带你一同学习和实践操作Linux服务器必学的Shell指令(排查问题指令 - 下)
|
17天前
|
运维 监控 安全
linux日志分析与追踪
在Linux中,日志分析涉及检查 `/var/log` 下的不同文件,如`messages`、`auth.log`、`kern.log`等,以及Web服务器和数据库日志。使用`tail`、`grep`、`awk`等工具实时查看和搜索日志,`logrotate`管理日志大小,`journalctl`处理Systemd日志,而`Splunk`等工具则用于集中式分析。分析技巧包括异常检测、时间关联和阈值监控。安全事件追踪结合登录失败日志、网络嗅探和IDS/IPS。日志链路追踪在分布式系统中尤为重要,帮助定位服务调用问题。有效的日志管理和分析能增强系统安全和故障排除能力。
19 7
|
23天前
|
弹性计算 Linux Shell
Linux技术基础(2)——文本处理
文本处理实验:探索[Vim](https://developer.aliyun.com/adc/scenario/aced2264751f4866a8340de4cf9db0fa)的命令、输入和底线模式,学习文本编辑快捷操作,如光标移动、删除、复制和粘贴。了解如何使用底线命令模式进行文件保存、退出及搜索替换。同时,掌握`cat`、`more`、`less`、`head`、`tail`等文本查看命令,以及`stat`、`wc`、`file`、`diff`等文件处理命令。利用`grep`、`sed`、`awk`和`cut`进行文本搜索、替换和分析。