鲲鹏社区首页
中文
注册
练习:采集分析程序运行数据,优化程序性能瓶颈点

练习:采集分析程序运行数据,优化程序性能瓶颈点

开发框架

发表于 2023/04/27

0

尊敬的鲲鹏开发者你好,为了解决开发者在开发过程中会遇到的调优问题,我们提供了DevKit性能分析工具Hyper Tuner,实现系统及程序的快速调优,您可以阅读本文进行DevKit性能分析工具Hyper Tuner的快速入门。

本文主要介绍了以下知识:

(1)什么是DevKit性能分析工具Hyper Tuner

(2)系统性能分析调优实践

(3)诊断调试调优实践

基础技能:

(1)具备基础的C/C++语言编程能力

(2)了解常用的Linux操作命令

(3)了解VS Code基础操作

什么是DevKit性能分析工具

当前一些复杂的大规模系统场景下,好的应用程序性能比以往任何时候都更重要,但是获得这样的性能也更加困难。Linux由于其具有开源特性,目前市面上已经存在较多的优化工具,只是这些工具相对分散,且使用说明文档也较少,只有部分专家知道如何把这些工具结合起来解决一些实际问题,对于调优能力相对薄弱的开发来说不是很友好,为了解决这一问题,Devkit推出了性能分析工具,从以下几个方面来帮助大家实现系统及程序的快速调优。


(1)调优助手是针对基于鲲鹏的服务器的调优工具,能系统化组织性能指标,引导用户分析性能瓶颈,实现快速调优。

(2)系统性能分析是针对基于鲲鹏的服务器的性能分析工具,能收集服务器的处理器硬件、操作系统、进程/线程、函数等各层次的性能数据,分析出系统性能指标,定位到系统瓶颈点及热点函数,给出优化建议。该工具可以辅助用户快速定位和处理软件性能问题。

(3) Java性能分析是针对基于鲲鹏的服务器上运行的Java程序的性能分析和优化工具,能图形化显示Java程序的堆、线程、锁、垃圾回收等信息,收集热点函数、定位程序瓶颈点,帮助用户采取针对性优化。

(4)系统诊断是针对基于鲲鹏的服务器的性能分析工具,通过分析系统运行指标,识别异常点,例如:内存泄漏、内存越界、网络丢包等,并给出优化建议,帮助用户识别出源代码中内存使用的问题点,提升程序的可靠性。工具还支持压测系统,如:网络IO、存储IO,评估系统最大性能。

如果希望更进一步了解DevKit性能分析工具Hyper Tuner,欢迎大家前往社区下载使用:https://www.hikunpeng.com/developer/devkit/hyper-tuner/download?tab=0

开始multiply的性能调优实验

1. 准备工作

步骤一:申请鲲鹏远程实验室资源

性能的过程需要在鲲鹏平台上完成,为了方便开发者在鲲鹏环境上进行开发,我们提供了鲲鹏远程实验室资源供大家免费申请。

为了兼顾所有鲲鹏开发者的开发体验,我们在鲲鹏远程实验室中提供了云开发环境(开发态模式)和远程服务器(黑框模式)。

本文涉及案例会在云开发环境上进行,开发者在申请云开发环境后可以直接通过在线IDE的方式打开页面进行操作。降低了开发者在鲲鹏上的开发门槛。

首先我们访问鲲鹏社区的远程实验室页面https://www.hikunpeng.com/zh/developer/cloud-lab,申请云开发环境:


之后我们输入自己的邮箱地址,选择openEuler 20.03 LTS-SP1系统,申请成功后我们点击“打开在线IDE”按钮,进入云开发环境中,云开发环境给大家提供了在线Vscode页面,方便我们直接在鲲鹏上进行开发。

步骤二:确认预置的对比demo

首先点击侧边栏第一个图标后依次点击“终端”、“新建终端”

接下来将确认预置的对比demo源码及-g编译的二进制已存在,且源码为644权限,二进制为777权限。

ll /opt/devkitdemo/Hyper_tuner/testdemo/multiply

文件与权限结果。

确认二进制文件带符号文件,查看BuildID信息是否存在。

file /opt/devkitdemo/Hyper_tuner/testdemo/multiply/multiply
file /opt/devkitdemo/Hyper_tuner/testdemo/multiply/multiply _simd

multiply程序的multiply方法是循环执行N次矩阵乘法,其中的N是以亿计数的常量,因为是大数量且考虑到矩阵乘法可以拆分并行计算,并行计算分支相对独立,可以使用鲲鹏的NEON指令来提升执行效率,multiply_simd是经过NEON指令优化后的程序,可大幅减少 矩阵乘法运算的时间。

以下是主要代码,其中的N为1000000000。

2. 性能调优实践

步骤一:执行热点函数任务分析优化前代码

完成上述准备工作后,现在就可以开始执行热点函数分析任务了。我们点击鲲鹏性能调优插件的图标,点击登录后勾选“我已阅读并同意”,点击“确认”,输入邮件的DevKit工具用户名和密码登录性能分析工具。


选择系统性能分析。

选择当前节点创建工程。


选择应用级的热点函数分析任务

设定如下参数

(1)应用绝对路径:/opt/devkitdemo/Hyper_tuner/testdemo/multiply/multiply

(2)采样时长:30

(3)符号文件路径:/opt/devkitdemo/Hyper_tuner/testdemo/multiply/multiply (用于采集过程当中,获取函数名和源文件代码)

(4)C/C++源文件路径:/opt/devkitdemo/Hyper_tuner/testdemo/multiply/multiply.c(用于采集过程当中,获取函数名和源文件代码)

其余参数默认,点击确认后执行分析任务。


步骤二:分析优化前后的性能报告

分析完成后单击“查看报告”,进入“总览”页签查看报告数据。


从报告可以看出,multiply函数执行时间为7.53秒,占整个程序的执行时间一半以上。multiply函数主要进行矩阵乘法运算,需要进行大量数据处理操作,而鲲鹏提供的NEON指令可以对单个数据的操作扩展为对寄存器(同一类型元素矢量)的操作,从而大大减少了操作次数,以此来提升执行效率。

multiply_simd.c就是使用NEON指令优化后的代码。选择/opt/devkitdemo/Hyper_tuner/testdemo/multiply/multiply_simd作为程序进行性能分析,结果报告如下图所示:

可以看到在相同采集时长内,优化后的multiply函数的执行时间下降了三分之一左右,所占的时钟周期百分比也有所下降,说明热点函数multiply已经通过NEON指令进行了大幅优化。

步骤三:优化前后函数执行时间对比

运行命令如下:

cd /opt/devkitdemo/Hyper_tuner/testdemo/multiply/
./multiply
./multiply_simd

可以优化后的程序时长降低了几乎三分之一。从前面的报告也可以看出,gen_data接口热点较高,该接口是用于数据生成的。实际用于计算的热点函数multiply已经优化完毕。抛去数据生成的前置时间消耗,对比计算部分程序的性能,优化后提升会更明显。

恭喜

到这里整个实验流程就已经结束了,通过上面的实验我们也进一步熟悉了Devkit调优工具中的系统性能分析和系统诊断。各位鲲鹏开发者也可以接着探索调优工具提供的调优助手、Java性能分析等功能,成为更加优秀的鲲鹏开发者。

除了上述学习内容,我们还提供了很多辅助学习资源(课程/实验/文档/文章),希望能帮助到您更好的使用鲲鹏DevKit性能分析工具:

鲲鹏性能分析工具介绍(课程):

https://www.hikunpeng.com/learn/courses-list/detail/1590563596839514114

手把手带你找出程序中加锁范围不合理的代码(课程):

https://www.hikunpeng.com/learn/courses-list/detail/1556843127381409793

鲲鹏性能分析工具-快速入门(文档):

https://www.hikunpeng.com/document/detail/zh/kunpengdevps/hypertuner/qs/qs-sqt-kunpengdevps.html

本页内容