• 【信创】 JED on 鲲鹏(ARM) 调优步骤与成果 | 京东云技术团队


    项目背景

    基于国家对信创项目的大力推进,为了自主可控的技术发展,基础组件将逐步由国产组件替代,因此从数据库入手,将弹性库JED部署在 国产华为鲲鹏机器上(基于ARM架构)进行调优,与Intel (X86)进行性能对比。

    物理机配置

    处理器厂商架构设计CPU型号CPU睿频内存频率操作系统
    华为ARMkunpeng920-7262C128C3200 MT/s欧拉
    IntelX86platium-8338C-3rd128C开启3200 MT/scentos 8
    IntelX86platium-8338C-3rd128C开启3200 MT/scentos 8

    数据库配置

    部署机房廊坊
    部署方式容器
    网关配置16C/12G 磁盘:/export:30G
    数据库架构1个集群,一主一从
    数据库配置8C/24G 磁盘:/export:512G

    调优成果

    调优前:背景压力50%时,JED on 鲲鹏 读性能是 Intel 的 58%,写性能为68%

    调优后: JED on 鲲鹏读性能至 Intel的99%,写性能至 Intel 的 121%,读写混合7:3时达到113% ,TP99和响应时间表现较优,数据库CPU使用率此时均达100%,调优过程中的主要场景与性能数据记录如下:

    具体调优流程

    1、BIOS优化

    需要机房修改,并重启宿主机

    预期:CPU prefetching 对数据库性能有影响,需要关闭; Power Policy 开箱即为Performance;Smmu可不关闭

    2、宿主机pagesize改大页 4K改为64K

    原配置:

    页表大小对数据库性能有影响,请确认 x86 和鲲鹏的宿主机系统的页表大小是否一致 更改宿主机操作系统的页表大小需要重新编译内核,不同 OS 上操作有差异,可与运维团队 联系更改

    rpm -ivh http://storage.jd.local/k8s-node/kernel/5.10-jd_614-arm64/kernel-5.10.0-1.64kb.oe.jd_614.aarch64.rpm --force
    
    
    • 1
    • 2

    3、宿主机OS内优化

    3.1 关闭防火墙

    线上机器已关闭,无需修改

    systemctl status firewalld.service 
    systemctl stop firewalld.service 
    systemctl disable firewalld.service
    systemctl status firewalld.service 
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    3.2 网络内核参数优化(宿主机重启后会失效)

    读写性能未看到明显提升 不改动

    echo 1024 >/proc/sys/net/core/somaxconn
    echo 16777216 >/proc/sys/net/core/rmem_max
    echo 16777216 >/proc/sys/net/core/wmem_max
    echo "4096 87380 16777216" >/proc/sys/net/ipv4/tcp_rmem 
    echo "4096 65536 16777216" >/proc/sys/net/ipv4/tcp_wmem 
    echo 360000 >/proc/sys/net/ipv4/tcp_max_syn_backlog
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    3.3 IO参数优化

    性能未见提升 不改动

    echo deadline > /sys/block/nvme0n1/queue/scheduler;
    echo deadline > /sys/block/nvme1n1/queue/scheduler;
    echo deadline > /sys/block/nvme2n1/queue/scheduler;
    echo deadline > /sys/block/nvme3n1/queue/scheduler;
    echo deadline > /sys/block/sda/queue/scheduler;
    echo 2048 > /sys/block/nvme0n1/queue/nr_requests;
    echo 2048 > /sys/block/nvme1n1/queue/nr_requests;
    echo 2048 > /sys/block/nvme2n1/queue/nr_requests;
    echo 2048 > /sys/block/nvme3n1/queue/nr_requests;
    echo 2048 > /sys/block/sda/queue/nr_requests
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    3.4 缓存参数优化

    性能未见提升 不改动

    echo 5 >/proc/sys/vm/dirty_ratio; 
    echo 1 > /proc/sys/vm/swappiness
    
    
    • 1
    • 2
    • 3
    3.5 网卡中断绑核

    整体方案不落地,但ethxx网卡队列数可修改

    ethtool -l ethxxx 查看ethxxx网卡队列数

    ethtool -L ethxxx combined 8 ethxxx 网卡队列数需要设成8,和x86一致,修改后性能有提升 (所有流量都是从eth 网卡进去的)。

    systemctl stop irqbalance
    systemctl disable irqbalance
    
    ethtool -L eth0 combined 1 #将网卡eth0的队列配置为 combined 模式,将所有队列合并为一个。 
    #eth0 修改为实际使用的网卡设备名 这项参数对性能有影响
    
    # 查看网卡队列信息
    ethtool -l ethxxx
    
    netdevice=eth0
    cores=31
    #查看网卡所属的 NUMANODE
    cat /sys/class/net/${netdevice}/device/numa_node
    #查看网卡中断号
    cat /proc/interrupts | grep $(ethtool -i $netdevice | grep -i bus-info | awk -F ': ' '{print $2}') | awk -F ':' '{print $1}'
    # 网卡中断绑核
    for i in `cat /proc/interrupts | grep $(ethtool -i $netdevice | grep -i bus-info | awk -F ': ' '{print $2}')| awk -F ':' '{print $1}'`;do echo ${cores} > /proc/irq/$i/smp_affinity_list;done
    netdevice=eth0
    # 查看绑核后的结果
    for i in `cat /proc/interrupts | grep $(ethtool -i $netdevice | grep -i bus-info | awk -F ': ' '{print $2}')| awk -F ':' '{print $1}'`;do cat /proc/irq/$i/smp_affinity_list;done
    
    netdevice=eth1
    cores=31
    # 网卡中断绑核
    for i in `cat /proc/interrupts | grep $(ethtool -i $netdevice | grep -i bus-info | awk -F ': ' '{print $2}')| awk -F ':' '{print $1}'`;do echo ${cores} > /proc/irq/$i/smp_affinity_list;done
    
    # 查看绑核后的结果
    for i in `cat /proc/interrupts | grep $(ethtool -i $netdevice | grep -i bus-info | awk -F ': ' '{print $2}')| awk -F ':' '{print $1}'`;do cat /proc/irq/$i/smp_affinity_list;done
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    4、业务容器绑NUMA (升级调度器并部署混部agent)

    平台部署前,如果需要测试,可自行修改容器的cgroup配置进行绑核,将CPU与内存与背景压力所在的NUMA隔离。

    举例操作如下

    # 进入业务容器cgroup配置地址
    cd /sys/fs/cgroup/cpuset/kubepods/burstable/poded***********/7b40a68a************
    # 停docker,如果重启会重置cgroup配置
    systemctl stop docker
    # 压测过程中注意观察配置文件是否生效,如果docker服务会不停重启,可写个小脚本一直停服务或者覆盖写cgroup配置
    echo 16-23 > cpu.set
    echo 0 > mem.set
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    5、mysql-crc32 软编改成硬编 针对ARM

    数据库侧编译,可统一部署

    cd /mysql-5.7.26
    git apply crc32-mysql5.7.26.patch
    
    
    • 1
    • 2
    • 3

    6、mysqld反馈编译优化

    数据库侧编译,可统一部署

    需要确认使用openEuler gcc 10.3.1

    https://gitee.com/openeuler/A-FOT/wikis/README

    环境准备(在测试环境和编译环境执行)

    git clone https://gitee.com/openeuler/A-FOT.git
    yum install -y A-FOT (仅支持 openEuler 22.03 LTS) 
    yum -y install perf
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    修改配置文件 a-fot.ini(在测试环境和编译环境执行)

    cd /A-FOT
    vim ./a-fot.ini # 修改内容如下
    # 文件和目录请使用绝对路径
    # 优化模式(AutoFDO、AutoPrefetch、AutoBOLT、Auto_kernel_PGO)(选择 AutoBolt) opt_mode=AutoBOLT
    # 脚本工作目录(用来编译应用程序/存放 profile、日志,中间过程文件可能会很大,确保有 150G 的空 间)
    work_path=/pgo-opt
    # 应用运行脚本路径(空文件占位即可,使用 chmod 777 /root/run.sh 赋予可执行权限) run_script=/root/run.sh
    # GCC 路径(bin、lib 的父目录,修改成所要使用的 gcc 的目录)
    gcc_path=/usr
    # AutoFDO、AutoPrefetch、AutoBOLT
    # 针对应用的三种优化模式,请填写此部分配置
    # 应用进程名
    application_name=mysqld
    # 二进制安装后可执行文件
    bin_file=/usr/local/mysql-pgo/bin/mysqld
    # 应用构建脚本路径(文件内填写源码编译 mysql 的相关命令,   赋予可执行权限)
    chmod 777 /root/ build.sh
    build_script=/root/build.sh
    # 最大二进制启动时间(单位:秒)
    max_waiting_time=700
    # Perf 采样时长(单位:秒)(设置采样时间为 10min)
    perf_time=600
    # 检测是否优化成功(1=启用,0=禁用) check_success=1
    # 构建模式 (Bear、Wrapper) build_mode=Wrapper
    # auto_kernel_PGO
    # 针对内核的优化模式,请填写此部分配置
    # 内核 PGO 模式(arc=只启用 arc profile,all=启用完整的 PGO 优化) pgo_mode=all
    # 执行阶段(1=编译插桩内核阶段,2=编译优化内核阶段) pgo_phase=1
    # 内核源码目录(不指定则自动下载) kernel_src=/opt/kernel
    # 内核构建的本地名(将根据阶段添加"-pgoing"或"-pgoed"后缀) kernel_name=kernel
    # 内核编译选项(请确保选项修改正确合法,不会造成内核编译失败) #CONFIG_...=y
    # 重启前的时间目录(用于将同一套流程的日志存放在一起)
    last_time=
    # 内核源码的 Makefile 地址(用于不自动编译内核的场景) makefile=
    # 内核配置文件路径(用于不自动编译内核的场景) kernel_config=
    # 内核生成的原始 profile 目录(用于不自动编译内核的场景) data_dir=
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    /root/build.sh (参考内容如下)

    cd /mysql-8.0.25 rm -rf build mkdir build
    cd build
    cmake .. -DBUILD_CONFIG=mysql_release -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-pgo -
    DMYSQL_DATADIR=/data/mysql/data -DWITH_BOOST=/mysql-8.0.25/boost/boost_1_73_0 make -j 96
    make -j 96 install
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    反馈编译

    1. 第一次编译

    可以跳过,直接把 A-FOT 放在有可执行的 mysql 进程 docker 即可

    2. 数据采集 (在测试环境执行)

    按照如下方式修改/A-FOT/a-fot 文件:对 409,以及 414-416 的函数进行注释

    启动mysqld进程,同时压力端开始对mysql发压力,使得mysqld开始处理业务

    执行 ./a-fot 屏幕出现如下回显

    成功后可以在对应的/pgo-opt 目录下观察到 profile.gcov 文件

    打开后为如下内容

    3. 手动合入 Profile 进行编译

    cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.7.26-pgo/ -
    DMYSQL_DATADIR=/data/mysql/data -DSYSCONFDIR=/usr/local/mysql-5.7.26- pgo/etc -DWITH_INNOBASE_STORAGE_ENGINE=1 - DWITH_PERFSCHEMA_STORAGE_ENGINE=1 - DWITH_BLACKH0LE_ST0RAGE_ENGINE=1 -DDEFAULT_CHARSET=utf8 - DDEFAULT_COLLATION=utf8_general_ci - DMYSQL_UNIX_ADDR=/data/mysql/tmp/mysql.sock -DENABLED_LOCAL_INFILE=ON -DENABLED_PROFILING=ON - DWITH_DEBUG=0 -DMYSQL_TCP_PORT=3358 - DCMAKE_EXE_LINKER_FLAGS="-ljemalloc" -Wno-dev -DWITH_BOOST=/mysql-5.7.26/boost/boost_1_59_0 -Wno-dev -DCMAKE_CXX_FLAGS="-fbolt-use=Wl,-q" -DCMAKE_CXX_LINK_FLAGS="-Wl,-q"
    
    PATH_OF_PROFILE 改成 profile 所在的原始路径
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    7、go的版本升级以及反馈编译

    数据库相关代理使用go的才需要操作

    7.1 升级golang到1.21
    7.2 Go PGO优化

    1.import pprof 程序的代码中添加 import _ “net/http/pprof”

    2.启动程序,进行压力测试

    1. 压力启动后,执行下面操作,收集 profiling 文件,second 是采集时间,单位是 s curl -o cpu.pprof http://localhost:8080/debug/pprof/profile?seconds=304、根据生成的 cpu.pprof 重新编译二进制 mv cpu.pprof default.pgo 重新编译程序启用 –pgo 选项 go build –pgo=auto

    关于性能的提升情况,Golang官方给出的数据是:

    在Go1.21中,一组具有代表性的Go程序的基准测试表明,使用PGO构建可以提高大约2-7%的性能。

    作者:京东零售 朱晨

    来源:京东云开发者社区 转载请注明来源

  • 相关阅读:
    win10 通过wmic命令行设置系统环境变量
    焱融科技为国家重点实验室打造海量高性能存储
    “蔚来杯“2022牛客暑期多校训练营9 E题: Longest Increasing Subsequence
    Typescript基础
    2022ICPC 网络赛第二场 B Non-decreasing Array(区间dp)
    打码平台之图鉴的使用步骤
    子组件自定义事件$emit实现新页面弹窗关闭之后父界面刷新
    什么是IPv6?与IPv4相比,IPv6具备哪些技术优点?
    echarts——实现3D地图+3D柱状图 效果——粗糙代码记录——技能提升
    数据宝非营运货车保险风险评估产品成功入围泰康保险采购库!
  • 原文地址:https://blog.csdn.net/JDDTechTalk/article/details/133787079