Doris Base Compaction 与 BE 节点 IO 使用率高,核心原因是 Compaction 任务本身需大量读写数据,当任务触发频繁、资源配置不合理或数据特征特殊时,IO 资源会被持续占用。
一、核心原因分析
1. Compaction 任务触发过于频繁
- 数据写入量大/写入频繁:短时间内大量 Stream Load、Broker Load 等写入操作,会生成大量小版本的 Rowset。当 Rowset 数量或大小达到 Base Compaction 触发阈值(如
base_compaction_num_version_threshold)时,会频繁触发任务,持续占用 IO。 - 分区/分桶设计不合理:若表的分区粒度过细(如按小时分区)或分桶数量过多,每个分区/分桶都会独立触发 Compaction,导致整体任务量倍增,IO 负载叠加。
- !!!我的问题是第二点!!!: 表数据量大,tablet设置的是10,平均一个tablet大小为400GB,远远超过合理范围

2. Compaction 资源配置失衡
- IO 资源分配不足:BE 节点的 Compaction IO 带宽未做限制(如
compaction_io_limit_bytes_per_sec未配置或值过大),任务会无节制占用磁盘 IO,挤压查询等其他业务的 IO 资源。 - 线程资源不足:Compaction 线程数(如
base_compaction_threads)配置过少,导致任务堆积。堆积的任务会持续等待 IO 资源,形成“任务排队→IO 长期占用”的循环。
3. 数据特征导致 IO 消耗高
- 大表/宽表场景:表数据量庞大(如数十亿行)或列数过多(如数百列),单次 Base Compaction 需要读取大量 Rowset 数据并合并写入,读写 IO 量远超普通表。
- 数据重复/更新频繁:若表存在大量 UPDATE/DELETE 操作,Compaction 时需处理更多版本的行级数据合并,增加数据读取和计算量,间接导致 IO 耗时延长。
4. 存储介质或硬件瓶颈
- 磁盘性能不足:BE 节点使用 HDD 而非 SSD,或磁盘本身存在坏道、转速不足等问题,IO 读写速度无法支撑 Compaction 的高频需求,导致 IO 使用率长期处于高位。
- 存储挂载方式问题:磁盘挂载时未优化(如未开启 IO 调度算法、挂载参数不合理),或多 BE 节点共享同一存储设备,造成 IO 资源竞争。
二、排查与优化建议
1. 优先排查 Compaction 任务状态
- 通过 Doris 管理界面(如 FE 的 Web UI)或 SQL 查看任务队列:
GET /api/compaction/run_status GET /api/compaction/show?tablet_id={int} - 重点关注
Pending状态的任务数量,若数量持续增加,说明任务触发频率超过处理能力。
2. 调整 Compaction 触发与资源参数
- 降低触发频率:调大 Base Compaction 触发阈值(需根据业务写入量调整),示例:
ALTER TABLE table_name SET PROPERTIES ( "base_compaction_num_version_threshold" = "50", -- 版本数阈值,默认30 "base_compaction_size_threshold" = "10GB" -- 大小阈值,默认5GB ); - 限制 IO 带宽:在 BE 节点的
be.conf中配置 IO 上限,避免占用过多资源:compaction_io_limit_bytes_per_sec = 104857600 -- 限制为100MB/s - 增加处理线程:适当调大 Compaction 线程数(避免超过 CPU 核心数):
base_compaction_threads = 4 -- 默认2,根据CPU核心数调整
3. 优化表结构与写入方式
- 调整分区/分桶:合并过细的分区(如按天分区替代按小时),减少分桶数量(确保单个分桶大小在 100MB~1GB 之间)。
- 控制写入频率:将高频小批量写入(如每秒多次 Stream Load)合并为批量写入,减少 Rowset 生成速度。
4. 检查存储硬件与配置
- 替换存储介质:若条件允许,将 BE 节点的 HDD 替换为 SSD,提升 IO 读写速度。
- 优化磁盘挂载:检查磁盘挂载参数(如添加
noatime选项减少磁盘 IO),并确保每个 BE 节点使用独立的存储设备。
5. 检查大tablet
select
tablet_id,
max(data_disk_size) /1024/1024/1024 size_G,
max(rowset_num_rows)
from information_schema.rowsets
group by
tablet_id
having max(data_disk_size) >5000000000
order by max(data_disk_size) desc
limit 15;
-- 根据tablet id找库表名
show tablet 66892771;
2773

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



