一文详述 DMS 资源池队列阻塞告警及原理
本文分享自华为云社区《DMS资源池队列阻塞告警及原理介绍》,作者: codefulture。
一、概述
资源池队列阻塞告警旨在通过一定的检测机制,提前对资源池队列阻塞的情况告知用户,避免影响正常业务。然而如何得知资源池队列阻塞就需要了解其背后的运行原理,本文所述仅仅是一种检测方式,并非唯一绝对的,也可以通过其他方式检测资源池队列阻塞。
二、资源管理/负载管理概述
数据库系统的负载管理和资源管理,在整个系统中起着很重要的作用。
1. 负载管理简介:双层排队机制
DWS 的负载管理分为两层,第一层为 CN 的全局并发控制,第二层为资源池级别的并发控制。在通过第一层控制的时候,会继续向前走到第二层资源池控制,根据资源池当前的负载资源情况决定作业继续执行或者排队。
DWS 并发控制逻辑示意图如下:
2. 资源管理简介
影响一个集群的资源包括内存、CPU、磁盘 I/O 和存储空间等。GaussDB(DWS)提供了一系列资源负载管理手段,通过对资源的集中管控,可以有效避免作业占用资源的冲突,高优先级作业优先执行,以及用户间的资源隔离。其中:
CPU、I/O 等计算资源是通过资源池进行管理。
内存管理通过数据库系统参数、GUC 参数,和资源池等进行控制。
数据存储空间是通过创建用户指定。
3. 总结
通过上面的介绍可以总结出:负载管理是为了解决排队的问题,将任务能够平均到不同的 cn 或资源池上;然而在实际应用中,作业是否排队与资源池的资源有着直接关系;资源管理通过一定手段提高资源的利用率。
资源池是 GaussDB(DWS)进行负载管理的基本单元,负责管理业务运行所需的系统资源(包括 CPU、I/O 和内存),并提供 SQL 的并发控制功能。
三、基于资源池的负载管理
GaussDB(DWS)资源负载管理的核心是资源池,资源池提供多种属性可以控制内存、IO 和 CPU 资源的控制,基于优先级调度机制实现资源管理和分配,对用户业务提供资源负载管理服务。基于资源池的资源负载管理的范围包括:并发管理、优先级调度。
1. 控制组(Controller Group)
在介绍资源池之前需要先了解控制组的相关概念。cgroups 是 Linux 内核提供的一种可以限制进程所使用资源的机制,全称是 control groups,cgroups 为每种可以控制的资源定义了一个子系统。
图中是控制组的一个挂载树,从最上层开始,就分为了两部分,一部分是属于 Gaussdb 的资源,一部分是留给系统其他进程使用的资源,我们使用的资源如图所示,都是挂载到 Gaussdb:gaussdba 的,其中第一层又分为两个控制组,Backend 用来预留资源给数据库常驻的各个工作线程,Class 控制组的资源用来分配给各个用户进行作业执行。
2. 资源池(Resource Pools)
资源负载管理的工作原理如图所示。
资源池通过绑定控制组进行实现资源的分配,作业的优先级和其关联的资源池的资源数量有关。一般情况下,我们认为作业关联到的资源池拥有的资源数量越多,则其优先级越高,因为该作业能够拥有更多的资源去执行。如果一个资源池拥有的资源比例发生了变化,则其对应的优先级也会发生变化,可以通过调整资源池中属性来修改优先级。
在开启资源负载管理功能之后,default_pool 是由系统自动创建,当一个会话或者用户没有指定关联的资源池时,都会被默认关联到 default_pool,并且 default_pool 默认绑定到 DefaultClass:Medium 控制组,并且不限制所关联的业务并发数,而且一个控制组可以绑定多个资源池。
3. 关联作业
在使用资源池对系统资源进行分配后,需要将作业关联到某个资源池上,才能实现对业务的负载管理。把资源池与用户进行关联后,该用户下执行的所有作业都会自动关联到该资源池下。如果该用户没有绑定资源池,则任务进入默认资源池 default_pool 的等待队列。
四、query band 负载识别
当一个控制组关联的资源池有多个的时候,用户下发的作业应该使用哪个资源池来执行任务呢?如果用户已经下发了很多作业,但是某个新作业又非常紧急怎么办?类似的问题可能还有很多,那么如何解决上述的问题呢,这时候我们就要借助一个手段:query band。
GaussDB(DWS)实现基于 query band 的负载识别和队列内优先级控制,一方面提供了更为灵活的负载识别手段,可根据作业类型、应用名称、脚本名称等识别负载队列,使用户根据业务场景可灵活配置 query band 识别队列;另一方面实现了队列内作业下发优先级控制。管理员用户可根据业务场景及作业类别配置 query_band 所关联队列及估算内存限制等实现更为灵活的负载控制与资源管控。
query band 目前支持行为有:关联资源池(respool)、队列内优先级(priority)。
1. query band 关联队列内优先级
query_band 支持关联作业优先级,支持高中低(High/Medium/Low)三个优先级,同时提供 Rush 作为特殊优先级,默认优先级为 Medium。
队列内排队优先级三种情况:
静态负载管理场景下,CN 并发不足时,触发 CN 全局队列排队,CN 全局队列为优先级队列。
动态负载管理场景下,DN 内存不足时,触发 CCN 全局排队,CCN 全局队列为优先级队列。
资源池并发或内存不足时,触发资源池排队,资源池队列为优先级队列。
如果业务未配置 query band 或用户未将 query band 关联行为时,作业会默认使用用户关联队列和队列内优先级。
从上述的介绍可以理解为,query band 可以设置任务在资源池中的执行顺序,优先级高的任务优先执行;如果出现资源不足等不能立刻执行任务的情况,则会触发排队优先级,优先级高的优先在队列中排队。
2. query band 关联资源池
作业执行时,若 query_band 指定了队列,则使用 query_band 关联的队列,否则使用用户关联的队列。
五、原理梳理
六、资源池队列阻塞告警在 DMS 中的实现
1. 资源池队列阻塞的判定
通过上述的介绍,我们已经了解了资源负载管理的基本原理,那么如何判定资源池队列阻塞呢?影响作业在资源池运行的要素有并发数、CPU 和内存等资源限制,也可能是由于集群状态异常导致的,下面我们将从以下两种情况进行分析。
第一种情况,如果并发或 CPU 等资源不够用,会出现资源池队列排队,但并非阻塞的状态,因为作业结束后,处于队首的作业会开始运行,那么资源池队列中的作业是动态变化的。
第二种情况,如果用户下发的作业就是特别的复杂,运行时间可能有几十分钟,那么在默认情况下,资源池队列中的作业始终不变,但是如果用户在调整作业优先级之后,作业能够正常运行,也不能说明资源池是阻塞的。
结合以上两种情况,我们结合资源池队列中作业的状态,以及不同优先级作业在资源池的运行情况判断资源池是否阻塞。首先我们将范围限定在默认资源池中,因为默认资源池是开启资源管理功能后又系统创建,代表系统的状态;其次资源池执行任务异常,必定引起资源池队列出现排队现象,且处于队首的任务始终不变,排队时间增加;并且运行在资源池上所有优先级的作业都不能正常下发。
总结下来就是,在一定时间内,集群默认资源池队列中处于各个优先级的作业不变即可判定为资源池队列发生阻塞。
2. 资源池队列阻塞告警的实现
资源池队列阻塞告警是基于 DMS 原有告警功能进行实现,实现流程依旧是分为数据上报与采集—>告警判断—>上报告警。信息采集线程会将资源池中任务的状态实时上报,形成原始指标落盘,然而我们需要判断不同优先级的任务排队情况,直接用原始数据进行处理会比较繁琐,所以我们借助一个定时任务,定时采集原始指标数据,并进行整合、转置,最后我们用整合后的数据,判断是否发生了资源池阻塞。
图片中的 20 分钟为默认时间,用户可以根据在自定义配置判断的时长。
3. 资源池队列阻塞的原因
资源池并发数
如果用户设置的资源池并发数过小,会出现资源池队列排队,此时应当调大资源池并发数量。
资源不足
重新分配资源池的各项资源,包括 CPU、内存、磁盘等。
还有其他的场景和解决方式,可以参考下方的博客。
参考文章
GaussDB(DWS) 数据库智能监控系统告警框架上线啦!
GaussDB(DWS) 负载管理简单介绍以及作业排队处理方法
玩转GaussDB(DWS)资源负载管理系列 — DWS资源负载管理的原理
版权声明: 本文为 InfoQ 作者【华为云开发者社区】的原创文章。
原文链接:【http://xie.infoq.cn/article/9040c10f1b15d541275cbc754】。文章转载请联系作者。
评论