配置算子内存借用
openGauss的算子内存借用功能是基于灵衢内存借用能力实现的功能,它允许数据库查询执行期间的部分算子动态借用远端节点的空闲内存资源。通过扩展算子可用的work_mem,有效提升内存密集型操作的执行效率。
适用场景与限制
环境需求:需要环境支持并且配置灵衢内存借用能力。同时集群中配置的远端节点有空闲内存资源。
适用场景
- 大型分析型查询:处理大规模数据集时,需要大量的内存空间用于Sort/HashJoin/Agg,内存不足会触发大量落盘导致性能下降明显
- 本地内存不足:当本地节点内存资源紧张但集群其他节点有空闲内存
支持动态内存借用算子:
- HashAgg
- HashJoin
- Sort
- Sonic HashAgg / Vector HashAgg
- Sonic HashJoin / Vector HashJoin
集群资源对算子内存借用的影响
算子内存借用是一种利用远端空闲内存加速内存密集型算子的方案。开启功能后如果远端内存空闲,且查询本身为内存密集型查询,会有明显的性能提升。但是如果远端内存繁忙无法借出,则可能退回仅本地内存的模式,性能比较未开启功能无明显提升。
功能开启后,算子可用内存受到work_mem和borrow_work_mem限制,关于work_mem的部分可以参照SMP的描述。单算子内存借用上限受到borrow_work_mem和远端可用内存限制。最差场景会回退为仅本地内存的模式。
当配置适当时,算子内存借用可以带来:
- 减少甚至消除内存不足导致的落盘操作
- 提升内存密集型算子30%的执行效率(典型TPCH 1T场景)
- 混合负载集群中,可以提高整体资源利用率
配置与使用
启用算子内存借用功能,需要进行以下配置:
- 修改配置文件,设置最大内存借用可用大小。(postgresql.conf)该参数需要重启openGauss生效。
# 该openGauss实例总可用借用内存,算子内存借用和其他功能(HTAP借用等)共用该上限
max_rack_memory = 64GB
- 配置算子可借用内存
set borrow_work_mem = 16GB
使用限制与注意事项
- 远端节点负载:集群需要有足够的空闲资源
- borrow_work_mem的限制和work_mem基本一致,实际可能消耗的内存上限等于SMP并发 * 算子 * (work_mem + borrow_work_mem)。
- 资源紧张:集群范围内大量的并发借用,可能会导致资源竞争。性能受到内存借用接口性能影响。
可靠性
算子内存借用场景下,在进程未结束而内存释放失败时,进程内部残留内存,而MXE后台无法回收,因此需要引入故障机制处理该内存。通过开启enable_rack_memory_cleaner,启动内存清理线程,收集并统一释放残留内存。
enable_rack_memory_cleaner
参数说明:灵衢场景下用于控制后台UBSE集群状态查询与残留内存清理线程。在UBSE故障场景下,算子借用功能通过该线程感知故障,停止内存借用并会退回原生流程,保证语句正常执行。同时故障场景下,借用内存的释放也会失败,开启该线程,会收集释放失败内存,并在UBSE功能可用后,进行统一释放。
该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。
取值范围: 布尔型
on
/true
表示启用开启查询清理线程。off
/false
表示不启用开启查询清理线程。
默认值:off
/false
。
设置建议: 非灵衢场景,请勿开启,避免线程对数据库性能冲突。