一文详述DMS资源池队列阻塞告警及原理
摘要: 本文主要对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资源负载管理的原理
一文详述DMS资源池队列阻塞告警及原理的更多相关文章
- java并发编程学习: 阻塞队列 使用 及 实现原理
队列(Queue)与栈(Stack)是数据结构中的二种常用结构,队列的特点是先进先出(First In First Out),而Stack是先进后出(First In Last Out),说得通俗点: ...
- Java并发编程-阻塞队列(BlockingQueue)的实现原理
背景:总结JUC下面的阻塞队列的实现,很方便写生产者消费者模式. 常用操作方法 常用的实现类 ArrayBlockingQueue DelayQueue LinkedBlockingQueue Pri ...
- Java并发包源码学习系列:阻塞队列BlockingQueue及实现原理分析
目录 本篇要点 什么是阻塞队列 阻塞队列提供的方法 阻塞队列的七种实现 TransferQueue和BlockingQueue的区别 1.ArrayBlockingQueue 2.LinkedBloc ...
- 一文搞懂AQS及其组件的核心原理
@ 目录 前言 AbstractQueuedSynchronizer Lock ReentrantLock 加锁 非公平锁/公平锁 lock tryAcquire addWaiter acquireQ ...
- [从今天开始修炼数据结构]队列、循环队列、PriorityQueue的原理及实现
[从今天开始修炼数据结构]基本概念 [从今天开始修炼数据结构]线性表及其实现以及实现有Itertor的ArrayList和LinkedList [从今天开始修炼数据结构]栈.斐波那契数列.逆波兰四则运 ...
- 【转载】阻塞队列之三:SynchronousQueue同步队列 阻塞算法的3种实现
一.SynchronousQueue简介 Java 6的并发编程包中的SynchronousQueue是一个没有数据缓冲的BlockingQueue,生产者线程对其的插入操作put必须等待消费者的移除 ...
- Callable、Future&阻塞队列&阻塞栈
Callable.Future 简单应用 在Java5之前,线程是没有返回值的,常常为了“有”返回值,破费周折,而且代码很不好写.或者干脆绕过这道坎,走别的路了.现在Java终于有可返回值的任务( ...
- FreeRTOS官方翻译文档——第二章 队列管理
2.1 概览基于 FreeRTOS 的应用程序由一组独立的任务构成——每个任务都是具有独立权限的小程序.这些独立的任务之间很可能会通过相互通信以提供有用的系统功能.FreeRTOS 中所有的通信与同步 ...
- 阻塞队列之三:SynchronousQueue同步队列 阻塞算法的3种实现
一.SynchronousQueue简介 Java 6的并发编程包中的SynchronousQueue是一个没有数据缓冲的BlockingQueue,生产者线程对其的插入操作put必须等待消费者的移除 ...
- RabbitMQ消息队列阻塞导致服务器宕机
最近工作中存储服务器由于压力太大无法及时消费消息.这个过程中,导致RabbitMQ意外挂掉,无法访问.下面是部分问题分析过程. 麒麟系统服务器分析 1.服务器异常信息: [root@localhost ...
随机推荐
- 【源码解读(二)】EFCORE源码解读之查询都做了什么以及如何自定义批量插入
引言 书接上回,[源码解读(一)]EFCORE源码解读之创建DBContext查询拦截,在上一篇文章中,主要讲了DBContext的构造函数,以及如何缓存查询方法提升查询性能,还有最重要的拦截查询,托 ...
- 【Windows 开发环境配置】NVIDIA 篇
CUDA 从CUDA Toolkit Archive下载相应版本的离线安装包,这里以11.7为例. 打开安装包,在安装选项选择自定义模式,点击下一步. 在自定义安装选项中,仅选择CUDA组件(其中Ns ...
- python之继承的方法重写
目录 普通方法 方法重写super().xxx() 我们在python之继承及其实现方法中已经学会了打印子类在父类继承的属性 那么我们怎么打印出子类中特有的属性呢 普通方法 我们当然可以在子类中添加新 ...
- 文心一言 VS 讯飞星火 VS chatgpt (141)-- 算法导论12.1 1题
一.用go语言,对于关键字集合(1,4,5,10,16,17,21),分别画出高度为 2.3.4.5和6的二又搜索树. 文心一言: 以下是用Go语言为给定的关键字集合(1, 4, 5, 10, 16, ...
- IP交付标准总结。
RTL顶层代码,IP内部需要IP自己完成连接并保证正确,CM/PLL/MCU/SRAM/TX/RX内部模块不接受外部进行拼接,DFT内部自己处理.IP用到的宏,名称功能文档要说明清楚.优先使用硬核IP ...
- React Hooks 钩子特性
人在身处逆境时,适应环境的能力实在惊人.人可以忍受不幸,也可以战胜不幸,因为人有着惊人的潜力,只要立志发挥它,就一定能渡过难关. Hooks 是 React 16.8 的新增特性.它可以让你在不编写 ...
- vue-test --------模板引用
<template> <input type="text" v-model.lazy="message"> <div>{{m ...
- Colaboratory使用教程
Google Colaboratory 是一个 Google 研究项目,旨在帮助传播机器学习培训和研究成果.它是一个 Jupyter 笔记本环境,不需要进行任何设置就可以使用,并且完全在云端运行.同时 ...
- 剑指Offer43:1~n整数中1出现的次数(数位DP)
解题思路:数位DP.dp数组为dp[pos][sum]表示当前位以下还有pos个可变位并且当前位以及它的最高位出现了sum个1的dp值.因为数的取值为2^31所以,数组开dp[10][10]就够了. ...
- 【内核】ELF 文件执行流程
# ELF 文件分类 Linux中,ELF文件全称为:Executable and Linkable Format,主要有三种形式,分别是: 可执行文件 动态库文件(共享文件 .so) 目标文件(可重 ...