---
title: 热点函数分析
description: "通过ptrace对Python程序及Python和C/C++的混合程序进行采样，分析调用栈信息，获取Top20的热点函数并绘制火焰图。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdevkithistory/devkit_24_t50/cliuserguide/KunpengDevKitCli_0085.html
sourcePath: /source/zh/kunpengdevkithistory/devkit_24_t50/cliuserguide/KunpengDevKitCli_0085.html
indexId: 2f4b16e0e6534ccff0d0a7fb842e54047f74266a0036fb9651f59dae35e6224185
---
# 热点函数分析

#### 命令功能

通过ptrace对Python程序及Python和C/C++的混合程序进行采样，分析调用栈信息，获取Top20的热点函数并绘制火焰图。

- 支持的Python版本为3.7.X至3.11.X。
- 仅支持openEuler操作系统。
- 仅支持PID模式采集分析。


#### 命令格式

```
devkit py-perf hotspot [-h] [-l {0,1,2,3}] [-d <sec>] [-i <msec>] [-p {PID}] [-o <file>] [-t] [--native] [--nolineno]
```


#### 参数说明


**表1 参数说明**

| 参数 | 参数选项 | 说明 |
| --- | --- | --- |
| \-h/\-\-help | \- | 获取帮助信息。 |
| \-l/\-\-log\-level | 0/1/2/3 | 设置日志级别，默认为1。 0：日志级别为DEBUG。 1：日志级别为INFO。 2：日志级别为WARNING。 3：日志级别为ERROR。 |
| \-d/\-\-duration | \- | 设置采集时长，单位为秒，最小值为1秒，默认为一直采集，可使用Ctrl+\取消任务或Ctrl+C停止采集并进入分析。 |
| \-i/\-\-interval | \- | 设置采集间隔，单位为毫秒，取值范围1至1000毫秒，默认为10毫秒。 |
| \-p/\-\-pid | PID | 指定采集的进程PID，仅支持采集单个进程；若采集的进程存在子进程，不会采集子进程信息。 |
| \-o/\-\-output | \- | 设置报告数据生成文件名；默认生成在当前所在目录，默认文件名格式为FlameGraph\-YMD\-HMS。 |
| \-\-native | \- | 设置是否采集Python和C的调用栈，使用此参数将采集Python和C的调用栈，否则仅采集Python调用栈。 |
| \-t/\-\-threads | \- | 设置报告和火焰图基于线程展示栈信息。 |
| \-\-nolineno | \- | 设置报告和火焰图不显示行号。 |


#### 使用示例

```
devkit py-perf hotspot -p 2082596 -d 5 -i 100 -o /home/demo/flamegraph -t --native
```

- 参数-p 2082596表示采集进程号为2082596的进程数据，参数-d 5表示采集时长为5秒，参数-i 100表示采样间隔为100毫秒，参数-o /home/demo/flamegraph表示在/home/demo/下生成名为flamegraph.html火焰图文件，参数-t表示以线程维度展示报告和火焰图，参数--native表示采集Python和C的调用栈。
- 示例的返回信息中堆栈信息过多，为便于展示已省略大部分堆栈信息，请以实际使用为准。


返回信息如下：

```
Press Ctrl+ \ to cancel the task or Ctrl+ C to stop the task collection and enter the analysis.
Python Hotspot Top20 Summary Report                     Time:2024/11/18 10:39:07
================================================================================
────────────────────────────────────────────────────────────────────
  Function                                                                                                  Runtime(ms)    Runtime(%)
────────────────────────────────────────────────────────────────────
  Test::_calculate(int, double)                                                                                   4814         95.96
      Test::_calculate(int, double) (/home/workspace/pyhotstpot_demo/simple-demo/test.cpp:18)
      Test::calculate(int, double, char*, int*, double*, char**) (/home/workspace/pyhotstpot_demo/simple-demo/test.cpp:36)
      my_calculate (/home/workspace/pyhotstpot_demo/simple-demo/test.cpp:47)
      ffi_prep_go_closure
      ffi_closure_free
      _ctypes_callproc (/home/Python-3.11.2/Modules/_ctypes/callproc.c:943)
      PyCFuncPtr_call (/home/Python-3.11.2/Modules/_ctypes/_ctypes.c:4212)
      _PyObject_MakeTpCall (/home/Python-3.11.2/./Include/internal/pycore_ceval.h:123)
      calculate (/home/demo/pyhotstpot_demo/simple-demo/test.py:20)
      <module> (/home/demo/pyhotstpot_demo/simple-demo/test.py:67)
      PyEval_EvalCode (/home/Python-3.11.2/./Include/internal/pycore_ceval.h:73)
      run_mod (/home/Python-3.11.2/Python/pythonrun.c:1714)
      _PyRun_SimpleFileObject (/home/Python-3.11.2/Python/pythonrun.c:1630)
      _PyRun_AnyFileObject (/home/Python-3.11.2/Python/pythonrun.c:79)
      pymain_run_python.constprop.0 (/home/Python-3.11.2/Modules/main.c:361)
      Py_BytesMain (/home/Python-3.11.2/Modules/main.c:682)
      __libc_init_first
      __libc_start_main
      _start
  Test::_calculate(int, double)                                                                                   202          4.04
      Test::_calculate(int, double) (/home/workspace/pyhotstpot_demo/simple-demo/test.cpp:19)
      Test::calculate(int, double, char*, int*, double*, char**) (/home/workspace/pyhotstpot_demo/simple-demo/test.cpp:36)
      my_calculate (/home/workspace/pyhotstpot_demo/simple-demo/test.cpp:47)
      ffi_prep_go_closure
      ffi_closure_free
      _ctypes_callproc (/home/Python-3.11.2/Modules/_ctypes/callproc.c:943)
      PyCFuncPtr_call (/home/Python-3.11.2/Modules/_ctypes/_ctypes.c:4212)
      _PyObject_MakeTpCall (/home/Python-3.11.2/./Include/internal/pycore_ceval.h:123)
      calculate (/home/demo/pyhotstpot_demo/simple-demo/test.py:20)
      <module> (/home/demo/pyhotstpot_demo/simple-demo/test.py:67)
      PyEval_EvalCode (/home/Python-3.11.2/./Include/internal/pycore_ceval.h:73)
      run_mod (/home/Python-3.11.2/Python/pythonrun.c:1714)
      _PyRun_SimpleFileObject (/home/Python-3.11.2/Python/pythonrun.c:1630)
      _PyRun_AnyFileObject (/home/Python-3.11.2/Python/pythonrun.c:79)
      pymain_run_python.constprop.0 (/home/Python-3.11.2/Modules/main.c:361)
      Py_BytesMain (/home/Python-3.11.2/Modules/main.c:682)
      __libc_init_first
      __libc_start_main
      _start
────────────────────────────────────────────────────────────────────
The flamegraph html report: /home/demo/flamegraph.html
```

任务生成火焰图html文件可使用浏览器查看，因堆栈名称过长，鼠标悬停在对应堆栈块显示其信息，可单击对应堆栈块查看详情。

图1 火焰图
