鲲鹏社区首页
中文
注册
开发者
鲲鹏性能调优实践——XXX估值系统

鲲鹏性能调优实践——XXX估值系统

案例分享DevKit性能调优

发表于 2025/12/05

0

作者 | 李金东

1、介绍

XXX估值系统采用java应用和数据库,原本在一台A环境上运行的时间在79分钟,客户诉求是能优化到63分钟内。

本文将展示通过绑核、优化编译参数、调整内存频率、热点分析和分离部署等调优手段,优化系统运行时间的案例。

2、环境信息

服务器架构CPUkernel
鲲鹏服务器Arm架构Kunpeng 920 72xxZ处理器4.19.90-89.11.v2401.ky10.aarch64

3、调优实践

3.1 应用和数据库同一环境调优

  • 都运行在A服务器环境

3.1.1绑核

因为该环境开了超线程,应用和数据库的线程都跑在0-255核上,而且并发较大,cpu切换频率也会相应增加,而numa关闭之后,node之间的读取内存数据的物理距离依然存在,所以增加应用和数据库启动的绑核操作,能让线程减少cpu切换和内存读取效率,减少跨numa的node的问题。执行命令:

numactl -c 0-127 ./application, numactl -c 128-255 ./dmserver start 

绑核后,总体时间优化到68分钟。

3.1.2 编译参数

因为达梦数据库底层语言是C,考虑通过mtune=tsv和-march=armv8-a等鲲鹏亲和参数对达梦数据库进行优化,需要使用gcc9.1.0以上的编译器进行编译,因为当前使用的内核是4.19.90-89.11.v2401.ky10.aarch64,和数据库侧已沟通,在4.19.90-89.11.v2401.ky10.aarch64内核版本上便携gcc10.3.1,同时使用gcc10.3.1对数据库进行编译,增加mtune=tsv-march=armv8-a亲和参数。

说明:
C/C++代码在编译时,GCC编译器将源码翻译成CPU可识别的指令序列,写入可执行程序的二进制文件中。CPU在执行指令时,通常采用流水线的方式并行执行指令,以提高性能,因此指令执行顺序的编排将对流水线执行效率有很大影响。通常在指令流水线中要考虑:执行指令计算的硬件资源数量、不同指令的执行周期、指令间的数据依赖等等因素。我们可以通过通知编译器,程序所运行的目标平台(CPU)指令集、流水线,来获取更好的指令序列编排。在GCC 9.1.0版本,支持了鲲鹏处理器所兼容的ARMv8指令集、tsv110流水线。

3.1.3 磁盘

对磁盘的配置进行查看,属于nvme磁盘,调度策略为none,符合nvme盘的使用。

说明:
因为固态硬盘支持随机读写,所以固态硬盘支持最简单的调度策略,性能最好。

3.1.4 数据库热点采集与分析

1. Devkit热点采集工具:

使用Devkit的hotspot、topdown,鲲鹏系统性能方法论分析工具以及block sample工具对数据库进行采集。

说明:
1. hotspot工具:分析C/C++程序代码, 找出性能瓶颈点,获得对应的热点函数,支持通过火焰图展示函数的调用关系,给出优化路径。详见:https://www.hikunpeng.com/document/detail/zh/kunpengdevps/userguide/cliuserguide/KunpengDevKitCli_0065.html

2. topdown工具:基于ARM PMU(Performance Monitor Unit)事件,获得指令在CPU流水线上的运行情况,可以帮助用户快速定位当前应用在CPU上的性能瓶颈,用户可以有针对性地修改自己的程序,以充分利用当前的硬件资源。详见: https://www.hikunpeng.com/document/detail/zh/kunpengdevps/userguide/cliuserguide/KunpengDevKitCli_0033.html

3. 鲲鹏系统性能方法论分析工具:鲲鹏系统性能方法论分析工具支持一键采集多维度性能数据,包括Miss、访存统计、NUMA、微架构、Miss Latency、热点函数、CPU usage、NIC bandwidth、I/O、Memory usage、Softirq、PCIe、PA2Ring、Ring2PA数据,支持指令类别分析。采集的数据按照时间线对齐,从业务层到芯片层图形化展示资源使用情况。详见:https://www.hikunpeng.com/document/detail/zh/kunpengdevps/userguide/cliuserguide/KunpengDevKitCli_0167.html

4. blockedSample工具:可对进程调用栈offcpu和oncpu进行分析,得出offcpu调用栈和oncpu调用栈,根据调用栈优化性能瓶颈。详见:https://gitee.com/openeuler/libkperf/blob/master/docs/Details_Usage.md

2. perf性能分析工具

使用perf对数据库热点进行采集,通过perf report命令查看热点。采集命令如下:

perf record -e cycles -g -p {pid}

最终发现热点集中在insert和nupd2_xxx操作上。

结论:由于开了超线程,实际java应用和数据库使用的是不同逻辑核,但是是同一物理核,考虑将应用和数据库在不同环境进行部署

3.2 应用与数据库分开部署

  • 应用在B环境运行, 数据库在A环境运行

3.2.1 java热点采集与分析

通过Devkit的java性能分析工具java-perf对java应用侧采集火焰图。

由于使用的jdk是bisheng jdk,所以需要对JAVA_HOME和CLASSPATH重新设置:

export JAVA_HOME=/opt/XXXX/bisheng-jdk1.8.0_412
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

发现在核算和统计环节,涉及大量的内存操作热点:在核算环节中,某一热点函数getXXX的占比超过93%;在统计分析环节中,一个热点函数getYYY的占比在97%以上。已和应用侧反应该问题,但目前已和入新代码,应用侧在老应用上做更改较难。

说明:
Devkit java-perf工具:Devkit cli命令行工具的一部分,可通过其中java-perf进行java进程的热点采集。使用命令:./devkit hotspot -p {pid}
详见:https://www.hikunpeng.com/document/detail/zh/kunpengdevps/userguide/cliuserguide/KunpengDevKitCli_0069.html

3.2.2 鲲鹏硬件检查

对两个环境通过Devkit的鲲鹏硬件检查工具kspect对硬件进行检测,发现:

1)B环境内存条配置为32G*32,ddr4,最大频率3200 MT/s, 内存当前频率2666 MT/s(内存条的插法存在降频现象)

2)A环境64G*16,ddr5,最大频率5600 MT/s, , 当前频率4800 MT/s,考虑到热点集中在内存操作,内存频率应有较大影响,需要调整内存频率。

说明:
Devkit 鲲鹏硬件检查工具:轻量准确的鲲鹏健康检测工具,可快速收集服务器硬件的各类信息,包括CPU、内存、网络、存储、PCIe、虚拟机、传感器、软件和模块依赖等;并给出一定的调优建议。该工具支持在物理机、虚拟机和容器上使用。执行命令:./kspect all
详见:https://www.hikunpeng.com/document/detail/zh/kunpengdevps/userguide/cliuserguide/KunpengDevKitCli_0153.html

3.2.3 网络延时

因为两者部署在不同服务器上,存在网络传输成本,在同一个环境上网络延迟较低,而A环境 ping B环境网络延迟较高,导致性能劣化。

结论:该种部署方式下,最终运行时长变成84分钟,遂考虑java和应用分开在不同环境部署的方式。

3.3 java和应用分开部署

  • java和应用分开部署,都在A服务器运行

关闭Numa,关闭数据库超线程,应用服务器开启超线程,应用和数据库都绑核运行,最终总体时间最优可达63分钟。

结论:该种部署方式下可以达到最优性能效果

4、优化结果

测试用例未调优前调优后性能提升
1年数据79min63min20.2%


本页内容