摘要:GaussDB(DWS)提供了资源管理功能,用户可以根据自身业务情况对资源进行划分,将资源按需划分成不同的资源池,不同资源池之间资源互相隔离。
本文分享自华为云社区《GaussDB(DWS)资源管理排队原理与问题定位》,作者: 门前一棵葡萄树 。
一、内存管控原理
GaussDB(DWS)提供了资源管理功能,用户可以根据自身业务情况对资源进行划分,将资源按需划分成不同的资源池,不同资源池之间资源互相隔离。再通过用户关联资源池的方式将数据库用户关联至不同的资源池,用户查询依据“用户-资源池”的关联关系将查询路由至对应资源池执行,以此实现对查询并发、内存及CPU资源的管控。从而实现对不同业务之间的资源限制和隔离,满足数据库混合负载需求,保证查询执行时资源调度的有序可控,防止烂SQL影响整个集群。
1.1 自适应内存
传统内存管理场景下,使用work_mem限制算子可以使用的内存上限,通常复杂查询的执行计划中包含多个算子,每个算子可能需要使用的内存并不相同,但是每个算子可用的内存上限均为work_mem,很难找到一个最优的work_mem取值,一方面保证查询性能满足预期,一方面还需要保证不会导致内存报错。在查询并发场景下,静态内存管理的work_mem及并发上限就更难设置了。单查询算子数量从0~N不等,设置work_mem后无法实现语句级内存资源使用的控制,多并发场景下可能会导致内存资源不受控,进而导致OOM。
针对传统内存管理的弊端,GaussDB(DWS)设计实现了内存自适应技术:
- 解除对work_mem的依赖,优化器依据统计信息对查询使用内存进行估算;
- 执行器执行SQL过程中,如果使用内存超过估算内存即触发下盘;
- 资源管理依据优化器估算的查询内存,对查询进行调度和管控。
另外,为保证多CN场景下的内存可控,设计实现CCN用于查询的统一调度,以此保证所有CN上运行的查询使用内存之和不会超过内存上限,进而导致内存不足,引发报错。CM在第一次集群启动时,通过集群部署形式,选择编号最小的CN作为CCN,CCN故障之后,由CM选择新的CCN进行替换。