一、系统及cpu信息
OS :openEuler-22.03-LTS
下载地址:https://mirror.nyist.edu.cn/openeuler/openEuler-22.03-LTS/ISO/aarch64/openEuler-22.03-LTS-aarch64-dvd.iso
cpu: Kunpeng 920
二、关闭防火墙及SELinux(临时)
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
三、安装Devkit
cd /home
wget https://kunpeng-repo.obs.cn-north-4.myhuaweicloud.com/Kunpeng DevKit/Kunpeng DevKit 25.0.0/DevKit-All-25.0.0-Linux-Kunpeng.tar.gz
yum install tar -y
tar -zvxf DevKit-All-25.0.0-Linux-Kunpeng.tar.gz
cd DevKit-All-25.0.0-Linux-Kunpeng
./install.sh

回车

回车

输入y,回车

回车

回车

安装成功
四、登录Devkit WebUI界面并设置密码
打开浏览器输入 https://服务器ip:8086

点击“高级 ”

点击“ 继续前往 ”

首次登录输入新密码勾选同意使用说明即可进入主页面

五、Python 拼接字符串的性能调优实践
1.创建concatenate.py
cd /home
vi concatenate.py
按“i”,输入以下内容:
import sys
BASE_STRING = "Hello world"
LOOP_TIMES = 100000000
STRING_LIST = [BASE_STRING] * LOOP_TIMES
def string_plus():
new_string = ''
for string in STRING_LIST:
new_string += string
print(len(new_string))
def string_join():
new_string = ''.join(STRING_LIST)
print(len(new_string))
def main():
function_map = {
'string_plus': string_plus,
'string_join': string_join,
}
print(sys.argv)
_, function = sys.argv
if function in function_map:
function_map[function]()
else:
print('function {} not exist'.format(function))
if __name__ == "__main__":
main()
按Ese ,输入“:wq!”保存退出
2.执行
python3 concatenate_string.py string_plus

3.进行全景分析
a.点击 “调优” 选项,选择 “通用分析”

b.选择全景分析,全选采样类型,采样时间20s,第一次需添加管理节点

c.点击添加节点,勾选须知,输入服务器IP及root用户密码,点击确定--继续添加,即可显示安装成功


d.安装成功后,点击左上角的DevKit Tools 即可返回全景分析界面

e.点击确定,开始分析,当进度条开始动时,服务器执行 python3 concatenate_string.py string_plus

f.查看采样结果---->系统性能,可以看到绿线占比较高,即%user较高

g.查看采样结果----->任务调度,可见python3排名靠前

4.进行进程线程分析
a.新建通用分析任务,选择进程/线程分析,全选采样类型,采样时间20s

b.点击确定,开始分析,当进度条开始动时,服务器执行 python3 concatenate_string.py string_plus,查看分析结果,可以看到python3的占用率比较高

5.热点函数分析
a.新建任务,勾选热点函数分析

b.分析对象选择应用,打开应用运行用户,输入root及密码,应用路径选择配置好路径,由 which python3得到其路径,应用参数填写 concatenate_string.py文件的位置,这边是在/home目录下,所以加运行参数即 /home/concatenate_string.py string_plus



c.查看分析结果

查看TOP 30热点调用栈,发现realloc调用系统so库,CPU占用率比较高
d.优化
调整参数由plus改为join,再次进行热点函数分析

e.查看结果,python对join参数有优化,realloc调用消失,耗时减少


六、CPU分支预测预测优化
1.下载命令行DevKit工具
cd /home
wget https://kunpeng-repo.obs.cn-north-4.myhuaweicloud.com/Kunpeng DevKit/Kunpeng DevKit 25.0.0/DevKit-CLI-25.0.0-Linux-Kunpeng.tar.gz
tar -zvxf DevKit-CLI-25.0.0-Linux-Kunpeng.tar.gz
cd DevKit-CLI-25.0.0-Linux-Kunpeng
2.创建cpu_branch_prediction_before.cpp
vi cpu_branch_prediction_before.cpp
按i 添加以下内容:
#include <algorithm>
#include <ctime>
#include <iostream>
int main()
{
const unsigned arraySize = 32768;
int data[arraySize];
for (unsigned c = 0; c < arraySize; ++c)
data[c] = std::rand() % 256;
clock_t start = clock();
long long sum = 0;
for (unsigned i = 0; i < 100000; ++i)
{
for (unsigned c = 0; c < arraySize; ++c)
{
if (data[c] >= 128)
sum += data[c];
}
}
double elapsedTime = static_cast<double>(clock() - start) / CLOCKS_PER_SEC;
std::cout << elapsedTime << std::endl;
std::cout << "sum = " << sum << std::endl;
return 0;
}
按Esc ,输入 :wq!保存退出
3.执行编译
g++ cpu_branch_prediction_before.cpp -o cpu_branch_prediction_before

4.进行命令行的微架构分析
./devkit tuner top-down -i 10 ./cpu_branch_prediction_before

由报告得知, Bad Speculation 指标偏高,其下级level 的Branch Mispredicts 占比较高,说明CPU 乱序执行的时候预测错误导致的流水线停顿,存在瓶颈。
5.性能优化
原代码中,for循环中的if判断存在大量的分支预测失败,在进行for循环前,对数据先进行排序处理,使CPU的分支预测更加准测
vi cpu_branch_prediction_before.cpp
在12行添加 std::sort(data, data + arraySize);如下图

按Esc 输入 :wq!保存退出
6.再次执行编译并进行命令行的微架构分析
g++ cpu_branch_prediction_before.cpp -o cpu_branch_prediction_after
./devkit tuner top-down -i 10 ./cpu_branch_prediction_after

Branch Mispredicts占比消除,执行时间降低。
PS: 当热点函数分析提示用户名或着密码错误时,可尝试执行setenforce 0,关闭SELinux安全策略

一、系统及cpu信息
OS :openEuler-22.03-LTS
下载地址:https://mirror.nyist.edu.cn/openeuler/openEuler-22.03-LTS/ISO/aarch64/openEuler-22.03-LTS-aarch64-dvd.iso
cpu: Kunpeng 920
二、关闭防火墙及SELinux(临时)
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
三、安装Devkit
cd /home
wget https://kunpeng-repo.obs.cn-north-4.myhuaweicloud.com/Kunpeng DevKit/Kunpeng DevKit 25.0.0/DevKit-All-25.0.0-Linux-Kunpeng.tar.gz
yum install tar -y
tar -zvxf DevKit-All-25.0.0-Linux-Kunpeng.tar.gz
cd DevKit-All-25.0.0-Linux-Kunpeng
./install.sh
回车
回车
输入y,回车
回车
回车
安装成功
四、登录Devkit WebUI界面并设置密码
打开浏览器输入 https://服务器ip:8086
点击“高级 ”
点击“ 继续前往 ”
首次登录输入新密码勾选同意使用说明即可进入主页面
五、Python 拼接字符串的性能调优实践
1.创建concatenate.py
cd /home
vi concatenate.py
按“i”,输入以下内容:
import sys
BASE_STRING = "Hello world"
LOOP_TIMES = 100000000
STRING_LIST = [BASE_STRING] * LOOP_TIMES
def string_plus():
new_string = ''
for string in STRING_LIST:
new_string += string
print(len(new_string))
def string_join():
new_string = ''.join(STRING_LIST)
print(len(new_string))
def main():
function_map = {
'string_plus': string_plus,
'string_join': string_join,
}
print(sys.argv)
_, function = sys.argv
if function in function_map:
function_map[function]()
else:
print('function {} not exist'.format(function))
if __name__ == "__main__":
main()
按Ese ,输入“:wq!”保存退出
2.执行
python3 concatenate_string.py string_plus
3.进行全景分析
a.点击 “调优” 选项,选择 “通用分析”
b.选择全景分析,全选采样类型,采样时间20s,第一次需添加管理节点
c.点击添加节点,勾选须知,输入服务器IP及root用户密码,点击确定--继续添加,即可显示安装成功
d.安装成功后,点击左上角的DevKit Tools 即可返回全景分析界面
e.点击确定,开始分析,当进度条开始动时,服务器执行 python3 concatenate_string.py string_plus
f.查看采样结果---->系统性能,可以看到绿线占比较高,即%user较高
g.查看采样结果----->任务调度,可见python3排名靠前
4.进行进程线程分析
a.新建通用分析任务,选择进程/线程分析,全选采样类型,采样时间20s
b.点击确定,开始分析,当进度条开始动时,服务器执行 python3 concatenate_string.py string_plus,查看分析结果,可以看到python3的占用率比较高
5.热点函数分析
a.新建任务,勾选热点函数分析
b.分析对象选择应用,打开应用运行用户,输入root及密码,应用路径选择配置好路径,由 which python3得到其路径,应用参数填写 concatenate_string.py文件的位置,这边是在/home目录下,所以加运行参数即 /home/concatenate_string.py string_plus
c.查看分析结果
查看TOP 30热点调用栈,发现realloc调用系统so库,CPU占用率比较高
d.优化
调整参数由plus改为join,再次进行热点函数分析
e.查看结果,python对join参数有优化,realloc调用消失,耗时减少
六、CPU分支预测预测优化
1.下载命令行DevKit工具
cd /home
wget https://kunpeng-repo.obs.cn-north-4.myhuaweicloud.com/Kunpeng DevKit/Kunpeng DevKit 25.0.0/DevKit-CLI-25.0.0-Linux-Kunpeng.tar.gz
tar -zvxf DevKit-CLI-25.0.0-Linux-Kunpeng.tar.gz
cd DevKit-CLI-25.0.0-Linux-Kunpeng
2.创建cpu_branch_prediction_before.cpp
vi cpu_branch_prediction_before.cpp
按i 添加以下内容:
#include <algorithm>
#include <ctime>
#include <iostream>
int main()
{
const unsigned arraySize = 32768;
int data[arraySize];
for (unsigned c = 0; c < arraySize; ++c)
data[c] = std::rand() % 256;
clock_t start = clock();
long long sum = 0;
for (unsigned i = 0; i < 100000; ++i)
{
for (unsigned c = 0; c < arraySize; ++c)
{
if (data[c] >= 128)
sum += data[c];
}
}
double elapsedTime = static_cast<double>(clock() - start) / CLOCKS_PER_SEC;
std::cout << elapsedTime << std::endl;
std::cout << "sum = " << sum << std::endl;
return 0;
}
按Esc ,输入 :wq!保存退出
3.执行编译
g++ cpu_branch_prediction_before.cpp -o cpu_branch_prediction_before
4.进行命令行的微架构分析
./devkit tuner top-down -i 10 ./cpu_branch_prediction_before
由报告得知, Bad Speculation 指标偏高,其下级level 的Branch Mispredicts 占比较高,说明CPU 乱序执行的时候预测错误导致的流水线停顿,存在瓶颈。
5.性能优化
原代码中,for循环中的if判断存在大量的分支预测失败,在进行for循环前,对数据先进行排序处理,使CPU的分支预测更加准测
vi cpu_branch_prediction_before.cpp
在12行添加 std::sort(data, data + arraySize);如下图
按Esc 输入 :wq!保存退出
6.再次执行编译并进行命令行的微架构分析
g++ cpu_branch_prediction_before.cpp -o cpu_branch_prediction_after
./devkit tuner top-down -i 10 ./cpu_branch_prediction_after
Branch Mispredicts占比消除,执行时间降低。
PS: 当热点函数分析提示用户名或着密码错误时,可尝试执行setenforce 0,关闭SELinux安全策略