达梦数据库性能调优
发表于 2025/10/22
0
作者 | 朱勇
1、项目背景
某项目使用Sysbench测试达梦数据库性能测试未达到预期,测试场景分为只读和只写,其中读场景落后较多。本文档提供BIOS参数优化、热点函数优化以及加速库优化三种调优方式,提升其在鲲鹏服务器上的性能。
2、环境要求
硬件、操作系统和软件要求
| 服务器 | CPU | 内存 | 操作系统 | 软件 |
|---|---|---|---|---|
| TaiShan 200服务器(型号2280) | 鲲鹏920 7260处理器*2 | 32G*8 | Linx(凝思) | Sysbench-1.0、DM8 |
3、测试指导
为了避免网络差异,测试采用单机测试,即压测端和被测端均运行在同一台机器上。
当数据库服务无法启动或初次运行时,执行以下步骤。
cd /home/dmdba/dm/dmdbms_kp/bin
rm -rf /DMFCSAN/test_data/*
./dminit path=/DMFCSAN/test_data page_size=32 log_size=2048
chown -R dmdba.dinstall /DMFCSAN/test_data
./DmService start
2、数据库启动后,测试只读场景。
cd /opt/sysbench-master-dpi/src/lua
echo 3 > /proc/sys/vm/drop_caches
./sysbench --db-driver=dm --dm-db=localhost:15236 --dm-user=SYSDBA --dm-password=SYSDBA --table_size=25000 --tables=250 --events=0 --time=600 --threads=2048 --percentile=95 --range-selects=0 oltp_read_only cleanup
./sysbench --db-driver=dm --dm-db=127.0.0.1:15236 --dm-user=SYSDBA --dm-password=SYSDBA --table_size=25000 --tables=250 --events=0 --time=600 --auto-inc=0 --threads=64 oltp_read_only prepare
./sysbench --db-driver=dm --dm-db=127.0.0.1:15236 --dm-user=SYSDBA --dm-password=SYSDBA --table_size=25000 --tables=250 --events=0 --time=600 --percentile=95 --range-selects=0 --skip-trx=1 --report-interval=1 --thread_init-timeout=180 --threads=1000 oltp_read_only run
3、测试只写场景。
cd /opt/sysbench-master-dpi/src/lua
echo 3 > /proc/sys/vm/drop_caches
./sysbench --db-driver=dm --dm-db=localhost:15236 --dm-user=SYSDBA --dm-password=SYSDBA --table_size=25000 --tables=250 --events=0 --time=600 --threads=256 --percentile=95 oltp_write_only cleanup
./sysbench --db-driver=dm --dm-db=127.0.0.1:15236 --dm-user=SYSDBA --dm-password=SYSDBA --table_size=25000 --tables=250 --events=0 --time=600 --auto-inc=0 --threads=64 oltp_write_only prepare
./sysbench --db-driver=dm --dm-db=localhost:15236 --dm-user=SYSDBA --dm-password=SYSDBA --table_size=25000 --tables=250 --events=0 --time=600 --threads=100 --percentile=95 --report-interval=1 oltp_write_only run
4、调优实践
4.1、初始数据
测试工具
本次测试采用Sysbench工具,配置只读、只写场景,运行过程中使用nmon工具对服务器的I/O进行监控,分别获取插入数据时的写入大小、查询数据时的读出大小。
数据库版本
本次测试使用的数据库版本、数据库参数都是一致。
两个服务端的数据库版本为:DM Database 64 V8 05134283914-20220909-169171-20009。
4.2、调优措施
BIOS参数优化
关闭SMMU。
BIOS路径为“Advanced > MISC Config”,将“Support Smmu”设置为“Disable”。SMMU为虚拟化特性支持,虚拟化场景下开启,非虚拟化场景下关闭可以获取更好的性能。关闭CPU预取。
BIOS路径为“Advanced > MISC Config”,将“CPU Prefetching Configuration”设置为“Disabled”。对于数据比较集中的场景,预取的命中率高,适合打开CPU预取,反之需要关闭CPU预取。目前发现speccpu和x265软件场景适合打开CPU预取,STREAM测试工具、Nginx和数据库场景需要关闭CPU预取。
电源使用性能模式。
BIOS路径为“Advanced -> Performance Config” ,将“Power Policy”设置为“Performance”。有性能模式和节能模式两个选项,节能模式会降低CPU运行功耗,导致CPU降频,性能变差。性能模式会让CPU在高性能模式下工作,提升性能。
BIOS参数优化后读场景测试数据QPS为1133074.43/s。
写场景测试数据TPS为36169.13/s。

热点函数优化
1、使用perf top命令观察热点函数,发现三个锁相关函数os_interlock_inc、os_interlock_dec和os_interlock_read64占比较高。

2、进一步通过查看汇编指令,可以观察到函数主要运行在如下几个汇编。

3、通过类似案例发现,案例中涉及的汇编指令完全一样,查看到使用的凝思系统GCC的版本为6.3.0, 增加编译参数“-march=armv8-a+lse”并重新编译数据库,缓解锁瓶颈。
同步方法到达梦侧后,添加编译参数“-march=armv8-a+lse”,重新编译出版本后进行测试,锁瓶颈消除,读写场景性能均有较大提升。
读场景测试数据QPS为1905800.70/s。

写场景测试数据TPS为42692.95/s。

加速库优化
使用perf top命令观察热点函数,在写场景下包含memcpy热点函数时,可使用以下步骤使能加速库提升写场景性能。
1、获取加速库源码。
git clone https://github.com/ARM-software/optimized-routines.git
2、添加脚本内容。
进入目录。
cd optimized-routines/
cd string
创建脚本文件。
vi t.sh
添加脚本内容,脚本内容如下。添加脚本内容并执行,会导致make出现错误,可忽略。
for m in memcmp memcpy ; do
for f in $(grep __${m}_aarch64 * -r|awk -F ':' '{print $1}') ; do
sed_str1="__${m}_aarch64"
sed_str2="${m}"
sed -i "s!${sed_str1}!${sed_str2}!g" $f
done
done
按“Esc”键,输入:wq!后,按“Enter”键保存退出。
3、执行脚本。
sh t.sh
4、编译。
cd ../
make ARCH=aarch64 -j 8
5、添加环境变量。
export LD_PRELOAD=build/lib/libstringlib.so
或者在启动数据库时添加“LD_PRELOAD=build/lib/libstringlib.so”。
6、验证。
启动应用后通过perf top观察热点函数memcpy是否来源于libstringlib.so判断是否生效,或者使用“ldd 二进制文件”查看。
加速库使能后写场景TPS提升到45475.74/s。



