perf 和火焰图
perf
是一个强大的 Linux 性能分析工具,它可以帮助开发者和系统管理员收集关于程序运行时性能的详细信息。perf
巅峰于 Linux 内核 2.6.31 版本中引入,它提供了一系列子命令来执行不同的性能监控任务,比如统计性能计数器、采样程序执行、跟踪内核事件等。
perf
的主要功能包括:
- 性能计数:通过硬件性能计数器收集 CPU 指令、缓存命中率、分支预测等数据。
- 事件跟踪:可以追踪内核调度、系统调用、页面错误等事件。
- 代码剖析:使用采样技术对应用程序进行剖析,帮助识别热点函数。
- 延迟分析:分析 I/O 操作、上下文切换等的延迟。
- 内存分析:监控内存访问模式,如 L1、L2 缓存使用情况。
使用 perf
进行性能剖析的基本步骤:
- 安装
perf
(通常作为linux-tools-common
包的一部分)。 - 使用
perf record
命令记录性能数据。 - 使用
perf report
命令查看和分析记录的数据。 - 可以使用
perf top
实时查看系统的热点函数。
火焰图
火焰图是一种可视化工具,用于展示程序的调用栈信息及每个函数占用的时间比例。它最初由 Brendan Gregg 开发,广泛应用于性能优化领域。火焰图将调用栈从上到下排列,每层代表一个函数调用,宽度表示该函数占用的时间或样本数量,颜色通常没有特定含义,但可以通过配置来区分不同类型的函数。
火焰图的特点:
- 直观易懂:能够快速定位耗时长的函数或调用路径。
- 层次结构清晰:展示函数之间的调用关系。
- 支持交互:在某些工具中,可以点击放大查看更详细的调用栈信息。
如何生成火焰图:
- 使用
perf
或其他工具(如 gprof, dtrace, SystemTap 等)采集性能数据。 - 将原始数据转换为适合生成火焰图的格式,例如通过脚本处理。
- 使用专门的工具(如 FlameGraph 脚本集合)生成火焰图。
火焰图结合 perf
使用,可以非常有效地帮助开发者理解程序的执行过程,识别性能瓶颈,进而优化程序性能。
多用组合、少用继承
基于接口而非实现进行编程