GALA性能火焰图—off-cpu火焰图功能上线了!

概述

分析应用性能问题的一个非常有效的方法就是看应用程序运行过程中主要时间都花在哪了,进而识别出性能瓶颈所在并进行性能优化。按照应用程序线程是否正在 CPU 上运行,可以将应用程序线程划分为 2 种状态:

  • on-CPU:在 CPU 上执行。如果线程主要时间花在 CPU 上了,则说明 CPU 资源是性能瓶颈,这时可直接进一步进行 CPU 分析,没必要花时间在其他状态的分析上。
  • off-CPU:不在 CPU 上执行。此时线程或在等待下一轮上 CPU,或者等待 I/O、锁、换页,又或者处于空闲状态等。若线程大部分时间处于该状态,则说明 I/O 资源很可能是性能瓶颈,需要进一步分析线程为什么阻塞以及阻塞的类型等。

on-cpu 火焰图用于对线程的 on-CPU 状态进行分析,识别出线程是如何消耗 CPU 资源的,以及主要耗时的函数调用。openEuler 社区开源项目 A-Ops 中 gala-ops 系列组件已经支持 on-cpu 火焰图的功能,关于它的介绍和使用可以参见之前的文章:

而针对线程的 off-CPU 状态,可以使用 off-cpu 火焰图进行分析,从而获取线程因执行什么操作(如等待I/O、锁)而进入 off-CPU 状态。gala-ops 最新版本现已开始支持 off-cpu 火焰图功能,本文将介绍 off-cpu 火焰图的原理,以及如何在 gala-ops 中开启和使用该功能。

off-cpu 火焰图介绍

off-cpu 火焰图是一种基于 Linux 系统的性能分析工具,它通过采集 CPU 上下文切换事件来分析应用程序的性能问题。当应用程序在等待 I/O、锁或其他资源时,CPU 会处于空闲状态,此时 off-cpu 火焰图会记录下这个事件,并将其显示在火焰图上。通过分析火焰图,开发人员可以快速定位应用程序中的瓶颈和性能问题。

下图是使用 gala-ops 生成的一张 off-cpu 火焰图,其中横轴表示 off-cpu 事件的执行时间,纵轴表示 off-cpu 事件对应的函数调用栈。它监控了一个 kafka 服务器程序,通过该火焰图可以看到,该程序的 off-CPU 时间主要花在 epoll_wait 系统调用上,结合该函数的调用栈可知,该应用主要在等待网络 I/O。

解决的问题场景

off-cpu 火焰图对应用程序线程的 off-CPU 状态提供了更丰富更细粒度的信息,它提供了不同类型 off-cpu 事件的时间占比和调用栈信息。基于这些信息,我们可以解决应用程序的诸多非 CPU 资源导致的性能问题,诸如磁盘 I/O 慢、网络 I/O 慢、以及锁竞争等性能问题。

在介绍 off-cpu 火焰图能解决哪些性能问题之前,我们先对应用程序线程的 off-CPU 状态按照 off-cpu 事件类型进行更细粒度的划分。基本可以包括如下 5 种状态:

  • 可运行:线程正在等待上 CPU 运行。该状态耗时多意味着 CPU 资源紧张。
  • 匿名换页:线程可运行,但因为等待匿名换页而受阻。该状态耗时多意味着内存资源紧张。
  • 睡眠:线程正在等待包括网络、块设备和数据/文本页换入等 I/O 操作。该状态耗时多往往意味着 I/O 资源成为性能瓶颈。
  • :线程正在等待获取同步锁。该状态耗时多往往意味着锁竞争或出现死锁。
  • 空闲:线程等待工作。

下面的 off-cpu 状态图(图片来源:https://www.brendangregg.com/Perf/thread_states.png)基本展示了 off-CPU 状态的划分。

基于 5 种更细粒度的 off-CPU 状态划分,我们可以大致了解 off-cpu 火焰图可以解决的性能问题场景。主要有,

  • 锁竞争
  • 网络 I/O 慢
  • 磁盘 I/O 慢
  • ……

通过 off-cpu 火焰图识别这些性能问题的基本分析步骤是:

  1. 找到耗时占比高的函数调用;
  2. 分析该函数的调用栈,识别问题类型。

gala-ops 的 off-cpu 火焰图功能

安装和使用

gala-ops 是 openEuler 社区开源项目 A-Ops 中针对云基础设施灰度故障的应用级/系统级在线诊断工具,火焰图探针 stackprobe 集成在其中的 gala-gopher 组件内。用户只需一键安装 gala-gopher 后,在配置文件(安装路径为 /etc/gala-gopher/gala-gopher.conf)中开启或关闭火焰图探针 stackprobe 即可使用火焰图功能。具体的安装部署说明可参考gala-gopher文档

off-cpu 火焰图的功能集成在火焰图探针 stackprobe 中,它的开启方式也很简单,这里需要注意两点:

  1. 使用最新的 gala-gopher 软件包版本。
  2. 只需要打开火焰图探针 stackprobe 配置文件(安装路径为 /etc/gala-gopher/extend_probes/stackprobe.conf)中的 offcpu = true 配置选项,即可开启 off-cpu 火焰图功能。

启动 gala-gopher 后,可通过以下两种方式获取 off-cpu 火焰图。

  1. 本地 svg 文件

    stackprobe 探针会定期在本地生成 svg 格式的火焰图文件,文件默认保存在 /var/log/gala-gopher/stacktrace/offcpu 目录下。

  2. 基于 pyroscope 和 grafana 等第三方运维平台

    stackprobe 探针支持将用于生成火焰图的原始数据流实时地发送到 pyroscope 服务器上,用户可以基于 pyroscope 提供的用户界面、或者进一步对接到 grafana 用户界面来查看实时生成的 off-cpu 火焰图。

    为了支持该功能,需要修改 stackprobe 探针的配置文件中的 pyroscope_server 配置选项,配置 pyroscope 服务器的地址即可。

功能特性

在文章 适用于云原生的全栈持续性能监测工具——A-Ops性能火焰图 中介绍了 gala-ops 火焰图的四大特性。off-cpu 火焰图也继承了其中的主要特性,包括:

  • 易于部署和集成。基于 gala-gopher 一键部署。
  • 容器支持。火焰图基于 Pod 和 Container 进行区分。
  • 全栈支持。目前已支持的语言包括C,C++,GO,Rust,JAVA。

关于 off-cpu 火焰图对应用性能的底噪影响,我们将在后续进行优化和测试,敬请期待。

2 个赞

:+1: :+1: :+1: