摘要
- 动态追踪技术:DTrace for Linux
- Linux 追踪器选型
应用软件运行速度提升的关键在于有一个好的性能分析器(profiler)帮助指导程序开发。《黑客与画家》(Hackers & Painters)
Introduction to DTrace
What is DTrace
通过前面几篇文章的介绍,我们已经可以通过一系列命令,从不同维度获得操作系统当前的性能运行情况。另外,借助类似 Ganglia 这样的开源产品,持续不断地实施性能数据采集和存储,我们基于时间序列的历史性能图形,就可以大致判读出计算集群的资源消耗情况和变化趋势。但是,仅仅这些还是不够的,在很多情况下,我们希望能够知道:“慢,是为什么慢;快,又是为什么快”。如果要回答这个问题,就必须引入另外一件神兵利器:动态追踪技术(Dynamic Tracing)。
鉴于这套兵器过于复杂(牛逼),属于专家级技能, advanced performance analysis and troubleshooting tool。据称掌握该技能需要耗费大约100小时以上,所以如果不是对于系统性能问题有极致追求,以及变态般地技术狂热,建议绕过本文。为了便于展开,今天先起个头,重点梳理下动态追踪技术的发展简史和目前的生态环境。更加具体详细的内容,会在后续的文章中陆续发表。
严格来说,DTrace这个词本身,已经并不是狭义上基于 Solaris 的那套工具了,而是代表的是后现代操作系统的一整套工具家族和方法论。
History of DTrace
当时 Solaris 操作系统的几个工程师花了几天几夜去排查一个看似非常诡异的线上问题。
开始他们以为是很高级的问题,就特别卖力,结果折腾了几天,最后发现其实是一个非常愚蠢的、某个不起眼的地方的配置问题。
自从那件事情之后,这些工程师就痛定思痛,创造了 DTrace 这样一个非常高级的调试工具,来帮助他们在未来的工作当中避免把过多精力花费在愚蠢问题上面。
毕竟大部分所谓的“诡异问题”其实都是低级问题,属于那种“调不出来很郁闷,调出来了更郁闷”的类型。—-《漫谈动态追踪技术》
通观DTrace的演变过程,几乎相当于一部现代操作系统系统的发展史,细查起来,极其复杂。但是有两个人非常值得关注,一个是国际级的布道师,一个是国内的代表人物,初学者完全可以通过阅读他们的文章、代码,甚至微博/Twitter动态,了解动态追踪技术的实际应用情况。
Brendan Gregg
前SUN性能工程师,最早的DTrace用户,出版了包括《性能之巅》在内的一大批书籍,囊括了性能问题领域的技术、工具、方法论等方方面面。他是动态追踪技术当之无愧的首席布道师,维护的个人博客发布了大量的原创内容,并且持续保持着相当的活跃度。可以作为第一手的学习资料。
章亦春
网名 agentzh。开源项目OpenResty创始人,编写了很多 Nginx 的第三方模块, Perl 开源模块,以及最近一些年写的很多 Lua 方面的库。他发表过的《漫谈动态追踪技术》,是目前唯一由Brendan认证的中文资料,入门首选。另外,他本人也在目前的工作、开源项目运营中大量使用动态追踪技术。
微博:
Linux 追踪器选型
动态追踪技术最复杂的地方在于追踪器种类繁多,让人一时无从下手。根据前人的一些经验总结,建议按照以下路径进行选择:
普通模式
适用于:开发者, 系统管理员, DevOps, SRE
CPU分析
perf_events的应用很广泛,配合Brendan Gregg老师研究的火焰图工具,可以分析程序在所有代码基的资源消耗,精确定位到函数级。例如:
进程追踪1
2
3
4
5
6
7# ./execsnoop
Tracing exec()s. Ctrl-C to end.
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
HARD模式
适用于:性能或内核工程师
Understanding all the Linux tracers to make a rational decision between them a huge undertaking.
0、dtrace
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。
The LTTng Documentation v2.9
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后处理。
10、strace + gdb
- strace - trace system calls and signals
- 动态追踪技术(二):strace+gdb 溯源 Nginx 内存溢出异常
- 动态追踪技术(四):基于 Linux bcc/BPF 实现 Go 程序动态追踪
- time: Sleep requires ~7 syscalls
火焰图应用案例
- 阮一峰:如何读懂火焰图?
- Thayne McCombs:如何使用火焰图来降低服务器负载
- PROFILING GO APPLICATIONS WITH FLAMEGRAPHS| February 28, 2018
- A blazing fast flame graph tool for Node and V8. Used to visualize and explore performance profiling results
- SRE: Performance Analysis: Tuning Methodology Using a Simple HTTP Webserver In Go | go tool pprof
勘误
- No.001 初稿已删除【大家比较熟知的netfilter,就是基于BPF实现的动态编译器】
本来是想表达 iptables 对 bpf 的支持。
扩展阅读
动态追踪技术
- 动态追踪技术(一):DTrace 导论
- 动态追踪技术(二):strace+gdb 溯源 Nginx 内存溢出异常
- 动态追踪技术(三):Tracing Your Kernel Function!
- 动态追踪技术(四):基于 Linux bcc/BPF 实现 Go 程序动态追踪
- 动态追踪技术(五):Welcome DTrace for Linux
《Linux Perf Master》
How Linux Works
- Linux 性能诊断:负载评估
- Linux 性能诊断:快速检查单
- 操作系统原理 | How Linux Works(一):How the Linux Kernel Boots
- 操作系统原理 | How Linux Works(二):User Space & RAM
- 操作系统原理 | How Linux Works(三):内存管理
- 操作系统原理 | How Linux Works(三):网络管理
参考文献
- 动态追踪技术漫谈 | 章亦春
- 动态追踪技术(中) - Dtrace、SystemTap、火焰图 | 原创 2016-05-06 章亦春 MacTalk
- 动态追踪技术-应用性能瓶颈排障利器之火焰图 | 2016-12-01 郑晓川 江凌生 TIGCHAT
- 运维利器:万能的 strace | 2016-05-24 王子勇 高效运维
- (推荐)Linux tracing systems & how they fit together | Julia Evans
- Give me 15 minutes and I’ll change your view of Linux tracing | Brendan Gregg’s Blog
- Where has my disk space gone? Flame graphs for file systems | Brendan Gregg’s Blog
- Container Performance Analysis at DockerCon 2017 | Brendan Gregg’s Blog
- (推荐) Julia Evans: Linux tracing systems & how they fit together
- 使用 dtrace 跟踪 Python 应用 | ipfans’s Blog
- Probing the JVM with BPF/BCC | Sasha Goldshtein
- 从eBay购物车丢失看处理网络I/O
- Go’s march to low-latency GC
- Tracing Runtime Events in .NET Core on Linux | March 30, 2017
- 案例分享:巧用各种工具提升无源码系统的性能和稳定性 | 原创: 杨振 董建 高可用架构 1月17日
- COZ: Finding Code that Counts with Causal Profiling