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

1、调优助手是针对基于鲲鹏的服务器的调优工具,能系统化组织性能指标,引导用户分析性能瓶颈,实现快速调优。
2、系统性能分析是针对基于鲲鹏的服务器的性能分析工具,能收集服务器的处理器硬件、操作系统、进程/线程、函数等各层次的性能数据,分析出系统性能指标,定位到系统瓶颈点及热点函数,给出优化建议。该工具可以辅助用户快速定位和处理软件性能问题。
3、Java性能分析是针对基于鲲鹏的服务器上运行的Java程序的性能分析和优化工具,能图形化显示Java程序的堆、线程、锁、垃圾回收等信息,收集热点函数、定位程序瓶颈点,帮助用户采取针对性优化。
4、系统诊断是针对基于鲲鹏的服务器的性能分析工具,通过分析系统运行指标,识别异常点,例如:内存泄漏、内存越界、网络丢包等,并给出优化建议,帮助用户识别出源代码中内存使用的问题点,提升程序的可靠性。工具还支持压测系统,如:网络IO、存储IO,评估系统最大性能。
今天我们主要从系统性能分析工具入手,测试目标应用的执行情况,找到性能瓶颈点,并根据分析结果进行优化修改,从而降低应用程序对系统资源的消耗。
1、申请鲲鹏远程实验室资源
有的同学刚刚接触服务器或者没有操作过服务器,目前没有一个属于自己的服务器可操作,不用担心,为了降低大家在鲲鹏平台上体验的使用门槛,我们推出了云开发环境,首先申请简单,输入邮箱地址后就可以申请到鲲鹏远程实验室资源,其次操作简单,申请完成后就可以打开页面进行操作。
首先我们访问鲲鹏社区的远程实验室页面https://www.hikunpeng.com/zh/developer/cloud-lab,申请云开发环境:

之后我们输入自己的邮箱地址,选择openEuler 20.03 LTS-SP3系统,本次调优案例相对简单, 1天的体验时间完全足够,这样也方便后面体验的小伙伴快速申请到体验资源。申请成功后我们点击“打开在线IDE”按钮,进入云开发环境中,云开发环境给大家提供了在线Vscode页面,方便我们直接在鲲鹏上进行开发。

2、测试demo下载
进入到在线开发页面后,为了完成体验性能优化的过程,我们需要在环境中下载测试代码demo,确保后续功能可以正常进行,依次点击“终端”、“新建终端”,打开远程IDE的终端。之后在下方弹出的终端页面中输入命令ssh root@IP address后,输入yes进行指纹确认,再输入SSH密码,切换至root用户(环境申请成功后,会向申请邮箱中发送邮件,密码需要从邮件中获取),这里大家注意2个事情:
1)、IP地址要换成自己云开发环境的IP地址,打开终端后就会在下图中的对应位置上显示
2)、服务器用户密码属于隐私信息,因此大家在输入的时候屏幕不会显示输入的信息,大家不必疑惑,正常完成输入后按下回车就好。


进入远程IDE的终端执行如下代码:
cd /opt && git clone https://github.com/kunpengcompute/devkitdemo.git && cd devkitdemo/Hyper_tuner/testdemo/multiply

3、编译程序
Demo下载完成后,继续执行如下命令,进入multiply文件夹,编译multiply.c并赋予执行文件所有用户只读、只写、可执行权限。
gcc -g multiply.c -o multiply && chmod -R 777 multiply

1、登录系统性能优化工具Hyper Tuner
打开在线IDE,首次登录需要创建管理员密码

管理员密码设置成功后,需要用管理员用户名和密码再次登录。如下图所示

登录成功后,单击“系统性能分析”,进入系统性能分析操作界面,仔细阅读免责声明后,勾选阅读并同意声明内容,即可进行下一步操作,如下图所示:

2、创建工程
根据提示,单击工程管理旁边“+”按钮创建工程,输入工程名称,如test,勾选节点,当前为此云服务器节点,单击“确认”创建工程,如下图所示:

3、创建任务
将光标放到创建好的工程“test”上,会出现按钮,单击“+”新建任务,如下图所示:

弹出如下界面,填写如下:
- 任务名称:multiply_c
- 分析对象:应用(注意我们此时分析确定程序的热点函数,所以不需要在服务器上运行程序,而是直接在工具中选择需要运行的程序,当前是multiply程序)
- 应用路径:/opt/devkitdemo/Hyper_tuner/testdemo/multiply/multiply(输入程序所在的绝对路径,注意:示例路径里面第一个multiply为文件夹,第二个multiply为可执行程序)
- 分析类型:热点函数分析
- 采样范围:用户态(采样范围分用户态,内核态,所有。因为我们这里发现所有的CPU消耗都在用户态,所以只采集用户态的数据)
- 采样时长:20秒
- 二进制/符号文件路径:/opt/devkitdemo/Hyper_tuner/testdemo/multiply/multiply(用于采集过程当中,获取函数名和源文件代码)
- C/C++源文件路径:/opt/devkitdemo/Hyper_tuner/testdemo/multiply/multiply.c(用于采集过程当中,获取函数名和源文件代码)
- 点击“确认”执行


4、查看分析结果
执行完毕后,显示热点函数分析的结果,如下图所示。在“总览”显示采集运行时长、程序运行的时钟周期数和指令数。在下面的Top 10 热点函数中,multiply程序中的multiply函数占用了40左右的时钟周期数。

点击“函数”页签进入下图,可以看到所有函数的信息,包括执行时间,时钟周期,指令数等。

点击 “multiply” 进入函数模块,可以看到对应的源代码以及汇编代码,如下图。在“代码流”模块,显示不同Basic Block时钟周期的占比,颜色越深,占比越高。例如下图,单击Basic Block2,上方“汇编代码”和“源代码”浅蓝色突出显示占用时钟周期数高的代码行。

5、NEON指令优化代码
考虑到矩阵乘法可以拆分并行计算,且并行计算分支相对独立,可以使用鲲鹏的NEON指令来提升执行效率。NEON指令通过将对单个数据的操作扩展为对寄存器,也即同一类型元素矢量的操作,从而大大减少了操作次数,以此来提升执行效率。
步骤1 编译程序
再次进入“IDE远程终端”工具,执行如下代码,进入multiply文件夹,编译multiply_simd.c并赋予执行文件所有用户只读、只写、可执行权限。
cd /opt/devkitdemo/Hyper_tuner/testdemo/multiply && gcc -g multiply_simd.c -o multiply_simd && chmod -R 777 /opt/devkitdemo/Hyper_tuner/testdemo/multiply /multiply_simd
6、C/C++代码性能优化后执行效果
创建任务
- 任务名称:multiply_simd_c
- 分析对象:应用
- 应用路径:/opt/devkitdemo/Hyper_tuner/testdemo/multiply/multiply_simd(程序所在的绝对路径)
- 分析类型:热点函数分析
- 采样范围:用户态
- 采样时长:20秒
- 二进制/符号文件路径:/opt/devkitdemo/Hyper_tuner/testdemo/multiply/multiply_simd
- C/C++源文件路径: /opt/devkitdemo/Hyper_tuner/testdemo/multiply/multiply_simd.c
- 点击“确认”执行

7、查看采集分析结果
执行完毕后,显示热点函数分析的结果。对比multiply程序和multiply_simd程序的热点函数分析结果,如下图所示。在“总览”页签下,对比两者的指令数,可以发现优化后的multiply_simd程序指令数大幅减少。
下图为multiply程序热点函数分析结果:


点击进入函数“multiply_neon”,查看占有时钟周期数最长的Basic Block和相对应的源代码和汇编代码行,比较multiply和multiply_simd中占有时钟周期最大的代码行对应的“数量(占比)”数值。
例如如下图所示:比较multiply程序C/C++性能分析结果的源代码60行,和multiply_simd程序分析结果的源代码74行,其数量(占比)有明显减少,说明优化有效。
下图为multiply程序热点函数分析结果:

下图为multiply_simd程序热点函数分析结果:

到这,整个实验流程就结束了,此实验进行矩阵乘法计算,首先测试用普通for loop方式进行一维矩阵乘法计算的性能,然后考虑到矩阵乘法可以拆分并行计算,且并行计算分支相对独立,于是使用鲲鹏的NEON指令来进行计算,检测优化后的执行效率。
同时同学们还可以去体验我们性能调优工具的沙箱实验https://www.hikunpeng.com/zh/learn/experiments/detail/T221121003,完成性能调优实践的微认证课程及考试https://www.hikunpeng.com/learn/micro-certification/detail/1e8991b4b0d348cb8e01b581d2170796,更进一步的了解和掌握Devkit性能分析工具的使用,学习到更多的新知识,祝大家学习顺利,收获满满!
欢迎大家在社区中发帖,讲一讲自己使用DevKit性能分析工具的过程与心得,给我们后来的小伙伴们提供一些指导与帮助。
【温馨提醒】
完成体验过程的小伙伴可以回到云开发服务资源申请页面,点击释放资源,将服务器资源留给后续的同学进行体验。在申请时间内没有完成体验的同学可以点击续约按钮延长服务器资源的使用时间。

各位同学大家好,欢迎大家参加Devkit调优工具的体验活动,我是本期活动的分享嘉宾。接下来我将给大家分享一下如何使用Devkit调优工具对系统进行快速调优。
在当前一些复杂的大规模系统场景下,好的应用程序性能比以往任何时候都更重要,但是获得这样的性能也更加困难。Linux由于其具有开源特性,目前市面上已经存在较多的优化工具,只是这些工具相对分散,且使用说明文档也较少,只有部分专家知道如何把这些工具结合起来解决一些实际问题,对于调优能力相对薄弱的开发来说不是很友好,
为了解决这一问题,Devkit推出了性能分析工具,从以下几个方便来帮助大家实现系统及程序的快速调优。
1、调优助手是针对基于鲲鹏的服务器的调优工具,能系统化组织性能指标,引导用户分析性能瓶颈,实现快速调优。
2、系统性能分析是针对基于鲲鹏的服务器的性能分析工具,能收集服务器的处理器硬件、操作系统、进程/线程、函数等各层次的性能数据,分析出系统性能指标,定位到系统瓶颈点及热点函数,给出优化建议。该工具可以辅助用户快速定位和处理软件性能问题。
3、Java性能分析是针对基于鲲鹏的服务器上运行的Java程序的性能分析和优化工具,能图形化显示Java程序的堆、线程、锁、垃圾回收等信息,收集热点函数、定位程序瓶颈点,帮助用户采取针对性优化。
4、系统诊断是针对基于鲲鹏的服务器的性能分析工具,通过分析系统运行指标,识别异常点,例如:内存泄漏、内存越界、网络丢包等,并给出优化建议,帮助用户识别出源代码中内存使用的问题点,提升程序的可靠性。工具还支持压测系统,如:网络IO、存储IO,评估系统最大性能。
今天我们主要从系统性能分析工具入手,测试目标应用的执行情况,找到性能瓶颈点,并根据分析结果进行优化修改,从而降低应用程序对系统资源的消耗。
1、申请鲲鹏远程实验室资源
有的同学刚刚接触服务器或者没有操作过服务器,目前没有一个属于自己的服务器可操作,不用担心,为了降低大家在鲲鹏平台上体验的使用门槛,我们推出了云开发环境,首先申请简单,输入邮箱地址后就可以申请到鲲鹏远程实验室资源,其次操作简单,申请完成后就可以打开页面进行操作。
首先我们访问鲲鹏社区的远程实验室页面https://www.hikunpeng.com/zh/developer/cloud-lab,申请云开发环境:
之后我们输入自己的邮箱地址,选择openEuler 20.03 LTS-SP3系统,本次调优案例相对简单, 1天的体验时间完全足够,这样也方便后面体验的小伙伴快速申请到体验资源。申请成功后我们点击“打开在线IDE”按钮,进入云开发环境中,云开发环境给大家提供了在线Vscode页面,方便我们直接在鲲鹏上进行开发。
2、测试demo下载
进入到在线开发页面后,为了完成体验性能优化的过程,我们需要在环境中下载测试代码demo,确保后续功能可以正常进行,依次点击“终端”、“新建终端”,打开远程IDE的终端。之后在下方弹出的终端页面中输入命令ssh root@IP address后,输入yes进行指纹确认,再输入SSH密码,切换至root用户(环境申请成功后,会向申请邮箱中发送邮件,密码需要从邮件中获取),这里大家注意2个事情:
1)、IP地址要换成自己云开发环境的IP地址,打开终端后就会在下图中的对应位置上显示
2)、服务器用户密码属于隐私信息,因此大家在输入的时候屏幕不会显示输入的信息,大家不必疑惑,正常完成输入后按下回车就好。
进入远程IDE的终端执行如下代码:
cd /opt && git clone https://github.com/kunpengcompute/devkitdemo.git && cd devkitdemo/Hyper_tuner/testdemo/multiply
3、编译程序
Demo下载完成后,继续执行如下命令,进入multiply文件夹,编译multiply.c并赋予执行文件所有用户只读、只写、可执行权限。
gcc -g multiply.c -o multiply && chmod -R 777 multiply
1、登录系统性能优化工具Hyper Tuner
打开在线IDE,首次登录需要创建管理员密码
管理员密码设置成功后,需要用管理员用户名和密码再次登录。如下图所示
登录成功后,单击“系统性能分析”,进入系统性能分析操作界面,仔细阅读免责声明后,勾选阅读并同意声明内容,即可进行下一步操作,如下图所示:
2、创建工程
根据提示,单击工程管理旁边“+”按钮创建工程,输入工程名称,如test,勾选节点,当前为此云服务器节点,单击“确认”创建工程,如下图所示:
3、创建任务
将光标放到创建好的工程“test”上,会出现按钮,单击“+”新建任务,如下图所示:
弹出如下界面,填写如下:
4、查看分析结果
执行完毕后,显示热点函数分析的结果,如下图所示。在“总览”显示采集运行时长、程序运行的时钟周期数和指令数。在下面的Top 10 热点函数中,multiply程序中的multiply函数占用了40左右的时钟周期数。
点击“函数”页签进入下图,可以看到所有函数的信息,包括执行时间,时钟周期,指令数等。
点击 “multiply” 进入函数模块,可以看到对应的源代码以及汇编代码,如下图。在“代码流”模块,显示不同Basic Block时钟周期的占比,颜色越深,占比越高。例如下图,单击Basic Block2,上方“汇编代码”和“源代码”浅蓝色突出显示占用时钟周期数高的代码行。
5、NEON指令优化代码
考虑到矩阵乘法可以拆分并行计算,且并行计算分支相对独立,可以使用鲲鹏的NEON指令来提升执行效率。NEON指令通过将对单个数据的操作扩展为对寄存器,也即同一类型元素矢量的操作,从而大大减少了操作次数,以此来提升执行效率。
步骤1 编译程序
再次进入“IDE远程终端”工具,执行如下代码,进入multiply文件夹,编译multiply_simd.c并赋予执行文件所有用户只读、只写、可执行权限。
cd /opt/devkitdemo/Hyper_tuner/testdemo/multiply && gcc -g multiply_simd.c -o multiply_simd && chmod -R 777 /opt/devkitdemo/Hyper_tuner/testdemo/multiply /multiply_simd
6、C/C++代码性能优化后执行效果
创建任务
7、查看采集分析结果
执行完毕后,显示热点函数分析的结果。对比multiply程序和multiply_simd程序的热点函数分析结果,如下图所示。在“总览”页签下,对比两者的指令数,可以发现优化后的multiply_simd程序指令数大幅减少。
下图为multiply程序热点函数分析结果:
点击进入函数“multiply_neon”,查看占有时钟周期数最长的Basic Block和相对应的源代码和汇编代码行,比较multiply和multiply_simd中占有时钟周期最大的代码行对应的“数量(占比)”数值。
例如如下图所示:比较multiply程序C/C++性能分析结果的源代码60行,和multiply_simd程序分析结果的源代码74行,其数量(占比)有明显减少,说明优化有效。
下图为multiply程序热点函数分析结果:
下图为multiply_simd程序热点函数分析结果:
到这,整个实验流程就结束了,此实验进行矩阵乘法计算,首先测试用普通for loop方式进行一维矩阵乘法计算的性能,然后考虑到矩阵乘法可以拆分并行计算,且并行计算分支相对独立,于是使用鲲鹏的NEON指令来进行计算,检测优化后的执行效率。
同时同学们还可以去体验我们性能调优工具的沙箱实验https://www.hikunpeng.com/zh/learn/experiments/detail/T221121003,完成性能调优实践的微认证课程及考试https://www.hikunpeng.com/learn/micro-certification/detail/1e8991b4b0d348cb8e01b581d2170796,更进一步的了解和掌握Devkit性能分析工具的使用,学习到更多的新知识,祝大家学习顺利,收获满满!
欢迎大家在社区中发帖,讲一讲自己使用DevKit性能分析工具的过程与心得,给我们后来的小伙伴们提供一些指导与帮助。
【温馨提醒】
完成体验过程的小伙伴可以回到云开发服务资源申请页面,点击释放资源,将服务器资源留给后续的同学进行体验。在申请时间内没有完成体验的同学可以点击续约按钮延长服务器资源的使用时间。