热点函数分析
命令功能
支持分析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的平均频率、最高频率、最低频率。
参数说明
参数 |
参数选项 |
说明 |
---|---|---|
-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。
|
-f/--frequency |
- |
可选参数,设置采样频率,最小值为1次/秒,默认为200次/秒。 |
-e/--event |
- |
可选参数,设置需要采集的事件,可通过devkit tuner hotspot list查看可采集事件。 |
-o/--output |
- |
可选参数,设置报告数据压缩包名称和输出路径(无需指定压缩包后缀名),仅输入名称时默认生成在当前所在目录;需和--package配合使用。 |
-r/--collection-range |
user/kernel/all |
可选参数,设置采集模式,默认为all。
|
-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文件可使用浏览器查看。


- 火焰图的含义:
y轴表示调用栈,每层一个函数。调用栈越深,火焰越高,顶部是正在执行的函数,下方是它的父函数。
x轴表示采样数。函数在x轴占据的宽度越宽,表示它的采样次数越多,即执行的时间越长。注意,x轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。
- 火焰图能够直观展示函数调用关系和执行时间情况,帮助发现热点函数及其优化路径。热火焰图表示CPU的繁忙程度,用于定位CPU占用高的情况,一般选择暖色调。
- 可将鼠标悬浮于火焰图中对应函数,可进一步查看详细信息。
- 支持搜索框搜索需要查询的函数,搜索时可通过“大小写敏感”单选框支持大小写敏感查询,默认不支持;查询后,火焰图自动为查询结果添加底色,并为第一个函数添加边框。