GreatDB性能调优
发表于 2025/09/11
0
作者 | 朱勇
1 实践背景介绍
某通信项目做万里开源数据库(GreatDB)性能测试时性能值未达到预期。测试工具为Sysbench,测试场景为读写场景,性能目标值为4000 TPS,实际测试值仅有3300 TPS,需要进行调优。
环境信息
服务器型号 |
TaiShan 2280 |
CPU配置 |
鲲鹏920 5250处理器(48C*2,2.6GHz) |
内存配置 |
32G*32 |
操作系统 |
EulerOS/BClinux21.03 |
环境组网
数据库主要部署在虚拟机集群内(3节点),另有一台虚拟机作为压测机对数据库进行压测。
虚拟化平台使用FunshionCompute平台作为虚拟化底座,另有存储池作为虚拟机的存储资源,虚拟机的系统盘和数据盘都来自于存储池。
2 调优前数据
集群中三个节点都是64C128G虚拟机的测试数据:
线程数 |
QPS(/s) |
TPS(/s) |
95%响应时间(ms) |
磁盘负载 |
CPU使用率 |
16 |
23443.77 |
1172.19 |
17.01 |
99% |
10% |
32 |
41928.88 |
2096.44 |
20.74 |
99% |
20% |
64 |
52505.00 |
2625.25 |
34.95 |
99% |
25% |
128 |
60786.10 |
3039.30 |
57.87 |
99% |
30% |
256 |
63421.21 |
3171.06 |
101.13 |
99% |
33% |
512 |
57675.81 |
2883.79 |
200.47 |
99% |
35% |
集群中三个节点都是32C64G虚拟机的测试数据:
线程数 |
QPS(/s) |
TPS(/s) |
95%响应时间(ms) |
磁盘负载 |
CPU使用率 |
16 |
23387.45 |
1169.37 |
17.63 |
99% |
25%±3% |
32 |
36815.05 |
1840.75 |
25.28 |
99% |
37%±3% |
64 |
50339.42 |
2516.97 |
38.25 |
99% |
50%±3% |
128 |
59639.39 |
2981.97 |
61.08 |
99% |
60%±3% |
256 |
66055.79 |
3302.79 |
106.75 |
99% |
64%±4% |
512 |
55944.69 |
2797.23 |
227.40 |
99% |
55%±4% |
3 性能调优实践
从调优前的测试结果和部分指标来看,CPU不存在瓶颈,瓶颈主要在磁盘,但由于该测试方案是使用虚拟机进行测试的,CPU、磁盘、网络都是经过虚拟化的,因此虚拟化的损耗可能也是导致性能差的原因,另外数据库软件本身可能也有调优的可能。因此虚拟化层、存储层、数据库等层面都可能存在瓶颈,需要先缩小范围再进行进一步分析。可以采用以下方案来缩小范围:
-
直接使用物理机安装GreatDB,测试物理机的性能,用物理机性能与虚拟机性能进行比较,看看虚拟化层的性能损耗比为多少,根据经验,通过虚拟化的CPU性能损耗在5%以内,如果性能损耗超过这个值,则虚拟化层需要进行调优。
-
给虚拟机添加裸盘(磁盘直通方式)作为GreatDB数据盘进行测试,看看是否有性能提升,如果有性能提升较大,则说明磁盘层面确实存在瓶颈。
-
如果虚拟化层和存储层都没有性能瓶颈,则数据库软件应用本身可能存在瓶颈,需要进行调优。
经过讨论后,先进行第2个方案的验证,添加裸盘后验证(虚拟机规格64C),256并发情况下可以测到3952 TPS,相对虚拟磁盘的3107 TPS提升了27%,说明存储层确实存在瓶颈,同时裸盘也是一个性能优化的方案,基本达到客户要求。
使用裸盘需要专门为虚拟机设置磁盘直通,对虚拟化平台来说增加了运维难度,后续通过调整虚拟磁盘的簇大小到32K,测试虚拟磁盘,256并发情况下可以测到3433 TPS。
继续对虚拟化层进行分析,由于物理机使用的是鲲鹏920 5250处理器,单片CPU核数为48,虚拟机使用64C规格大小时,内存访问始终会出现跨片的情况,而从客户给出的64C和32C的测试结果来看,虚拟机并不需要使用64C这么大的规格,使用48C规格虚拟机并进行CPU和内存绑定,可以避免内存出现跨片性能,从而提升CPU和内存的性能。
由于虚拟化使用FC平台,因此需要在FC平台上进行CPU配置更改,由于FC平台默认将宿主机的0-7 CPU核预留给系统使用,因此只能将虚拟机的核绑定到宿主机的CPU 48-95上。
关闭虚拟机后在FC平台上按照以下图片进行配置。
配置修改完成后,启动虚拟机,访问虚拟机所在的物理机,由于FC底层的虚拟化使用的是QEMU进程,因此可以执行numastat -s -p qemu命令查看物理机上的虚拟机内存分配情况:
从结果中可以看到,QEMU虚拟机的内存是分配在NUMA 2上的,而CPU是绑定在48-95上的,因此内存访问会出现跨NUMA的情况,但不会出现跨CPU的情况,内存访问情况比未做绑定前要好很多。
确认完成后进行测试,48C规格虚拟机、磁盘为裸盘的结果如下:
线程数 |
QPS(/s) |
TPS(/s) |
95%响应时间(ms) |
磁盘负载 |
CPU使用率 |
64 |
61616.96 |
3080.85 |
29.72 |
99% |
46%±3% |
128 |
74421.07 |
3721.07 |
46.63 |
99% |
54%±3% |
256 |
85948.63 |
4297.43 |
77.19 |
99% |
56%±4% |
512 |
60032.23 |
3001.61 |
215.44 |
99% |
56%±4% |
从测结果来看,256并发情况下的TPS为4297,相比调整之前的3952提升了9%。
将裸盘替换为虚拟磁盘,256并发情况下的TPS为3980.51,也基本可以达标。
4 其他调优措施
因为时间和环境的关系,此次调优只调整了虚拟化的绑核和裸盘配置的方法,以下方法可能存在优化效果但未实施。
-
BIOS参数调整,抓取宿主机的BMC日志,可以看到BIOS中电源模式为省电模式,SMMU选项未开启,可以尝试在BIOS中调整这两个参数,看是否有优化效果。
-
GreatDB是用来替代MySQL数据库的,本质上可能是基于MySQL进行开发的,也许可以参考MySQL参数的优化来优化GreatDB数据库本身的性能。
-
在极限情况下,还可以通过lto、pgo等方法编译GreatDB,尝试进一步优化数据库性能。
-
宿主机内存配置调整为1 DPC。
-
虚拟机使用内存大页进行内存分配,提高内存分配效率,根据历史经验,可能也会有些许的性能提升。
-
宿主机使用了鲲鹏920 7260处理器,虚拟机规格调整为32C,CPU和内存绑定到同一个NUMA上,避免出现跨NUMA内存访问,进一步提升虚拟机性能。