本文旨在从整体视角介绍性能分析(Performance Analysis)与Tracing,帮助不了解 tracing 的读者建立基础概念。
1、性能(Performance)简介
性能分析的目标是让软件运行得更好。“更好”的含义取决于场景,常见目标包括:
- 用更少的资源完成相同工作(CPU、内存、网络、耗电等)
- 更充分利用现有资源
- 识别并消除不必要的工作
提升性能的主要难点是:如何找到性能问题的根因。
现代软件系统复杂、组件众多、交互繁杂,工程师需要能让程序执行过程变得可理解的工具。Tracing 和 Profiling 就是最常用的两种工具。
2、Tracing 简介
Tracing(跟踪)是对系统执行过程进行高精度、细粒度的数据采集。 一次持续的采集称为trace 文件或trace。
Trace 通常可以完整还原程序执行的时间线,包括:
- 内核事件(调度切换、线程唤醒、系统调用等)
- 应用自定义的关键代码区域(函数执行时间、调用参数等)
有了足够详细的 trace,很多性能问题即使无法复现也可以通过 trace 找到原因。
由于 trace 数据量巨大,人无法直接阅读(不像日志)。为此需要:
- trace 分析库:用于程序化提取和汇总事件
- trace 可视化工具(如 Perfetto UI) :展示时间轴视图,帮助理解系统随时间的运行状况
3、Logging vs Tracing
可以这样理解:
日志(logging)之于功能调试,就像 tracing 之于性能分析。
Tracing 是一种“结构化日志”,用结构化数据记录系统状态,而不是随意打印字符串。
此外,Tracing 框架(如 Perfetto)极力降低开销,以避免影响被测程序的性能。现代 tracing 工具能在纳秒级别记录事件,同时只带来极低性能损耗。
4、Metrics vs Tracing
Metrics(指标)是在程序运行时持续收集的高层数值,例如:
- CPU 使用率
- 内存使用
- 网络带宽
问题来了:
既然 trace 能提供比 metrics 更丰富的信息,为什么还要用 metrics?
原因在于 trace 的“重量级”:
- trace 数据通常大得多(MB 级)
- 无法在生产环境24/7 持续采集
因此 metrics 更适合长期监控性能趋势,而 trace 用来进行深度根因分析(root cause analysis)
典型流程:
- 指标发现异常
- 启动 targeted tracing
- 通过 trace 分析问题根因
5、Profiling 简介
Profiling(性能剖析)通过采样(sampling)方式记录资源使用情况。一段连续采样称为profile。
每个采样会采集:
- 调用栈(callstack)
常见的两类 profilings:
- 内存 profiling:哪些代码在分配内存、分配了多少字节
- CPU profiling:哪些代码消耗了 CPU 时间
Profiling 通常依靠:
- 定时采样(如每 50ms)
- 或特定事件触发采样
6、Tracing vs Profiling
两个关键问题:
- 既然可以 trace 一切,为什么还要 profiling?
- 既然 profiling 能定位到具体代码行,为什么还需要 tracing?
6.1、什么时候使用 Profiling?
Trace无法捕获非常高频的事件(如每一次函数调用)。
Profiling 通过“采样”减少数据量,适用于:
- 高频调用的热点代码
- 长期性能趋势分析
采样是统计的,但结果通常足够准确。
6.2、什么时候使用 Tracing?
Profiling 能告诉你:
- “哪些代码使用了资源”
但 tracing 能告诉你:
- “为什么这些代码会被执行?”
例如 profiling 会说:
foo() 导致了大量的 malloc 调用
但 tracing 能告诉你:
foo() 是因为某个事件/输入/线程唤醒而执行的
Tracing 提供执行上下文,这是 profiling 无法提供的。
6.3、小结
| 目的 | Tracing | Profiling |
|---|---|---|
| 解决问题 | 为什么会卡?线程为什么被阻塞?发生了什么? | 哪些代码最耗 CPU/内存?热点在哪里? |
| 数据来源 | 事件、时间线、上下文 | 采样调用栈、统计资源使用 |
| 开销 | 较低(但主动记录大量事件) | 更低(定期采样) |
| 输出 | 时间轴 + 事件流 | 函数热点分布 |
| 工具例子 | Perfetto, ftrace, eBPF | perf, gperftools, VTune |
7、Perfetto 同时支持 Profiling 和 Tracing
Perfetto 可以同时记录追踪和剖析数据,让两者互补。