Doris性能调优实践
发表于 2025/09/09
0
作者 | 韩炯
1 实践背景介绍
客户大数据团队基于开源Apache Doris进行自研,现在鲲鹏服务器上有性能诉求,目标性能相对鲲鹏性能基线提升10%。
2 基础软硬件信息
2.1 硬件配置
鲲鹏硬件 |
配置信息 |
---|---|
服务器型号 |
Taishan 2280*4 |
CPU型号 |
Kunpeng 5250 |
内存 |
128G*4 @2933 |
网卡 |
TM280 4*25GE |
硬盘 |
10*7.1T HDD |
RAID卡 |
NA |
GPU卡 |
NA |
2.2 设备组网
4台鲲鹏服务器连接到同一台支持交换机上,4台鲲鹏服务器的IP地址最后一位分别是1,2,3,4,因此下面用IP地址指代不同的鲲鹏服务器。
节点角色 |
主机节点名称 |
IP地址 |
说明 |
---|---|---|---|
FE和BE |
1 |
192.xx.xx.1 |
主要负责用户请求的接入、查询解析规划、元数据的管理、节点管理相关工作 |
BE |
2 |
192.xx.xx.2 |
|
3 |
192.xx.xx.3 |
||
4 |
192.xx.xx.4 |
主要负责数据存储、查询计划的执行 |
2.3 操作系统与软件信息
表2-1 操作系统与软件信息
名称 |
版本 |
说明 |
---|---|---|
ctyunos |
2.0.1 |
客户现网环境OS |
Doris |
2.1.2 |
- |
3 性能调优实践
3.1 测试场景
在FE所在服务器上安装TPC-H工具包,该工具包在Doris源码的tools目录下,根据开源文档进行测试,整个测试模拟生成TPCH 500G的数据导入到Apache Doris 2.1.2-rc04。
3.2 调优前性能数据
使用鲲鹏5250自身对比测试数据库读写性能,主要测试500G数据量读写耗时,其性能指标如下表所示:
查询语句 |
第一次查询耗时(ms) |
---|---|
q1 |
6239 |
q2 |
575 |
q3 |
5780 |
q4 |
3502 |
q5 |
8456 |
q6 |
916 |
q7 |
4347 |
q8 |
4326 |
q9 |
15572 |
q10 |
6642 |
q11 |
745 |
q12 |
1482 |
q13 |
6297 |
q14 |
591 |
q15 |
988 |
q16 |
1146 |
q17 |
2316 |
q18 |
16009 |
q19 |
3839 |
q20 |
1912 |
q21 |
9592 |
q22 |
1444 |
3.3 性能瓶颈分析
分析步骤如下所示。
步骤 1 在使用TPC-H测试Doris时,通过top指令排查网络、IO、内存等指标,并未发现性能瓶颈。
步骤 2 通过DevKit工具中NUMA精细化分析查看Doris应用进程,发现存在跨NUMA问题。通过NUMA绑核,进行TPC-H测试,发现性能不升反降。通过分析发现,是由于客户环境服务器内存共128G,进程绑核内存利用率降低,导致性能下降,故恢复NUMA绑核操作。
步骤 3 通过火焰图分析Doris应用调用栈情况,发现bshuf_shuffle_bit_eightelem_NEON占比高达59%。
步骤 4 通过修改bitshuffle_core.c文件中的bshuf_shuffle_bit_eightelem_NEON,TPC-H整体性能提升了20%,火焰图占比也减少了83%。
----结束
3.4 调优实施
3.4.1 BIOS参数调优
以下是BIOS参数的通用调优,建议在大数据调优前统一设置。
参数 |
调优步骤 |
默认值 |
调优值 |
参数解释 |
---|---|---|---|---|
性能模式 CustomPowerPolicy |
1. 服务器重启,进入BIOS,依次选择“BIOS->Advanced->Performance Config->Power Policy”。 2. 设置“Power Policy”选项为“Performance”,按F10保存BIOS配置。 |
Efficiency |
Performance |
设置CPU为性能模式,提高主频,发挥CPU最大性能。 |
CPU预取 CPUPrefetchConfig |
1. 服务器重启,进入BIOS,依次选择“BIOS->Advanced->MISC Config->CPU Prefetching Configuration”。 2. 设置“CPU Prefetching Configuration”选项为“Disabled”,按F10保存BIOS配置。 |
Enabled |
Enabled |
CPU将内存中的数据读到CPU的高速缓冲Cache时,会根据局部性原理,除了读取本次要访问的数据,还会预取本次数据的周边数据到Cache里面,如果预取的数据是下次要访问的数据,那么性能会提升,如果预取的数据不是下次要取的数据,那么会浪费内存带宽。 |
内存刷新 DdrRefreshRate |
1. 服务器重启,进入BIOS,依次选择“Advanced->Memory Config->Custom Refresh Rate”。 2. 设置“Custom Refresh Rate”选项为“Auto”,按F10保存BIOS配置 |
32ms |
Auto |
设置该参数之后,会使85°C下刷新率为64ms,减少刷新频率会提升内存性能,85°C上将为32ms。 |
是否开启SMMU EnableSMMU |
1. 服务器重启,进入BIOS,依次选择“BIOS->Advanced->MISC Config->Support Smmu” 2. 设置“Support Smmu”选项为“Disabled”,按F10保存BIOS配置 |
Enabled |
Disabled |
服务器上的SMMU一般用来完成设备的地址转换,并且可以实现设备隔离,在虚拟化中很实用,但是在物理机测试场景下,SMMU可能会导致性能下降,尤其对于小包网络场景,因此建议关闭该功能提升服务器性能。 |
是否使能DIE交织 Die Interleaving |
1. 服务器重启,进入BIOS,依次选择“BIOS->Advanced->Memory Config -> Die Interleaving”。 2. 设置“Die Interleaving”选项为“Disable”,按F10保存BIOS配置。 |
Disabled |
Disable |
使能DIE交织能充分利用系统的DDR带宽,并尽量保证各DDR通道的带宽均衡,提升DDR的利用率,开启后进行细粒度化绑Numa会存在跨CPU die的时延。 |
单CPU单Numa One Numa Per Socket |
1. 服务器重启,进入BIOS,依次选择“BIOS->Advanced->Memory Config->One Numa Per Socket”。 2. 设置“One Numa Per Socket”选项为“Disable”,按F10保存BIOS配置。 |
Disabled |
Disable |
“Die Interleaving”参数为开启状态时,CPU下内存形成对称配置,CPU会自动整合成一个Numa,细粒度化绑Numa会存在跨CPU die的时延。 |
3.4.2 OS参数调优
以下是OS参数的通用调优,建议在调优前统一设置。
参数 |
调优命令 |
---|---|
关闭并禁止内存大页 |
echo never > /sys/kernel/mm/transparent_hugepage/enable |
关闭SWAP(已默认关闭) |
swapoff -a |
设置系统最大打开文件句柄数 |
vi /etc/security/limits.conf |
3.4.3 毕昇编译器使用编译选项优化
由于Doris的开源版本较高,使用的Clang 16编译,所以需要使用毕昇较新版本4.0.0(对应Clang 17)去编译,使用O3、pgo、thinlto等编译选项结合使用,相对鲲鹏性能基线性能提升5%。
3.4.4 bitshuffle非向量化切换方案
步骤 1 修改“apache-doris-XXX-src/thirdparty/src/bitshuffle-0.5.1/src/bitshuffle_core.c”文件,修改1808行和1827行,将USEARMNEON判断去掉,使代码走非向量化分支。
修改后:
步骤 2 重新运行“apache-doris-xxx-src/thirdparty/build-thirdparty.sh”,重新编译第三方依赖。
步骤 3 重新按照官方文档运行build.sh编译Doris包。
步骤 4 使用编译出来包将环境上的包进行替换。
----结束
4 实践总结
经过调优后,Doris软件在鲲鹏集群上,相对鲲鹏性能基线整体提高20%+。
表4-1 性能提升比率
查询语句 |
基线数据(ms) |
优化后耗时(ms) |
性能提升比率 |
---|---|---|---|
q1 |
6239 |
4610 |
26.11% |
q2 |
575 |
406 |
29.39% |
q3 |
5780 |
3933 |
31.96% |
q4 |
3502 |
2519 |
28.07% |
q5 |
8456 |
8176 |
3.31% |
q6 |
916 |
347 |
62.12% |
q7 |
4347 |
3508 |
19.30% |
q8 |
4326 |
2206 |
49.01% |
q9 |
15572 |
12885 |
17.26% |
q10 |
6642 |
5627 |
15.28% |
q11 |
745 |
487 |
34.63% |
q12 |
1482 |
805 |
45.68% |
q13 |
6297 |
5271 |
16.29% |
q14 |
591 |
533 |
9.81% |
q15 |
988 |
870 |
11.94% |
q16 |
1146 |
985 |
14.05% |
q17 |
2316 |
1094 |
52.76% |
q18 |
16009 |
14244 |
11.03% |
q19 |
3839 |
1677 |
56.32% |
q20 |
1912 |
1403 |
26.62% |
q21 |
9592 |
6882 |
28.25% |
q22 |
1444 |
1277 |
11.57% |
总计 |
102716 |
79745 |
22.36% |
5 故障排查
5.1 毕昇编译时链接错误
问题现象
环境上安装了开源Clang 16及毕昇编译器,并配置了全局环境变量,客户用毕昇编译器编译Doris时,无法找到libstdc++.so.6。
可能原因
怀疑是环境问题,通过全局搜索libstdc++.so.6,发现存在该文件,后面又看了环境变量,发现搜索的路径下没有该文件,于是通过创建软链接,找到该文件。
解决方法
重新编译Doris,libstdc++.so.6文件找不到的问题已解决。
5.2 lz4加速库替换后性能未提升
问题现象
Doris代码中通过替换lz4加速库,数据导入测试压缩性能未提升。
可能原因
通过火焰图分析,并未调用到lz4加速库优化的接口,通过咨询lz4开发团队,客户替换的文件不对,需要把kzl.a放到lz4根目录下,并且修改build.sh后重新编译,会生成新的liblz4.a,并把该文件替换到第三方库中。
解决方法
1. 替换kzl.a放到lz4根目录下,修改build.sh,把图中方框内容注释掉。
2. 重新编译,生成liblz4.a。
3. liblz4.a放到Doris第三方库中,并且重新编译Doris。
4. 通过火焰图查看压缩接口调用,已经替换为加速接口。
5. 通过TPCH导入数据到Doris,压缩性能提升5%。