9.3.4 性能剖析 Profiling 熟悉 Golang 的开发者对 pprof 工具一定不陌生。进行软件性能调试和分析时,利用 pprof 提供的 CPU 和内存分析功能,深入了解 Golang 函数的执行时间和内存使用情况。 在可观测性领域,性能剖析(Profiling)的作用与 Go 语言中的 pprof 类似,都是对运行中的程序进行动态分析,生成程序运行时的详细数据(即 Profiles),全面了解程序资源的使用情况,确定代码和性能瓶颈之间的关联。 Profiles 数据一般表示成火焰图、堆栈图或内存分析图等形式,是从“是什么”到“为什么”这一过程中至关重要的依据。例如,通过链路追踪发现延迟产生的位置,然后依靠 Profiles 生成的火焰图进一步定位到具体的代码行。
熟悉 Golang 的开发者对 pprof 工具一定不陌生。进行软件性能调试和分析时,利用 pprof 提供的 CPU 和内存分析功能,深入了解 Golang 函数的执行时间和内存使用情况。
在可观测性领域,性能剖析(Profiling)的作用与 Go 语言中的 pprof 类似,都是对运行中的程序进行动态分析,生成程序运行时的详细数据(即 Profiles),全面了解程序资源的使用情况,确定代码和性能瓶颈之间的关联。
Profiles 数据一般表示成火焰图、堆栈图或内存分析图等形式,是从“是什么”到“为什么”这一过程中至关重要的依据。例如,通过链路追踪发现延迟产生的位置,然后依靠 Profiles 生成的火焰图进一步定位到具体的代码行。2021 年,国内某站崩溃,工程师们使用火焰图观察到到一处 Lua 代码存在异常,最终定位到问题的源头1。
:::center
图 9-16 Lua 代码的 CPU 火焰图
:::
:::tip 火焰图分析说明
火焰图颜色没有特殊含义,因为火焰图表示的是 CPU 的繁忙程度,所以一般选择暖色调。分析火焰图,其实就是看顶层的哪个函数占据的宽度最大。只要有“平顶”,就表示该函数可能存在性能问题。
:::
Profiles 数据通常由多种不同的分析器(Profiler)生成,以下是一些常见的分析器类型:
过去,由于分析器的资源消耗较大,工程师们往往仅在紧急情况下才会临时使用它们。随着低开销分析技术的发展,如编程语言层面的 Java Flight Recorder 和 Async Profiler,以及操作系统层面的 systemTap 和 eBPF 技术的出现,让生产环境中的持续性能分析(Continuous Profiling)变得越来越可行,捕获偶发故障的现场快照也变得更加容易。
参见《2021.07.13 我们是这样崩的》https://www.bilibili.com/read/cv17521097/ ↩