---
title: 性能分析过程
description: "- 服务器和操作系统正常运行。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdevps/profiler/demo/kunpengsptpypractice_memory_0002.html
sourcePath: /source/zh/kunpengdevps/profiler/demo/kunpengsptpypractice_memory_0002.html
indexId: 0fa184830fe29b2f369fdd202036ea9bbcdedf8079290e5d8888e16f486f7e0875
---
# 性能分析过程

#### 前提条件

- 服务器和操作系统正常运行。
- PC端已经安装SSH远程登录工具。
- 目标环境上鲲鹏性能定界工具、系统性能分析工具已经安装完成，并正常运行。


#### 操作步骤

1. 从GitHub(https://github.com/kunpengcompute/devkitdemo/tree/main/Hyper_tuner/testdemo/Know-how)下载memory_bound.c、utils.h文件，上传到“/home/demo”目录，执行如下命令切换至源码目录。

```
cd /home/demo
```


2. 编译源码文件。

```
gcc -O2 -o /home/demo/ddrc_before /home/demo/memory_bound.c -fopenmp
```


3. 查看应用运行时间。

```
./ddrc_before
```


  执行命令后，发现应用运行时间为6372毫秒。可使用鲲鹏性能定界工具定位应用有无性能问题，若应用中确实存在优化项则优化源代码。当前应用运行时间作为时间开销的基线。

  运行结果可能因环境不同而产生差异，属于正常情况。

  图1 运行时间

4. 使用鲲鹏性能定界工具定界。
  将鲲鹏性能定界工具压缩包上传到“/home”
  目录并解压，解压后进入鲲鹏性能定界工具安装目录，xxx指版本号，请根据实际情况替换。

```
cd /home/ksys-
x.x.x
-Linux-aarch64
```


5. 采集应用的性能数据。

```
./ksys collect /home/demo/ddrc_before
```


  /home/demo/ddrc_before：指定采集的应用。

  图2 访存统计数据 在访存统计数据部分，可以看出Node 0的ddrc_rd_bw的带宽较高，鲲鹏服务器从内存中读取数据时，会经过DDR处理器（DDRC设备），当程序存在内存瓶颈时，DDRC的读写带宽会出现异常高值。此时，需要关注程序中大量内存读写的代码部分，系统性能分析工具的访存统计分析聚焦内存性能数据采集，有更细致的用户提示和更详细的评判机制，推荐使用系统性能分析工具的访存统计进一步分析程序。

6. 使用系统性能分析工具进一步分析程序。
  将系统性能分析工具压缩包上传到“/home”
  目录并解压，解压后切换至系统性能分析工具安装目录，xxx指版本号，请根据实际情况替换。

```
cd /home/DevKit-Tuner-CLI-
x.x.x
-Linux-aarch64
```


7. 新建脚本文件，系统性能分析的访存统计分析没有针对应用的模式，因此使用脚本进行分析。

  a. 执行如下命令新建脚本。

```
vim memory.sh
```


  b. 按“i”进入编辑模式。
  c. 在脚本中添加以下内容，xxx指版本号，请根据实际情况替换。

```
/home/DevKit-Tuner-CLI-
x.x.x
-Linux-aarch64/devkit tuner memory &
TUNER_PID=$!
/home/demo/ddrc_before
pkill -P $TUNER_PID 2>/dev/null
kill $TUNER_PID 2>/dev/null
wait $TUNER_PID 2>/dev/null
```


  d. 按“Esc”，输入:wq!，按“Enter”保存并退出。
  e. 赋予脚本文件权限。

```
chmod 777 memory.sh
```


8. 执行脚本文件，对应用进行访存统计分析。

```
./memory.sh
```


  图3 访存统计分析报告

  查看访存统计分析报告，工具提供的DDRC读带宽的参考瓶颈值为12500MB/s，实际采集到NODE 0的DDRC读带宽总值超过了50000MB/s，应用运行期间若DDRC读带宽超过了瓶颈值，则表示内存读取的相关代码存在优化点，推荐使用系统性能分析工具的Miss事件分析进一步查看是否存在内存命中率问题。

9. 对应用进行Miss事件分析。

```
./devkit tuner miss /home/demo/ddrc_before
```

图4 Miss事件分析报告
查看Miss事件分析报告，发现函数MemoryBoundBench的LLC Miss Rate异常高，结合访存统计分析DDRC读带宽指标高的结果，需排查源码是否存在如下缓存命中率低的典型问题：

  a. 存在大量随机访问数组或链表。
  b. 频繁的内存复制或序列化。
  c. 算法没有局部性，导致Cache Miss。
10. 查看源码文件，确定源码问题。

```
vim /home/demo/memory_bound.c
```


  图5 源码文件

  源码中存在大量随机数的访问，且没有对内存的访问进行限制，可能会导致内存访问的随机性增加，易产生跨DIE跨片访问，导致内存命中率低。
