开发者
资源
【鲲鹏训练营】鲲鹏常用性能调优手段:系统调优实操分享
【鲲鹏训练营】鲲鹏常用性能调优手段:系统调优实操分享
发表于2025/05/09
1050

一、系统及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安全策略

收藏举报
Level 1
0
帖子
0
粉丝
0
获赞