鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

热点函数分析

命令功能

支持分析C/C++程序代码识别性能瓶颈,给出对应的Top热点函数和调用栈详情。通过火焰图展示函数的调用关系,发现优化路径。

命令格式

1
devkit tuner hotspot [-h] [-c {n | n,m | n-m}] [-d <sec>] [-D <sec>] [-f n] [-l {0, 1, 2, 3}] [-i <sec>] [-r {user, kernel, all}] [-o] [-s] [-p {PID1 | PID1,PID2 | ALL}] [-g] [--package] [--long-name] [--dwarf] [workload workload...]
  • 工具可采集指定应用,命令中[workload workload...]替换为应用路径加应用参数。
  • 可统计在热点函数采样周期内CPU的平均频率、最高频率、最低频率。

参数说明

表1 参数说明

参数

参数选项

说明

-h/--help

-

可选参数,获取帮助信息。

-c/--cpu

-

可选参数,指定采集的CPU核数,如“0”、“0,1,2”、“0-2”。

-d/--duration

-

可选参数,设置采集时长,单位为秒,最小值为1秒,默认为一直采集,可使用Ctrl+\取消任务或Ctrl+C停止采集并进入分析。

-D/--delay

-

可选参数,设置延迟采样时长,单位为秒,默认为0秒,需小于采集时长。

-i/--interval

-

可选参数,设置采集间隔,单位为秒。最小值为1秒,最大值不能超过采集时长,默认为采集时长。如果不指定间隔,不生成子报告。每个子报告中收集数据的时间取决于间隔参数。

-l/--log-level

0/1/2/3

可选参数,设置日志级别,默认为1。
  • 0:日志级别为DEBUG。
  • 1:日志级别为INFO。
  • 2:日志级别为WARNING。
  • 3:日志级别为ERROR。

-f/--frequency

-

可选参数,设置采样频率,最小值为1次/秒,默认为200次/秒。

-e/--event

-

可选参数,设置需要采集的事件,可通过devkit tuner hotspot list查看可采集事件。

-o/--output

-

可选参数,设置报告数据压缩包名称和输出路径(无需指定压缩包后缀名),仅输入名称时默认生成在当前所在目录;需和--package配合使用。

-r/--collection-range

user/kernel/all

可选参数,设置采集模式,默认为all。

  • all:采集用户态和内核态的性能数据。
  • user:采集用户态的性能数据。
  • kernel:采集内核态的性能数据。

-s/--src-dir

-

可选参数,指定源码工作目录,用于查找并关联源码,可将任务导入Web端查看。

-g

-

可选参数,显示调用堆栈信息。如果启用-g选项,将生成火焰图html文件,默认生成在用户所在目录。

-p/--pid

PID/PID1,PID2/ALL

可选参数,指定采集的进程PID,多个进程PID可用“,”分隔。默认采集全部进程(ALL)。若同时使用-p和-c参数则优先采集指定PID的进程。

--long-name

-

可选参数,设置是否显示详细函数和模块信息。不使用此参数默认简洁显示模块或功能信息。

--dwarf

-

可选参数,设置是否展示关联源码文件。

-t/--top

-

可选参数,设置报告中显示数据数量,最小值为1个。

--package

-

可选参数,设置是否生成报告数据压缩包,不指定压缩包名称和路径时默认在当前所在目录生成hotspot-时间戳.tar。

使用示例

1
devkit tuner hotspot -c 110-112 -d 10 -r user

参数-c 110-112表示采集CPU核110到112,参数-d 10表示采集10秒,-r user表示采集用户态性能数据。

返回信息如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Hotspot Summary Report-ALL                              Time:2024/06/05 17:24:11
================================================================================
1.The current server supports a maximum of 2600 MHz CPU frequency and a minimum of 200 MHz.
2.Only the collected CPU frequency information about the running process is displayed. Considering the large number of cores, only the CPU frequency with a difference of more than 1% from the maximum CPU frequency is displayed.
For example, the collected process runs on CPUs 0-10, and only the difference between the CPU frequency of CPUs 3-6 and the maximum frequency supported by the current server exceeds 1%. In this case, CPU 3-6 is displayed.
─────────────────────────────────────────────────────────────────────────────
  Core       Avg Frequency(MHz)    Max Frequency(MHz)    Min Frequency(MHz)
─────────────────────────────────────────────────────────────────────────────
  CPU110                   1135                  1211                   896
─────────────────────────────────────────────────────────────────────────────
─────────────────────────────────────────────────────────────────────────────────
  Function                                  cycles    Module                         cycles(%)
─────────────────────────────────────────────────────────────────────────────────
  Hotspot::Mon***riable(int)            28,295,946    libtuner.so                        13.19
  KUNPENG_SYM:***har const*)            23,937,102    libsym.so                          11.16
  _pthread_cle***_push_defer            22,824,809    libpthread-2.28.so                 10.64
  el0_svc_common                        20,437,520    [kernel]                            9.53
  0x79b84                               17,734,958    libc-2.28.so                        8.27
  runtime.(*lfstack).push               17,149,776    dockerd                             7.99
  0x78e34                               16,163,183    libc-2.28.so                        7.53
  0xa2a9c                               15,726,617    libglib-2.0.so.0.6600.8             7.33
  _PyType_Lookup                        14,070,497    libpython3.9.so.1.0                 6.56
  std::_Rb_tre***node_base&)            10,375,159    libstdc++.so.6.0.24                 4.84
  __libc_malloc                         10,287,180    libc-2.28.so                        4.79
  0x260ec                                9,941,742    libsym.so                           4.63
  0x25f9c                                6,144,404    libsym.so                           2.86
  runtime.runqgrab                         320,367    dockerd                             0.15
  runtime.greyobject                       187,025    dockerd                             0.09
  runtime.scanobject                       156,426    dockerd                             0.07
  runtime.notesleep                        118,716    dockerd                             0.06
  runtime.findrunnable                      88,611    dockerd                             0.04
  index                                     76,937    libc-2.28.so                        0.04
  g_closure_ref                             69,065    libgobject-2.0.so.0.6600.8          0.03
  0x70c46c                                  62,180    magent                              0.03
  safe_close                                61,249    libsystemd-shared-243.so            0.03
  0x10540                                   60,090    auditd                              0.03
  fjson_object_put                          59,935    libfastjson.so.4.3.0                0.03
  0x5be40                                   51,490    python3.9                           0.02
  0x11850                                   49,759    libsystemd.so.0.27.0                0.02
  0x6a1c4                                   43,487    libpython3.9.so.1.0                 0.02
  _PyEval_EvalFrameDefault                  38,232    python3.9                           0.02
  PyBuffer_Release                          12,399    python3.9                           0.01
─────────────────────────────────────────────────────────────────────────────────
5080 milliseconds time elapsed
If *** is displayed in Function, use --long-name to show full function name.

生成的火焰图html文件默认生成在用户所在目录,火焰图html文件可使用浏览器查看。

图1 火焰图html
  • 火焰图的含义:

    y轴表示调用栈,每层一个函数。调用栈越深,火焰越高,顶部是正在执行的函数,下方是它的父函数。

    x轴表示采样数。函数在x轴占据的宽度越宽,表示它的采样次数越多,即执行的时间越长。注意,x轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。

  • 火焰图能够直观展示函数调用关系和执行时间情况,帮助发现热点函数及其优化路径。热火焰图表示CPU的繁忙程度,用于定位CPU占用高的情况,一般选择暖色调。
  • 可将鼠标悬浮于火焰图中对应函数,可进一步查看详细信息。
  • 支持搜索框搜索需要查询的函数,搜索时可通过“大小写敏感”单选框支持大小写敏感查询,默认不支持;查询后,火焰图自动为查询结果添加底色,并为第一个函数添加边框。