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

#### 前提条件

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


#### 操作步骤

函数实现的功能为多个线程对一个变量进行累加操作。实践使用demo请参考testdemo(https://github.com/kunpengcompute/devkitdemo/tree/main/Hyper_tuner/testdemo/锁性能调优实践)。

使用demo需注意以下几点：

1. demo要求GCC版本在7.3及以上，低版本的GCC编译pthread_atomic.c会报错。
2. 若使用的GCC版本为10.x.x及以上，因该版本默认启用LSE指令集，可能优化效果不明显，建议编译程序时添加参数“-march=armv8-a+nolse -mno-outline-atomics”用以禁用该指令集。
3. 若需要关联源码，建议编译时加上-g参数；同时对编译后的二进制文件检查（可使用file pthread_mutex）是否存在BuildID，若不存在建议加上-Wl,--build-id参数。如：gcc -g -Wl,--build-id pthread_mutex.c -o pthread_mutex -lpthread 。
4. 使用热点函数分析任务查看锁热点时，任务开启的同时后台需运行对应的demo，否则无法采集到锁的热点。
5. 更多demo详情请查看demo说明（  readme(https://github.com/kunpengcompute/devkitdemo/blob/main/Hyper_tuner/testdemo/锁性能调优实践/readme.txt)
）。


1. 新建热点函数分析任务。
  单击系统性能分析后面的，选择“通用分析”，打开新建任务页面，选择“热点函数分析”，参数配置完成后单击“确认”启动热点函数分析任务。未特别说明的参数请使用默认值。

  图1 新建热点函数分析任务

**表1 任务配置参数说明**

| 参数 | 说明 |
| --- | --- |
| 分析类型 | 热点函数分析。 |
| 分析对象 | 应用。 |
| 应用路径 | /opt/testdemo/pthread\_mutex。 |
| 采样时长 | 30秒。 |
| 采样频率 | 100次/秒。 |
| 采样范围 | 用户态。 |
| dwarf | 开启。 |
| C/C++ 源文件目录 | 用于采集过程时关联源码。本示例使用/opt/testdemo/。 |


2. 查看分析结果。
  图2 总览

  可以看到实际的两个线程对应的功能函数时钟周期占比很小，主要热点在Glibc对应的互斥锁上面。

3. 新建锁与等待分析任务。
  单击系统性能分析后面的，选择“通用分析”，打开新建任务页面，选择“锁与等待分析”，参数配置完成后单击“确认”启动锁与等待分析任务。未特别说明的参数请使用默认值。

  图3 新建锁与等待分析任务

**表2 任务配置参数说明**

| 参数 | 说明 |
| --- | --- |
| 分析类型 | 锁与等待分析。 |
| 分析对象 | 应用。 |
| 模式 | Attach to process。 |
| PID | 选择pthread\_mutex应用对应的进程号。 |
| 锁分析类型 | 全选（勾选“直方图统计”和“锁实例分析”）。 |
| 预定义锁类型 | 默认。 |
| 采样时长 | 60秒。 |
| 采集原数据最大大小 | 1024MiB。 |
| 分析栈 | 关闭。 |


4. 查看分析结果。
  图4 锁与等待分析结果

  可以看到对应锁的调用情况，以及对应功能函数里的源码，对于变量num进行累加操作前后需要使用互斥锁，保证多个线程的操作均被执行到。但是应用的实际效率是很低的，过多的开销花费在了互斥锁的acquire和release上面。
