---
title: 通过终端工具对MPI应用进行性能分析
description: "使用命令通过终端工具对MPI应用进行性能分析。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdevkithistory/devkit_24_t50/usermanual/KunpengDevKit_0131.html
sourcePath: /source/zh/kunpengdevkithistory/devkit_24_t50/usermanual/KunpengDevKit_0131.html
indexId: b0be7f30d96906f87927d15b060c2d7cba36d4b492061cb51cc1abfd6039a8e080
---
# 通过终端工具对MPI应用进行性能分析

#### 命令功能

使用命令通过终端工具对MPI应用进行性能分析。

使用前需已安装系统性能分析工具，默认工具目录为/usr/bin/devkit/mpi_adaptive。


**表1 子命令功能介绍**

| 子命令 | 介绍 |
| --- | --- |
| sclrun | 采集MPI应用常用的调用信息。 |
| sclread | 读取采集到的性能数据并转换为可查看文件。 |
| time\_line | 分析采集后的函数信息，并将mpi\_send和mpi\_recv事件相关信息入库，统计事件的时序数据，对齐各个MPI进程的启动事件时间线。 |
| query\_timeline\_data | 查询MPI进程的事件信息。 |
| \-h/\-\-help | 获取帮助信息。 |


#### 命令格式

```
./mpi_adaptive_tool [-h | --help] COMMAND [ARGS]
```

- 工具仅支持Open MPI 4.0.3及以上版本。
- 工具仅支持在鲲鹏920平台上运行。
- 待采集的应用程序在编译时须添加“-g”参数，否则在使用工具采集调用栈信息时，可能无法获取变量和函数符号信息，结果报告中以“??”显示。
- 若需对多节点集群进行分析，请将工具目录“/usr/bin/devkit/mpi_adaptive”拷贝至集群的共享目录下，并根据实际情况修改共享目录下mpi_adaptive/config/cfg.ini文件中logPath变量。


- sclrun子命令格式：
  1 mpi_adaptive_tool sclrun [ -h | --help ] [ --backtrace ] [ -backtrace_max_depth <depth> ] [ -samp_mode {1,2,3} ] [ -samp_ratio <ratio> ] [ -samp_random <seed> ] [ -l | --log-level {0,1,2,3} ] [ -o | --output <collect_result_directory> ] [ <exe> <args> ]

  [<exe> <args>]为待采集的MPI应用及参数，使用命令时的必填项，输入在命令行最后位置。

- sclread子命令格式：
  1 mpi_adaptive_tool sclread [ -h | --help ] [ -i | --input <sclrun_result_dir> ] [ -o | --output <readable_output_file> ] [ -l | --log-level {0,1,2,3} ] [ -f | --force ]


- time_line子命令格式：
  1 mpi_adaptive_tool time_line [ -h | --help ] [ -i | --input <sclrun_result_dir> ] [ -o | --output <analyze_output_file> ] [ -l | --log-level {0,1,2,3} ] [ -f | --force ]


- query_timeline_data子命令格式：
  1 mpi_adaptive_tool query_timeline_data [ -h | --help ] [ --path <timeline_db_dir> ] [ -p | --page <page_number> ] [ -s | --pagesize <page_size> ] [ -r | --rank <rank_number> ] [ -d | --detail ]


#### 子命令参数说明

- 采集MPI应用常用的调用信息：sclrun
**表2 sclrun子命令参数说明**

| 命令 | 参数 | 说明 |
| --- | --- | --- |
| \-h/\-\-help | \- | 获取帮助信息。 |
| \-o/\-\-output | \- | 必选参数，采集应用性能数据的输出目录。 |
| \-l/\-\-log\-level | 0/1/2/3 | 设置日志级别，默认为1。日志配置文件在工具目录下config/cfg.ini。 0：日志级别为DEBUG。 1：日志级别为INFO。 2：日志级别为WARNING。 3：日志级别为ERROR。 |
| \-\-backtrace | \- | 开启采集应用的调用栈信息。 |
| \-backtrace\_max\_depth | \- | 设置需采集的调用栈最大深度；默认为20层，使用参数“\-\-backtrace”时可配置。 |
| \-samp\_mode | 1/2/3 | 设置采集性能数据时的采样模式，默认为1。 1：全采样。 2：固定比例采样，按照参数“\-\-samp\_ratio”指定的采样比率进行数据采集。 3：自适应采样，按照rank数自适应采样比例，进行数据采集。 |
| \-samp\_ratio | \- | 采样比率，默认为0，取值范围0~100，参数“\-samp\_mode”选择“2”时可配置。 |
| \-samp\_random | <seed> | 开启随机采样，按照指定的随机种子（需为整数）进行随机采样（仅控制采样时rank值的随机性，不改变采样数量）。 |


- 读取采集到的性能数据并转换为可查看文件：sclread
**表3 sclread子命令参数说明**

| 命令 | 参数 | 说明 |
| --- | --- | --- |
| \-h/\-\-help | \- | 获取帮助信息。 |
| \-l/\-\-log\-level | 0/1/2/3 | 设置日志级别，默认为1。日志配置文件在工具目录下config/cfg.ini。 0：日志级别为DEBUG。 1：日志级别为INFO。 2：日志级别为WARNING。 3：日志级别为ERROR。 |
| \-i/\-\-input | <sclrun\_result\_dir> | 必选参数，已采集到的性能数据结果文件目录。 |
| \-o/\-\-output | \- | 可视报告的输出目录。 |
| \-f/\-\-force | \- | 若输出目录已存在，则强制覆盖其中sclread相关内容。 |


- 对齐各个MPI进程的启动事件时间线：time_line
**表4 time_line子命令参数说明**

| 命令 | 参数 | 说明 |
| --- | --- | --- |
| \-h/\-\-help | \- | 获取帮助信息。 |
| \-l/\-\-log\-level | 0/1/2/3 | 设置日志级别，默认为1。日志配置文件在工具目录下config/cfg.ini。 0：日志级别为DEBUG。 1：日志级别为INFO。 2：日志级别为WARNING。 3：日志级别为ERROR。 |
| \-i/\-\-input | <sclrun\_result\_dir> | 必选参数，已采集到的性能数据结果文件目录。 |
| \-o/\-\-output | \- | 设置用于存储各个事件时间偏移量的结果文件保存目录，文件类型为SQLite数据库文件（默认值time\_series.db） 。 |
| \-f/\-\-force | \- | 若输出目录已存在，则强制覆盖其中time\_line相关内容。 |


- 查看MPI进程的事件信息：query_timeline_data
**表5 query_timeline_data子命令参数说明**

| 命令 | 参数 | 说明 |
| --- | --- | --- |
| \-h/\-\-help | \- | 获取帮助信息。 |
| \-\-path | <timeline\_db\_dir> | 指定查询的数据库文件路径。 |
| \-p/\-\-page | \- | 查询数据的页数，默认为1。 |
| \-s/\-\-pagesize | \- | 查询时每页显示数据数目，默认为10。 |
| \-r/\-\-rank | \- | 筛选特定的rank，不指定时默认展示全部数据。 |
| \-d/\-\-detail | \- | 显示详细调用栈信息，不开启默认只显示简要的调用栈信息。 |


#### 使用示例

1. 切换至工具目录。
  1 cd /usr/bin/devkit/

  安装DevKit系统性能分析工具后，默认工具目录为“/usr/bin/devkit/mpi_adaptive”。

2. 将mpi_adaptive目录整体复制到共享目录。
  若执行mpirun，需在共享目录中运行工具。

  1 2 cp -r mpi_adaptive /home/share cd /home/share/mpi_adaptive

3. 采集应用程序的性能数据。
  1 /opt/bin/mpirun -x PATH -x LD_LIBRARY_PATH -mca btl ^openib --mca pml ucx -bind-to core -np 10 --map-by ppr:96:node ./mpi_adaptive_tool sclrun -o /home/share/tmp --backtrace -- /home/mpi_adaptive_tool/test_mpi

  “/opt/bin/mpirun -x PATH -x LD_LIBRARY_PATH -mca btl ^openib --mca pml ucx -bind-to core -np 10 --map-by ppr:96:node”为MPI运行命令，“-o /home/share/tmp”表示将采集结果输出至“/home/share/tmp”目录下，需在共享目录下；“--backtrace”表示采集调用栈信息，“-- /home/mpi_adaptive_tool/test_mpi”指定需采集的应用程序，采集后生成的文件为二进制文件。

4. 将性能数据转换为可查看文件。
  1 ./mpi_adaptive_tool sclread -i /home/share/tmp -o /home/tmp2 -f

  “-i /home/share/tmp”表示sclrun采集的性能数据存放目录是“/home/share/tmp”，“-o /home/tmp2”表示将性能数据转换为可查看数据并存放至“/home/tmp2”目录下，“-f”表示强制覆盖指定目录下已有的sclread相关内容，生成的文本文件可直接查看。

  返回信息：

  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Configured: Input: /home/share/tmp Output: /home/tmp2 === Event 19 === Event Name: MPI_Recv Start Time: 717638437792265 End Time: 717638437792333 Duration: 68 Record Size: 58 Data type: 4326592 Dest/Src: 0 Type Size: 4 Tag: 20 Count: 1 MPI Comm: 4325568

5. 对齐MPI应用事件时间线。
  1 ./mpi_adaptive_tool time_line -i /home/share/tmp -o /home/time_line.db -f

  “-o /home/time_line.db”指定生成的db文件名称及路径，未指定db文件名称将默认在当前目录生成time_series.db，该文件使用sqlite数据库查看；“-f”表示强制覆盖指定目录下已有的time_line相关内容。

  返回信息：

  1 2 3 Configured: Input: /tmp/ Output: /home/time_line.db

6. 查看MPI应用的数据信息。
  1 ./mpi_adaptive_tool query_timeline_data --path /home/time_line.db -d

  “--path /home/time_line.db”指定需查询的db文件，“-d”表示以详细信息形式展示调用栈信息。

  图1 详细信息

**表6 query_timeline_data回显信息说明**

| 参数 | 说明 |
| --- | --- |
| id | MPI信息编号。 |
| rank | 对应的rank号。 |
| event | 事件类型。 |
| start\_time | MPI接口运行开始时的系统计数器值。 |
| end\_time | MPI接口运行结束时的系统计数器值。 |
| use\_time | MPI接口运行期间的系统计数器变化值，可通过公式（use\_time / ( freq\_mhz \* 10^6 ）)换算成单位为秒的时长，freq\_mhz为时钟分辨率，单位MHz，可通过命令“sudo dmesg \| grep clock”获取。 |
| datatype | 数据类型。 |
| typesize | 对应类型数据的大小。 |
| dest | 与当前rank通信的rank（如果是MPI\_Send，则表示接收信息的rank，如果是MPI\_Recv，则表示发送信息的rank）。 |
| tag | 信息标识符。 |
| count | 发送或接收的MPI信息数。 |
| comm | 通信域。 |
| backtrace | 调用栈信息。 |
