基于国家对信创项目的大力推进,为了自主可控的技术发展,基础组件将逐步由国产组件替代,因此从数据库入手,将弹性库JED部署在 国产华为鲲鹏机器上(基于ARM架构)进行调优,与Intel (X86)进行性能对比。
处理器厂商 | 架构设计 | CPU型号 | CPU | 睿频 | 内存频率 | 操作系统 |
---|---|---|---|---|---|---|
华为 | ARM | kunpeng920-7262C | 128C | 无 | 3200 MT/s | 欧拉 |
Intel | X86 | platium-8338C-3rd | 128C | 开启 | 3200 MT/s | centos 8 |
Intel | X86 | platium-8338C-3rd | 128C | 开启 | 3200 MT/s | centos 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%,调优过程中的主要场景与性能数据记录如下:
需要机房修改,并重启宿主机
预期:CPU prefetching 对数据库性能有影响,需要关闭; Power Policy 开箱即为Performance;Smmu可不关闭
原配置:
页表大小对数据库性能有影响,请确认 x86 和鲲鹏的宿主机系统的页表大小是否一致 更改宿主机操作系统的页表大小需要重新编译内核,不同 OS 上操作有差异,可与运维团队 联系更改
1 | 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 4 | systemctl status firewalld.service systemctl stop firewalld.service systemctl disable firewalld.service systemctl status firewalld.service |
读写性能未看到明显提升 不改动
1 2 3 4 5 6 | 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 10 | 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 | echo 5 > / proc / sys / vm / dirty_ratio; echo 1 > / proc / sys / vm / swappiness |
整体方案不落地,但ethxx网卡队列数可修改
ethtool -l ethxxx 查看ethxxx网卡队列数
ethtool -L ethxxx combined 8 ethxxx 网卡队列数需要设成8,和x86一致,修改后性能有提升 (所有流量都是从eth 网卡进去的)。
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 | 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 |
平台部署前,如果需要测试,可自行修改容器的cgroup配置进行绑核,将CPU与内存与背景压力所在的NUMA隔离。
举例操作如下
1 2 3 4 5 6 7 | # 进入业务容器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 | cd / mysql - 5.7 . 26 git apply crc32 - mysql5. 7.26 .patch |
数据库侧编译,可统一部署
需要确认使用openEuler gcc 10.3.1
https://gitee.com/openeuler/A-FOT/wikis/README
环境准备(在测试环境和编译环境执行)
1 2 3 | git clone https: / / gitee.com / openeuler / A - FOT.git yum install - y A - FOT (仅支持 openEuler 22.03 LTS) yum - y install perf |
修改配置文件 a-fot.ini(在测试环境和编译环境执行)
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 | 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= |
/root/build.sh (参考内容如下)
1 2 3 4 5 | 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. 第一次编译
可以跳过,直接把 A-FOT 放在有可执行的 mysql 进程 docker 即可
2. 数据采集 (在测试环境执行)
按照如下方式修改/A-FOT/a-fot 文件:对 409,以及 414-416 的函数进行注释
启动mysqld进程,同时压力端开始对mysql发压力,使得mysqld开始处理业务
执行 ./a-fot 屏幕出现如下回显
成功后可以在对应的/pgo-opt 目录下观察到 profile.gcov 文件
打开后为如下内容
3. 手动合入 Profile 进行编译
1 2 3 4 | 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 所在的原始路径 |
数据库相关代理使用go的才需要操作
1.import pprof 程序的代码中添加 import _ "net/http/pprof"
2.启动程序,进行压力测试
关于性能的提升情况,Golang官方给出的数据是:
在Go1.21中,一组具有代表性的Go程序的基准测试表明,使用PGO构建可以提高大约2-7%的性能。
作者:京东零售 朱晨
来源:京东云开发者社区 转载请注明来源