火焰图用于可视化展示分层数据,帮助用户快速准确地识别代码调用路径。算法工程师可通过机器学习平台的性能分析功能创建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():
上述代码会获得如下调用链路:
main
->func1
->func3
->func5
->func6
->func8
main
->func1
->func3
->func5
->func7
main
->func2
->func4
main
->func4
由火焰图分析可知,最顶层函数 func8
宽度较宽,占用 CPU 的时间较多。函数 func5
宽度虽然较大,但执行时,大部分CPU时间被其调用的函数func8
占用,本身占用的CPU时间较少。同理可知,函数func2
的宽度较大,但大部分CPU时间本质上被函数func4
占用。因此,若想提升程序运行性能,应着重对函数func8
和函数func4
进行优化分析。
任务处于 运行中 状态。
仅允许任务创建人提交性能分析任务。
前往某一个自定义任务/推理服务详情页,点击 创建性能分析 。
填写相关配置字段:
选择进程
【 推荐 】基于实例分析:选择某个实例(POD)的所有进程分析。
基于进程分析:选择某一个实例内(POD)的一些进程分析。
采集时长:
一般以每秒100个样本的频率进行采样。对当前函数不断回溯它的调用者,至不再有调用关系,为一次采样。
选择语言:
只对所有的 Python 进程分析。
只对所有的 C++ 进程分析。
高级配置
语言为 C++时
配置参数:
Perf:基于硬件 PMU 实现执行栈的数据抓取。
BCC:基于内核提供的 eBPF 机制实现执行栈的数据抓取(目前暂不支持)。
栈回溯方式:平台在采集数据时,直接被采集到的是当前在执行的函数,为了生成函数的调用栈(即从入口函数开始一直到当前被采集函数的整个调用链),需要有一种方式做栈回溯。目前平台的 Perf 工具支持三种栈回溯方式,如果没有特殊情况,都是走 fp 的模式:
fp【默认选择】:编译时通过保留 frame pointer 在生成的代码中保留相关信息。
dwarf:基于编译时 CFI 信息做栈回溯。
lbr:基于 CPU 提供的寄存器做栈回溯,但需要较新的 CPU 型号支持,例如 x86 等,同时栈的深度也有一定限制,一般为 32 层。
语言为 Python 时
上图是基于 Python 程序采集的 CPU火焰图。性能分析任务的结果主要包括以下几个模块:
关键函数占比(TOP10):展示了该分析任务中占用CPU时间 最多的十个函数。
实例列表:展示了本次分析任务选择的所有实例。
采样时序变化:采集时长内,该分析任务 CPU采样信息的变化图(可以理解为采样时间内 CPU的利用率变化图)。横轴是时间,纵轴是样本数目,样本数目越多CPU使用率越高。
函数图:根据火焰图中函数出现的样本数进行排名,以及展示对应函数的样本数及占比。
火焰图:每列代表一个调用栈,每个矩阵代表一个函数:
横轴:火焰图采集的多个调用栈信息,按字母横向排序的方式将众多信息聚合在一起。横轴格子的宽度代表其在采样中出现频率,所以一个格子的宽度越大,说明它是瓶颈原因的可能性就越大。
纵轴:函数栈的深度,按照调用关系从下到上排列。最顶上格子代表采样时,正在占用CPU资源的函数。
当抓取语言为python且idle配置开启时,纵轴将包含正在占用以及未占用CPU资源的函数信息。
机器学习平台性能分析支持多个采集实例的差分与聚合分析,可在性能分析任务详情页面进行创建。
差分火焰图的基本概念:
基准火焰图:即选择的第一个任务实例。
对比火焰图:与基准火焰图对比的任务实例。
颜色的冷暖代表了基于基准火焰图的增减,冷色为减少,暖色为增加;颜色的深浅代表差异的大小,颜色越深差异越大。
聚合火焰图主要用来分析多个实例的整体热点,颜色越深热点越热。
内存性能分析
GPU性能分析