You need to enable JavaScript to run this app.
导航
如何进行性能分析
最近更新时间:2024.12.27 14:53:38首次发布时间:2024.12.27 14:53:38
性能分析CPU火焰图简介

火焰图用于可视化展示分层数据,帮助用户快速准确地识别代码调用路径。算法工程师可通过机器学习平台的性能分析功能创建CPU火焰图,获取代码中各函数的耗时情况及各函数之间的调用关系,分析代码的性能瓶颈。
在火焰图中,每个矩形表示一个函数或方法,矩形宽度表示该函数或方法在总采集时间中所占比例,宽度越宽所占比例越大;每列矩阵代表一个调用栈,矩形在列中的位置高度表示该函数或方法在调用栈中的深度,位置越高调用栈越深。

性能分析样例

  • 代码及链路说明
def main ():                 # 调用链路说明
    func1                    # 链路1: main-func1-func3-func5-func6-func8    
                             # 链路2: main-func1-func3-func5-func7
    func2                    # 链路3: main-func2-fun4
    func4                    # 链路4: main-func4
    
def func1():
    func3
def func2():
    func4
def func3():
    func5
def func4():
def func5():
    func6
    func7
def func6():
    func8
def func7():
def func8():

上述代码会获得如下调用链路:

  1. main->func1->func3->func5->func6->func8

  2. main->func1->func3->func5->func7

  3. main->func2->func4

  4. main->func4

  • CPU火焰图结果

由火焰图分析可知,最顶层函数 func8 宽度较宽,占用 CPU 的时间较多。函数 func5 宽度虽然较大,但执行时,大部分CPU时间被其调用的函数func8占用,本身占用的CPU时间较少。同理可知,函数func2的宽度较大,但大部分CPU时间本质上被函数func4占用。因此,若想提升程序运行性能,应着重对函数func8和函数func4进行优化分析。

性能分析任务创建流程

前置条件

  1. 任务处于 运行中 状态。

  2. 仅允许任务创建人提交性能分析任务。

提交流程

  1. 前往某一个自定义任务/推理服务详情页,点击 创建性能分析 。

  2. 填写相关配置字段:

    1. 选择进程

      1. 推荐 】基于实例分析:选择某个实例(POD)的所有进程分析。

      2. 基于进程分析:选择某一个实例内(POD)的一些进程分析。

    2. 采集时长:

      一般以每秒100个样本的频率进行采样。对当前函数不断回溯它的调用者,至不再有调用关系,为一次采样。

    3. 选择语言:

      1. Python

      只对所有的 Python 进程分析。

      1. C++

      只对所有的 C++ 进程分析。

    4. 高级配置

      1. 语言为 C++时

        1. 配置参数:

          1. Perf:基于硬件 PMU 实现执行栈的数据抓取。

          2. BCC:基于内核提供的 eBPF 机制实现执行栈的数据抓取(目前暂不支持)。

        2. 栈回溯方式:平台在采集数据时,直接被采集到的是当前在执行的函数,为了生成函数的调用栈(即从入口函数开始一直到当前被采集函数的整个调用链),需要有一种方式做栈回溯。目前平台的 Perf 工具支持三种栈回溯方式,如果没有特殊情况,都是走 fp 的模式:

          1. fp【默认选择】:编译时通过保留 frame pointer 在生成的代码中保留相关信息。

          2. dwarf:基于编译时 CFI 信息做栈回溯。

          3. lbr:基于 CPU 提供的寄存器做栈回溯,但需要较新的 CPU 型号支持,例如 x86 等,同时栈的深度也有一定限制,一般为 32 层。

      2. 语言为 Python 时

        1. idle【默认开启】:一般情况下,性能分析工具只会对正在 CPU 上执行的进/线程进行栈回溯,开启该选项时会同时抓取正在 CPU 上执行进/线程的栈回溯和未在 CPU 上执行(idle)进/线程的栈回溯。

创建结果样例


上图是基于 Python 程序采集的 CPU火焰图。性能分析任务的结果主要包括以下几个模块:

  1. 关键函数占比(TOP10):展示了该分析任务中占用CPU时间 最多的十个函数。

  2. 实例列表:展示了本次分析任务选择的所有实例。

  3. 采样时序变化:采集时长内,该分析任务 CPU采样信息的变化图(可以理解为采样时间内 CPU的利用率变化图)。横轴是时间,纵轴是样本数目,样本数目越多CPU使用率越高。

  4. 函数图:根据火焰图中函数出现的样本数进行排名,以及展示对应函数的样本数及占比。

  5. 火焰图:每列代表一个调用栈,每个矩阵代表一个函数:

    1. 横轴:火焰图采集的多个调用栈信息,按字母横向排序的方式将众多信息聚合在一起。横轴格子的宽度代表其在采样中出现频率,所以一个格子的宽度越大,说明它是瓶颈原因的可能性就越大。

    2. 纵轴:函数栈的深度,按照调用关系从下到上排列。最顶上格子代表采样时,正在占用CPU资源的函数。

    当抓取语言为python且idle配置开启时,纵轴将包含正在占用以及未占用CPU资源的函数信息。

差分/聚合功能

机器学习平台性能分析支持多个采集实例的差分与聚合分析,可在性能分析任务详情页面进行创建。

差分火焰图

差分火焰图的基本概念:

  1. 基准火焰图:即选择的第一个任务实例。

  2. 对比火焰图:与基准火焰图对比的任务实例。

  3. 颜色的冷暖代表了基于基准火焰图的增减,冷色为减少,暖色为增加;颜色的深浅代表差异的大小,颜色越深差异越大。

聚合火焰图

聚合火焰图主要用来分析多个实例的整体热点,颜色越深热点越热。

Coming Soon
  • 内存性能分析

  • GPU性能分析