摘要:GaussDB(DWS)提供了资源管理功能,用户可以根据自身业务情况对资源进行划分,将资源按需划分成不同的资源池,不同资源池之间资源互相隔离。
本文分享自华为云社区《GaussDB(DWS)资源管理排队原理与问题定位》,作者: 门前一棵葡萄树 。
GaussDB(DWS)提供了资源管理功能,用户可以根据自身业务情况对资源进行划分,将资源按需划分成不同的资源池,不同资源池之间资源互相隔离。再通过用户关联资源池的方式将数据库用户关联至不同的资源池,用户查询依据“用户-资源池”的关联关系将查询路由至对应资源池执行,以此实现对查询并发、内存及CPU资源的管控。从而实现对不同业务之间的资源限制和隔离,满足数据库混合负载需求,保证查询执行时资源调度的有序可控,防止烂SQL影响整个集群。
传统内存管理场景下,使用work_mem限制算子可以使用的内存上限,通常复杂查询的执行计划中包含多个算子,每个算子可能需要使用的内存并不相同,但是每个算子可用的内存上限均为work_mem,很难找到一个最优的work_mem取值,一方面保证查询性能满足预期,一方面还需要保证不会导致内存报错。在查询并发场景下,静态内存管理的work_mem及并发上限就更难设置了。单查询算子数量从0~N不等,设置work_mem后无法实现语句级内存资源使用的控制,多并发场景下可能会导致内存资源不受控,进而导致OOM。
针对传统内存管理的弊端,GaussDB(DWS)设计实现了内存自适应技术:
另外,为保证多CN场景下的内存可控,设计实现CCN用于查询的统一调度,以此保证所有CN上运行的查询使用内存之和不会超过内存上限,进而导致内存不足,引发报错。CM在第一次集群启动时,通过集群部署形式,选择编号最小的CN作为CCN,CCN故障之后,由CM选择新的CCN进行替换。
CCN管控与CN管控间差异及优劣:
综上所述,CN管控对查询性能影响较小,但是内存管控效果有限,CCN管控对查询性能影响可能较大,但是可以实现内存精准管控,消除内存不足报错。
为实现更为精细的管控,我们根据查询预期执行时间和资源消耗,将查询划分为执行时间长、资源消耗多的复杂查询和执行时间短、资源消耗少的简单查询。简单查询和复杂查询的划分与资源消耗密切相关,同时因为查询执行前就需要划分简单/复杂查询,因此根据估算内存(代价)对查询进行划分:
混合负载场景下,虽然简单查询本身执行时间短、消耗资源少,但是因为复杂查询可能会长时间大量占用资源,进而导致资源耗尽,使得简单查询不得不在队列中等待复杂查询执行完成。为提升执行效率、提高数据库整体吞吐量, 设计实现“短查询加速”功能,实现对简单查询的单独管控。
虽然单个简单查询资源消耗少,但是大量简单查询并发运行还是可能占用大量资源,另外对简单查询进行CCN管控可能会影响查询性能,降低吞吐量。因此为降低对查询的性能影响,同时实现内存管控目的,我们仅对复杂查询进行CCN并发和内存管控,简单查询由各自CN单独进行并发控制。
GaussDB(DWS) 内存管控分为三级,分别是:
基于优化器给出的查询估算内存,资源管理提供了两种内存管控方式:
特例:
通过以上描述,其实不难看出内存管控的基础是优化器的内存估算,内存估算准确可以实现内存的精准管控,内存估算不准可能引起一系列的问题:
基于以上问题,资源管理做了以下功能降低估算不准带来的影响:
查询估算内存兜底机制(820-1230):在查询估算内存超过单查询估算内存上限时,对查询估算内存进行修正,按照单查询估算内存上限进行管控。
GaussDB(DWS)可能在以下情况下发生排队:
特例:初始用户及白名单语句不受控。
GaussDB(DWS)对外提供诸多系统视图,可以用来辅助资源管理及资源使用相关问题的分析定位,常用视图及用法说明如下表所示。(☆代表常用程度)
除过上述常用视图,资源管理问题定位过程需要根据实际场景,结合实例日志、集群状态等共同分析定位。
为方便迅速定位问题,根据现网实践经验对以上常见视图进行组合,整合了三个问题定位过程中的常用视图:资源池监控视图、用户监控视图以及作业监控视图。与上面内置视图相比,这几个视图依据现网定位经验与分布式数据库特点,对查询结果做了针对性优化,同时优化了字段显示,用户更易理解,可以作为常规监控视图使用。具体视图定义可参考附件。
出现业务阻塞、性能下降、查询无响应等类似现网问题时,通过以下方法可以排查是否排队问题并定位排队原因,同时根据排队原因给出相应规避措施。
Step1 确认是否排队
首先确认是否排队问题,其次排查排队原因,确认是否属于正常排队:
SELECT * FROM pgxc_respool_runtime_info ORDER BY 1,2,3;
SELECT s.resource_pool AS rpname, s.node_group, count(1) AS session_cnt, SUM(CASE WHEN a.enqueue = 'waiting in global queue' THEN 1 ELSE 0 END) AS global_wait, SUM(CASE WHEN s.lane= 'fast' AND a.state = 'active' AND (a.enqueue IS NULL OR a.enqueue = 'no waiting queue') THEN 1 ELSE 0 END) AS fast_run, SUM(CASE WHEN s.lane= 'fast' AND a.enqueue = 'waiting in respool queue' THEN 1 ELSE 0 END) AS fast_wait, SUM(CASE WHEN s.lane= 'slow' AND a.state = 'active' AND (a.enqueue IS NULL OR a.enqueue = 'no waiting queue') THEN 1 ELSE 0 END) AS slow_run, SUM(CASE WHEN s.lane= 'slow' AND (a.enqueue = 'waiting in ccn queue' OR a.enqueue = 'waiting in respool queue') THEN 1 ELSE 0 END) AS slow_wait, SUM(CASE WHEN (a.enqueue IS NULL OR a.enqueue = 'no waiting queue') AND a.state = 'active' THEN statement_mem ELSE 0 END) AS est_mem FROM pgxc_session_wlmstat s,pgxc_stat_activity a WHERE s.threadid=a.pid(+) AND s.attribute != 'Internal' GROUP BY 1,2
SELECT s.resource_pool AS rpname, s.node_group, count(1) AS session_cnt, SUM(CASE WHEN a.enqueue = 'waiting in global queue' THEN 1 ELSE 0 END) AS global_wait, SUM(CASE WHEN s.attribute= 'Simple' AND a.state = 'active' AND (a.enqueue IS NULL OR a.enqueue = 'no waiting queue') THEN 1 ELSE 0 END) AS fast_run, SUM(CASE WHEN s.attribute= 'Simple' AND a.enqueue = 'waiting in respool queue' THEN 1 ELSE 0 END) AS fast_wait, SUM(CASE WHEN s.attribute= 'Complicated' AND a.state = 'active' AND (a.enqueue IS NULL OR a.enqueue = 'no waiting queue') THEN 1 ELSE 0 END) AS slow_run, SUM(CASE WHEN s.attribute= 'Complicated' AND (a.enqueue = 'waiting in ccn queue' OR a.enqueue = 'waiting in respool queue') THEN 1 ELSE 0 END) AS slow_wait, SUM(CASE WHEN (a.enqueue IS NULL OR a.enqueue = 'no waiting queue') AND a.state = 'active' THEN statement_mem ELSE 0 END) AS est_mem FROM pgxc_session_wlmstat s,pgxc_stat_activity a WHERE s.threadid=a.pid(+) AND s.attribute != 'Internal' GROUP BY 1,2;
某些老版本不存在pgxc_session_wlmstat视图,可以参考附件创建类似函数/视图。
通过查询自定义视图可以获取到各资源池快慢车道作业运行信息以及作业排队信息,据此可以直接判断是否排队问题。
Step2 排查排队原因
常见排队原因及解决措施
1.全局并发排队
2.快车道排队
3.静态慢车道排队
4.动态CCN排队
如果查询在CCN排队,可使用附件中自定义资源池监控视图和作业监控视图确认排队原因,或查询CCN开发者视图确认排队原因(不推荐):
SELECT * FROM pg_stat_get_workload_struct_info();
CCN上可能的排队原因:
附件:自定义监控视图.rar18.11KB