Doris 调优核心围绕资源利用率(内存 / CPU/I/O)、查询性能、导入效率和集群稳定性展开,需结合硬件环境(CPU / 内存 / 磁盘类型)、业务场景(高并发点查 / 大数据量分析 / 高吞吐导入)和数据特征(数据量 / 分区粒度 / 查询模式)定制配置。以下是分维度的调优方案,包含参数说明、适用场景和推荐值。
一、调优前置:基础环境优化
调优前需确保底层环境适配 Doris 运行特性,避免系统层瓶颈掩盖参数调优效果。
1. 操作系统核心参数(所有节点)
# 1. 调整文件描述符(避免打开文件数不足)
echo "* soft nofile 1048576" >> /etc/security/limits.conf
echo "* hard nofile 1048576" >> /etc/security/limits.conf
# 2. 虚拟内存(避免OOM和内存映射限制)
echo "vm.max_map_count=2000000" >> /etc/sysctl.conf
echo "vm.overcommit_memory=1" >> /etc/sysctl.conf # 允许内存超分配(分析场景友好)
echo "vm.swappiness=0" >> /etc/sysctl.conf # 禁用swap(优先使用物理内存)
# 3. 网络优化(高并发查询/导入)
echo "net.core.somaxconn=65535" >> /etc/sysctl.conf # 监听队列上限
echo "net.ipv4.tcp_tw_reuse=1" >> /etc/sysctl.conf # 复用TIME_WAIT连接
echo "net.ipv4.tcp_keepalive_time=60" >> /etc/sysctl.conf # 缩短保活时间
sysctl -p
2. 硬件适配建议
| 组件 | 硬件配置建议 | 说明 |
|---|---|---|
| FE 节点 | 8 核 32G+(推荐 16 核 64G)、SSD | 元数据和查询调度依赖内存 |
| BE 节点 | 16 核 64G+、SSD(分析场景)/NVMe(高吞吐) | I/O 是核心瓶颈 |
| 磁盘 | 单节点挂载多块磁盘(做 RAID0 / 条带化) | 分散 I/O 压力 |
二、FE(Frontend)调优
FE 负责元数据管理、查询解析 / 调度,调优核心是内存控制、JVM 性能和调度效率。
1. JVM 内存调优(fe.conf)
FE 基于 JVM 运行,内存不足会导致 GC 频繁、查询超时,需根据节点规格调整:
# 基础配置(生产环境推荐值)
# 8核16G节点:-Xmx8g -Xms8g
# 16核32G节点:-Xmx16g -Xms16g
# 32核64G节点:-Xmx32g -Xms32g
JAVA_OPTS="-Xmx16g -Xms16g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:MaxGCPauseMillis=200"
# 关键说明:
# -Xmx/-Xms:堆内存设为相同值,避免动态扩容触发GC
# UseG1GC:低延迟GC收集器,适合查询调度场景
# MaxGCPauseMillis:控制GC最大停顿时间(200ms内)
2. 元数据与调度调优(fe.conf)
# 1. 元数据缓存(避免频繁读取磁盘)
meta_memory_limit=8589934592 # 8GB(建议为JVM堆内存的50%)
metadata_cache_ttl_seconds=3600 # 元数据缓存过期时间(1小时)
# 2. 查询调度优化
qe_max_concurrent_queries=1000 # 最大并发查询数(根据业务QPS调整,默认500)
qe_slow_log_ms=2000 # 慢查询阈值(2秒,便于定位慢查)
schedule_pool_size=100 # 查询调度线程池大小(默认50,高并发场景调大)
# 3. 导入调度(高吞吐导入场景)
max_load_default_timeout_second=86400 # 导入超时时间(24小时,避免大导入被中断)
load_queue_max_size=1000 # 导入队列最大长度(默认100,调大避免导入排队失败)
3. FE 高可用调优
# Raft 协议调优(多FE节点场景)
raft_heartbeat_interval_ms=500 # 心跳间隔(默认1000ms,缩短提高故障切换速度)
raft_election_timeout_ms=3000 # 选举超时(默认5000ms,缩短故障恢复时间)
edit_log_storage_type=shared_storage # 元数据日志存储(NFS/S3,避免单点)
三、BE(Backend)调优
BE 是数据存储和计算核心,调优覆盖内存分配、I/O 效率、计算并行度,需区分磁盘类型(HDD/SSD)和业务场景(查询 / 导入)。
1. 内存核心配置(be.conf)
内存是 BE 调优的核心,需合理分配 “计算内存”“导入内存”“缓存内存”,避免 OOM:
# 1. 总内存限制(建议为物理内存的80-85%)
# 64G物理内存节点:max_memory_limit=50g
# 128G物理内存节点:max_memory_limit=100g
max_memory_limit=50g
# 2. 计算内存分配
max_query_memory=10g # 单个查询最大内存(避免单查询占满内存)
exec_mem_limit=8g # 单个查询计划节点内存(默认2G,分析场景调大)
# 3. 导入/合并内存(避免Compaction抢占查询资源)
max_compaction_memory=8g # 最大合并内存(默认4G,大数据量调大)
compaction_pool_thread_num=16 # 合并线程数(SSD建议16,HDD建议8)
max_load_memory=10g # 导入内存上限(高吞吐导入调大)
# 4. 缓存内存(点查/高频查询场景)
enable_row_cache=true # 开启行级缓存(点查场景必开)
row_cache_size=16106127360 # 16GB(根据内存剩余调整)
enable_column_cache=true # 开启列缓存(分析场景)
column_cache_size=8589934592 # 8GB
2. I/O 性能调优(be.conf)
I/O 是 BE 最大瓶颈,需根据磁盘类型(HDD/SSD)调整并行度和缓冲区:
# 1. SSD 专属配置(高并发/高吞吐)
base_compaction_num_threads_per_disk=16 # 基础合并线程/磁盘(HDD=8,SSD=16)
cumulative_compaction_num_threads_per_disk=8 # 累积合并线程/磁盘
write_buffer_size=2048mb # 写入缓冲区(默认1GB,SSD调大)
file_descriptor_cache_capacity=100000 # 文件描述符缓存(避免频繁打开文件)
# 2. HDD 专属配置(减少随机I/O)
enable_prefetch=true # 开启预读取
prefetch_page_count=100 # 预读取页数
min_bytes_for_seek=1048576 # 超过1MB则跳过(减少小范围读取)
# 3. 通用I/O优化
disk_read_write_mode=O_DIRECT # 绕过系统页缓存(SSD推荐,HDD可选)
batch_size=1024000 # 批量读取行数(默认10万,调大提高吞吐)
3. 计算并行度调优(be.conf)
根据 CPU 核心数调整并行度,避免过载或资源浪费:
# 1. 扫描并行度
doris_scan_range_row_count=2097152 # 每个扫描分片行数(默认100万,调大减少分片数)
scan_thread_pool_size=128 # 扫描线程池(CPU核心数*2)
# 2. 聚合/排序并行度
aggregation_thread_pool_size=64 # 聚合线程池(CPU核心数)
sort_thread_pool_size=64 # 排序线程池(CPU核心数)
# 3. JOIN 优化
hash_join_partitions=64 # Hash JOIN分区数(CPU核心数)
nested_loop_join_threshold=1000000 # 嵌套循环JOIN阈值(小表阈值,调大减少Hash JOIN)
4. 导入性能调优(be.conf)
针对 Stream Load/Broker Load/Routine Load 优化导入吞吐:
load_process_pool_thread_num=64 # 导入处理线程数(默认32,高吞吐调大)
load_buffer_pool_size=42949672960 # 40GB(导入缓冲区)
enable_chunk_queue_pipeline=true # 开启导入流水线(提高吞吐)
min_load_sink_batch_size=104857600 # 导入批大小(100MB,调大减少刷盘次数)
四、表设计调优(基础且关键)
表结构设计的合理性远大于参数调优,需结合查询模式优化:
1. 数据模型选择
| 模型类型 | 适用场景 | 调优点 |
|---|---|---|
| Aggregate Key | 报表分析、聚合查询 | 预聚合(SUM/MAX/MIN)减少计算量 |
| Unique Key | 精准去重、更新(如用户画像) | 开启批量更新(batch_delete=true) |
| Duplicate Key | 原始日志、全量查询 | 按查询维度排序(sort key) |
2. 分区与分桶优化
# 1. 分区策略(按时间/高频过滤维度)
CREATE TABLE log_table (
dt DATE,
user_id BIGINT,
pv INT
)
PARTITION BY RANGE (dt) (
PARTITION p202501 VALUES LESS THAN ('2025-02-01'),
PARTITION p202502 VALUES LESS THAN ('2025-03-01')
)
# 2. 分桶策略(核心:分桶数=BE节点数*2~4,避免数据倾斜)
DISTRIBUTED BY HASH(user_id) BUCKETS 24; # 8个BE节点 → 24个桶
# 关键原则:
# - 分区粒度:按天/小时(查询常用过滤条件),单分区大小5-10GB(避免过大)
# - 分桶键:选择高频JOIN/过滤字段(如user_id/order_id),避免单一值(如常量)
3. 列类型与索引优化
# 1. 列类型精简(减少内存占用)
CREATE TABLE order_table (
order_id BIGINT, # 避免用STRING存ID
amount DECIMAL(10,2), # 精准存储金额,比FLOAT省空间
create_time DATETIME, # 时间类型比STRING省空间且支持函数
status TINYINT # 用TINYINT替代STRING(如1=待支付,2=已支付)
) ...;
# 2. 索引优化(点查/过滤场景)
# - 前缀索引:默认前36字节,覆盖高频过滤字段
ALTER TABLE order_table SET PROPERTIES ("prefix_index_columns" = "order_id,create_time");
# - Bloom Filter:高基数列(如user_id),加速等值过滤
ALTER TABLE order_table MODIFY COLUMN user_id SET BloomFilter = "true";
# - ZOrder索引:多维过滤场景(如user_id+dt)
ALTER TABLE order_table ADD INDEX z_idx (user_id, dt) USING ZORDER;
五、查询性能调优
1. SQL 层面优化技巧
| 优化场景 | 优化方案 |
|---|---|
| 大表 JOIN | 小表放左表(Doris 自动广播小表)、开启 Bucket Shuffle JOIN(大表 JOIN) |
| 聚合查询 | 提前预聚合(Aggregate Key 模型)、使用 ROLLUP(聚合维度物化) |
| 分页查询 | 用 LIMIT + 排序键(避免 OFFSET 大偏移)、预计算分页结果 |
| 多表关联 | 优先过滤再 JOIN(WHERE 条件下推)、避免笛卡尔积 |
2. 查询执行参数调优(会话级 / 全局)
# 1. 会话级调优(针对慢查询)
SET exec_mem_limit = 10G; # 临时提高单查询内存
SET parallel_fragment_exec_instance_num = 16; # 提高并行度
SET enable_vectorized_engine = true; # 开启向量化引擎(必开,提速50%+)
# 2. 全局调优(fe.conf)
enable_vectorized_engine=true # 全局开启向量化
enable_runtime_filter=true # 开启运行时过滤(大表JOIN提速)
runtime_filter_type=BLOOM_FILTER # 过滤类型(BLOOM/IN)
六、集群级调优
1. 负载均衡
# 1. 数据均衡(避免单BE节点负载过高)
ADMIN SET FRONTEND CONFIG ("balance_load_interval_seconds" = "300"); # 5分钟检测一次
ADMIN SET FRONTEND CONFIG ("balance_load_score_threshold" = "50"); # 负载差超过50触发均衡
# 2. 查询均衡(避免单FE节点调度压力大)
SET GLOBAL fe_schedule_random = true; # 随机分配查询到FE节点
2. Compaction 调优(避免小文件)
小文件会导致 I/O 随机读增加,需优化 Compaction 策略:
# be.conf
cumulative_compaction_checker_interval_seconds=60 # 检查间隔(默认180s)
cumulative_compaction_budget_bytes=107374182400 # 累积合并预算(100GB)
base_compaction_checker_interval_seconds=300 # 基础合并检查间隔
# 手动触发Compaction(紧急场景)
ADMIN COMPACT TABLE order_table; # 全表合并
ADMIN COMPACT TABLE order_table PARTITION p202501; # 分区合并
3. 副本策略调优
# 1. 副本数(平衡可用性和存储成本)
ALTER SYSTEM SET CONFIG ("default_replica_num" = "3"); # 生产环境建议3副本
# 2. 冷热数据分离(降低存储成本)
ALTER TABLE log_table MODIFY PARTITION p202401 SET ("storage_medium" = "HDD"); # 冷数据放HDD
ALTER TABLE log_table MODIFY PARTITION p202501 SET ("storage_medium" = "SSD"); # 热数据放SSD
七、不同场景调优模板
1. 高并发点查场景(QPS 10 万 +)
# BE 配置
enable_row_cache=true
row_cache_size=32212254720 # 32GB
doris_scan_range_row_count=4194304 # 400万行/分片
min_bytes_for_seek=4194304 # 4MB跳过
enable_bloom_filter=true # 开启Bloom Filter
# 表设计
DISTRIBUTED BY HASH(primary_key) BUCKETS 64; # 更多分桶提高并行度
ADD INDEX bloom_idx (primary_key) USING BLOOM_FILTER;
2. 大数据量分析场景(TB 级数据)
# BE 配置
max_query_memory=20g
enable_column_cache=true
column_cache_size=16106127360 # 16GB
base_compaction_num_threads_per_disk=16
enable_vectorized_engine=true
# 表设计
AGGREGATE KEY 模型 + ROLLUP(多维度预聚合)
PARTITION BY RANGE (dt) # 按天分区
DISTRIBUTED BY HASH(dim_key) BUCKETS 48;
3. 高吞吐导入场景(TPS 10 万 +)
# BE 配置
load_process_pool_thread_num=128
load_buffer_pool_size=64424509440 # 60GB
write_buffer_size=4096mb
enable_chunk_queue_pipeline=true
# 导入参数
STREAM LOAD 时设置:
format="csv"
max_filter_ratio=0.01
send_batch_parallelism=16
八、调优验证与监控
-
关键指标监控:
- FE:JVM GC 次数 / 耗时、查询并发数、慢查询数
- BE:内存使用率、I/O 利用率、Compaction 完成率、导入吞吐
- 集群:副本健康度、数据均衡率、查询延迟 P99
-
工具验证:
EXPLAIN ANALYZE:查看查询执行计划和耗时分布SHOW BACKENDS:检查 BE 节点负载ADMIN SHOW TABLET:检查分桶数据倾斜doris-advisor:Doris 官方调优工具(自动检测配置和表结构问题)
调优总结
- 优先级:表设计优化 > 系统层优化 > FE/BE 参数调优 > SQL 优化;
- 循序渐进:先基准测试(压测)定位瓶颈,再针对性调优,避免盲目改参数;
- 动态调整:业务变化(数据量 / 查询模式)后,需重新评估配置(如分桶数、内存分配);
- 核心原则:资源隔离(导入 / 查询 / Compaction 内存分开)、避免单点(多副本 / 多 FE)、适配硬件(SSD/HDD 差异化配置)。
1192

被折叠的 条评论
为什么被折叠?



