前言:虽然有翻译软件,虽然有chatgpt,毕竟语言隔阂,对这个工具还是一知半解,因此想通过翻译的方式和大家来一起学习下Perfetto这个强大的工具
英文原文在这里
Tracing 概览
本篇文章主要是简单介绍下性能分析,目标是给初学者介绍下tracing的相关知识。
简介
性能
性能分析关注的是使软件运行得更好。但“更好”的定义千差万别,更好的含义取决于具体情况。比如:
-使用较少的资源(CPU、内存、网络、电池等)完成相同的工作
-提高可用资源的利用率
-识别并消除不必要的工作
提高性能的大部分困难来自于确定性能问题的根本原因。现代软件系统是复杂的,有很多组件和复杂交互的界面。因此了解系统执行情况并确定关键问题这一项技能就显得特别重要。
Tracing和profiling是两种广泛使用的性能分析技术。Perfetto是一套开源工具,它将跟踪和分析相结合,为用户提供一个强有力的系统分析工具。
Tracing简介
Tracing收集关于系统执行的详细数据。一个连续的记录会话被称为trace file,或者简称trace。
Traces包含足够的细节,可以完全重建事件的时间线。它们通常包括底层的内核事件,如调度程序上下文切换、线程唤醒、系统调用等。使用“正确”的tracek,可以很大程度避免再出现现性能错误,因为trace提供了所有必要的运行上下文数据。
应用程序代码也可以被监测,该工具跟踪程序在一段时间内所做的事情(例如,运行哪些函数,或者每次调用需要多长时间)和执行的上下文(例如,函数调用的参数是什么,或者函数为什么运行)。
大部分情况,trace文件的理解并不像日志文件一样简单易懂。但使用Tracing分析库和trace 可视化工具的组合,trace的分析库通过一种可编程的手段,使得用户可以提取和汇总trace event.而trace 可视化工具可以直观的显示系统在一段时间之内发生的事情。
日志记录和tracing的比较
日志记录和tracing的对比,可以简单理解为日志是为了方便功能测试,而tracing 是为了性能分析。从某种意义上说,tracing是“结构化”的日志记录:但并不是简单收集系统行为信息。而是以一种结构化的方式反映系统的详细状态。之后可以通过tracing来大致还原系统发生的有时序的事件。
此外,tracing框架(如Perfetto)非常强调开销最小化。这一点至关重要,这样框架就不会显著干扰正在测量的内容:现代tracing框架足够快,可以在纳秒级完成测量,而不会显著影响程序的执行速度
撇开小问题不谈:理论上,tracing框架足够强大,也可以充当日志系统。然而,在实践中,每种工具的使用都是不同的,因此两者往往是分开的。
指标和tracing
度量指标是跟踪系统随时间变化的性能的数值。通常,度量指标反映的是比较易于理解的指标。度量的示例包括:CPU使用率、内存使用率、网络带宽等。度量是在程序运行时直接从应用程序或操作系统收集的。
在见识到tracing工具的强大作用之后,一个自然的问题出现了:为什么要考虑这些比较易于理解的指标?为什么不直接使用tracing或者直接计算tracing的结果呢?在某些情况下,可以这样做。但在开发和实验室情况下,使用基于tracing的度量是一种强大的方法,其中度量是根据trace计算的,而不是直接收集。如果一个指标不对,打开trace,可以快速找到问题的所在。
然而,基于跟踪的度量并不是一个通用的解决方案。在线上运行时,tracing会带来的额外性能影响,因此持续不间断收集是不现实的。使用trace计算度量指标可能需要GB级别的数据,而直接收集度量指标需要的空间则小的多。
当您想了解系统随时间推移的性能变化时,同时又不想因为tracing带来额外的损耗,那就直接收集度量指标吧,这样更加合理。使用tracing的合理场景是当你发现度量指标有问题时,再使用tracing去发现异常的根本原因。
Profiling
Profiling包括对程序对资源的某些使用情况进行采样。单个连续的录制会话称为profile。
每个profile都收集函数调用堆栈(即调用函数的顺序及行数)。通常情况下,这些信息会在profile中进行汇总。对于每个可见的调用堆栈,汇总的信息还会给出该调用堆栈使用资源的百分比。最常见的profiling是内存profiling和CPUprofiling。
内存profiling用于了解程序的哪些部分正在堆上分配内存。profiler通常会hook native程序(C/C++/Rust/等)的malloc(和free)调用,以对调用malloc的调用堆栈进行采样,还保留了关于分配了多少字节的信息。CPUprofiling则用于了解程序在哪里花费CPU时间。profiler捕获CPU上运行有时序的调用堆栈。通常情况下,这是定期进行的(例如每50ms),但也可以在操作系统中发生某些事件时进行Profiling
Profiling 和 tracing对比
在比较两者的时候主要考虑两个主要问题
1,既然能trace发生的所有事情,为什么还要profile
2,既然profiling可以给出详细的,使用系统资源的地方,为什么还要通过tracing来重现系统的有序事件。
使用profiling 而不是tracing的场景
tracing无法捕获极高频率事件的执行,例如每个函数调用。Profiling工具填补了这一空白:通过采样,它们可以显著减少存储的信息量。profilers是抽样统计,但基本不会出问题。因为profilers的采样算法是专门设计的,可以通过采样精确反映真实的资源使用。
除此之外:有一些非常专业的跟踪工具可以捕获每一个函数调用(例如magic-trace),但它们每秒输出GB级别的数据,这限制了工具的使用场景,因为它们比一般的工具性能开销大的多,因此只能在小范围内查找问题。
使用tracing而不是profiling
虽然profiler提供了使用资源的调用堆栈,但它们缺少这样使用资源的原因。例如,函数foo()为什么多次调用malloc?他们所说的只是foo()在对malloc的Y次调用中分配了X个字节。Traces在提供准确的上下文方面非常出色,Traces包含了应用程序检测和底层内核事件,两者结合在一起,更加容易清楚为什么这样使用资源。
值得一提的是Perfetto支持同时收集、分析和可视化profiles 和 traces,因此您可以两全其美!
Perfetto
Perfetto是一套用于软件性能分析的工具。它的目的是让工程师了解他们的系统是怎样使用资源。它可以帮助工程师找到性能瓶颈,并且优化好性能。
在Perfetto中,由于profiles 和 traces可以同时收集,因此我们将所有内容都称为“trace”,即使其中仅包含profiling。
记录trace
Perfetto在记录跟踪时可以灵活配置。实际上,有数百个选项可以进行调整,以控制收集的数据、应该如何收集、跟踪应该包含多少信息等。
如果不熟悉Perfetto,那么Linux快速启动上的可以提供简单的入门指导。对于Android开发人员来说,Android快速启动上的入门指导更加合适。tracing配置介绍也是相当有用。
以下小节概述了在记录Perfetto trace时值得考虑的各个要点
内核trace
Perfetto与Linux内核的ftrace跟踪系统s深度集成,以记录内核事件(例如调度、系统调用、cpu唤醒)。调度、系统调用和CPU频率配置界面提供了配置ftrace集合的示例。
原生支持的ftrace事件可以在proto消息找到。Perfetto还支持将非原生支持的ftrace事件(即它没有protobuf消息)收集为“通用”事件。这些事件被编码为键值对,类似于JSON字典。
强烈建议在线上环境中使用通用的事件:低效的编码会导致trace大小膨胀,trace processor也无法解析。如果不能,应该往Perfetto中添加ftrace event解析。这里有个简单步骤介绍如何增加一个trace event。
使用Perfetto SDK进行检测
Perfetto有一个C++SDK,可用于检测程序中的trace。SDK的性能开销非常低,以一个.cc和一个.h文件的“合并”形式分发,这样任何构建系统中都是很容易集成的。
C语言的SDK正在积极开发中,应在2023年第二季度前可供一般使用。请参阅此文档了解详细信息(注意,查看此文档需要成为该组的成员)
用于Android的Java/Kotlin SDK(作为JetPack库的一部分)。SDK正在开发中,但正式发布的时间还没有确定。
android.os.Trace (atrace) vs Perfetto SDK
注意:本节仅适用于有tracing经验的Android平台开发人员或Android应用程序开发人员。其他读者可以放心跳过本节。
Perfetto与atrace相比具有显著优势。一些主要的优势包括:
1 性能:Perfetto从系统/应用程序代码tracing只需要一次内存写入,这远远快于atrace强加的系统调用延迟。这通常使Perfetto比atrace快3-4倍
2 特性:atrace的API非常有限,缺乏对调试参数、自定义时钟和流事件的支持。Perfetto拥有更丰富的API,可以直观的展示数据流。
3 trace文件大小:Perfetto支持各种功能(delta编码的时间戳、interned字符串、protobuf编码),这些功能大大减少了trace 文件的大小。
同时Perfetto也有几个劣势:
1 专用线程:每个进程都需要一个专用于Perfetto的线程来跟踪Perfetto。
2Trace启动时的唤醒:目前,当tracing开始时,每个注册了tracing进程都会被唤醒,这大大限制了可以tracing的进程数量。这一限制预计在未来几个季度取消。
目前,Perfetto团队的建议是继续在大多数情况中使用atrace:如果在某些情况下使用SDK更加合适,请直接联系我们。预计到2023年年中,当前SDK的局限性得到显著缓解,以便更广泛地采用SDK。
后记:
1 本次主要使用百度翻译,虽然被骂,但至少翻译这个工具降低了门槛。
2 英文文档中的长难句真的是又长又难,基于百度的翻译,然后自己再调整下,水平实在有限。
3 技术背景知识不够,有些专有名词不知道怎么翻译,也不知道百度翻译的是否准确,功夫在诗外。
4 万事开头难,中间难不难,还不知道。中间的事后面再说,正确一天翻译一篇。
5 虽然可能会有人不屑,但总要有人去做不起眼的小事。
6 google 厉害,这个perfetto 工具也很厉害。君子善假于物也。
7 工具的使用是最简单的入门,背后还有更多的东西值得学习。
8 水平实在有限,闻过则喜,希望有更多的人反馈,期待更好的建议
网友评论