鲲鹏社区首页
中文
注册
Doris性能调优实践

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
echo never > /sys/kernel/mm/transparent_hugepage/defrag

关闭SWAP(已默认关闭)

swapoff -a

设置系统最大打开文件句柄数

vi /etc/security/limits.conf
* soft nofile 1000000
* hard nofile 1000000

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%。

本页内容