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

热点函数分析

命令功能

通过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]

参数说明

表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

-

设置报告和火焰图不显示行号。

使用示例

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 火焰图