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

- 支持的Python版本为3.7.X至3.11.X。
- 仅支持openEuler操作系统。
- 仅支持PID模式采集分析。
命令格式
1
|
devkit py-perf hotspot [-h] [-l {0,1,2,3}] [-d <sec>] [-i <msec>] [-p {PID}] [-o <file>] [-t] [--native] [--nolineno] |
参数说明
参数 |
参数选项 |
说明 |
---|---|---|
-h/--help |
- |
获取帮助信息。 |
-l/--log-level |
0/1/2/3 |
设置日志级别,默认为1。
|
-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 |
- |
设置报告和火焰图不显示行号。 |
使用示例
1
|
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表示以线程维度展示报告和火焰图。
- 示例的返回信息中堆栈信息过多,为便于展示已省略大部分堆栈信息,请以实际使用为准。
返回信息如下:
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 46 47 48 |
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 火焰图

父主题: Python/C性能分析