更新时间:2025-07-30 GMT+08:00

DWS资源管理简介

数据库的系统资源(CPU资源、内存资源、IO资源和存储资源)是有限的,DWS在同时运行多种类型的业务(如数据加载、批量分析、实时查询等)时,各类型业务之间可能会竞争资源,从而出现资源性能瓶颈,导致吞吐量下降,造成整体性能低下。那么对系统的资源进行合理的分配,能避免产生资源不合理利用而导致的系统运行效率下降等问题,因此DWS提供了资源管理功能,用户可以根据自身业务将资源按需划分成不同的资源池,不同资源池之间资源互相隔离。

资源管理基本流程架构如图1 资源管理架构图所示,其中:

  • CPU、内存和I/O等计算资源:通过资源池进行管理。通过对资源的集中管控,可以有效避免“作业”占用资源的冲突,实现所有作业和谐共处,高优先级的作业优先执行,以及用户间的资源隔离。
  • 数据存储空间:通过创建用户时指定资源池和存储空间大小,用于限定不同用户可以使用的空间配额。
  • 内存管理可以实现节点级别的控制和作业级别的控制。执行作业时,根据资源池定义,进行CPU/内存/IO/存储的资源空间和隔离。
图1 资源管理架构图

视频介绍

功能介绍

资源管理功能由以下几部分组成:

  • 资源管理配置:包括资源管理开关、全局最大并发数。这里的全局最大并发数指的是单个CN上的最大并发数,如果关闭了资源管理功能,那么所有的资源管理功能将不可用。
  • 资源池:计算资源管理主要由资源池功能实现,对计算资源进行隔离和限制,防止异常SQL查询导致集群级异常。
  • 资源管理计划:按计划进行资源管理自动配置,应对复杂多变的负载场景,实现更为灵活的资源管理。
  • schema空间管理:从用户和schema两方面实现对存储空间的管理,防止磁盘满和数据库只读。管理面目前仅支持schema空间管理。
  • 异常规则:用于异常查询的识别和快速处理,防止“低质量SQL”长时间占用大量资源,导致其他查询阻塞或性能下降。
  • 查询过滤器:通过建立过滤规则提前进行语句拦截,解决因慢SQL导致整个集群系统性能变差甚至不可用等痛点问题。

约束与限制

  • 资源管理仅8.0.0及以上集群版本支持。
  • CPU专属限额仅8.1.3及以上集群版本支持。
  • 资源管理计划支持8.1.0.100及以上集群版本。

并发管理

GaussDB(DWS)提供了精细化的资源管理功能,在查询进行资源管理前,根据查询预期执行时间和资源消耗,将查询划分为执行时间长、资源消耗多的复杂查询和执行时间短、资源消耗少的简单查询。简单查询和复杂查询的划分和资源消耗相关,因此根据估算内存对查询进行划分:

  • 简单查询:估算内存小于32MB。
  • 复杂查询:估算内存大于等于32MB。

混合负载场景下,复杂查询可能会长时间占用大量资源,虽然简单查询执行时间短、消耗资源少,但是因为资源耗尽,简单查询不得不在资源池中等待复杂查询执行完成。为提升执行效率、提高系统吞吐量,GaussDB(DWS)的“短查询加速”功能,实现对简单查询的单独管理。在资源池页面“短查询配置”一栏,您可以通过开关键决定是否开启短查询加速功能。如果需要对简单语句并发数(默认值为-1,0 或-1表示不控制)进行修改,可选择打开短查询加速。

并发管理规则如下:

  • 短查询加速开启:复杂查询受资源池并发控制,简单查询受短查询并发控制。简单查询与复杂查询分开管理,简单查询无需与复杂查询竞争资源。
  • 短查询加速关闭:复杂查询和简单查询均受资源池并发控制,短查询并发控制无效。简单查询与复杂查询执行相同的资源管理操作(基于估算内存的查询划分一方面依赖估算内存的准确性,另一方面查询执行时间和CPU消耗可能与内存消耗不成正比,因此对于性能不敏感、业务明确的资源池可以通过关闭短查询加速实现对简单作业的资源管理和异常处理)。

虽然单个简单作业资源消耗少,但是大量简单作业并发运行还是会占用大量资源,因此短查询加速开启情况下,需要对简单查询进行并发管理(并发,即资源池中的最大查询并发数),并发管理作为运行前管理,用于限制查询并发运行的数量,通过限制查询并发数降低资源争抢,保证资源的有序高效利用。资源管理可能会影响查询性能,影响系统吞吐量,因此简单查询不进行资源管理,异常规则也不生效。

内存管理

内存资源,即资源池所占用的内存百分比。

内存管理的目的:防止数据库系统占用内存过高导致内存溢出(OOM)和实现资源池之间的内存隔离和限制。为满足这两个目的,资源管理从以下两方面进行内存管理:

  • 全局内存管理

    为防止数据库系统使用内存过大导致OOM,设置数据库系统全局内存上限(max_process_memory),对数据库全局内存进行管理。全局内存管理包含运行前管理和运行中管理,运行中管理防止实际使用内存超限,运行前管理防止查询执行过程中报错,具体如下:

    • 运行前管理:

      一方面慢车道运行的所有查询估算内存都会进行统计,另一方面数据库系统实际使用内存会进行反馈,当实际使用内存大于统计内存时,对统计内存进行调整。查询运行前,判断全局剩余内存能否满足查询运行,满足情况下查询可以直接运行,否则查询需要排队,等待其他查询释放资源后运行。运行前管理包含并发管理和运行前内存管理

    • 运行中管理:

      查询执行过程中实际使用的内存也会进行统计,查询在申请内存时判断内存使用是否超限,内存超限查询报错,已用内存释放。运行中管理包含运行中内存管理CPU管理空间管理异常规则

  • 资源池内存管理

    资源池内存管理属于专属限额的管理方式,即资源池分配多少内存就只能使用多少内存,空闲出来的内存其他资源池不能使用。

    资源池内存分配采用百分比方式,取值范围0~100。0表示资源池不进行内存管理,100表示资源池进行内存管理且可使用全局所有内存。

    所有资源池分配的内存百分比之和不能超过100。资源池内存管理仅管控慢车道查询,且只包含运行前管理,处理逻辑与全局内存运行前管理类似。资源池慢车道查询运行前,进行估算内存统计,当统计内存大于资源池内存时,查询需要排队,等待资源池内其他查询运行结束释放资源后才能运行。

CPU管理

目前支持“共享配额”和“专属限额”两种CPU管理方式:

  • CPU共享配额:在CPU系统繁忙的情况下,不同资源池按照共享配额配置分配CPU资源;在CPU系统空闲的情况下,该配置不生效。
  • CPU专属限额:限制资源池使用的CPU核数上限,无论CPU系统繁忙或者空闲,该资源池上的作业都无法突破该限额配置。

在资源池页面“资源配置”一栏,您可以修改当前资源池的CPU共享配额和专属限额。

共享配额和专属限额的管理方式各有优劣,共享配额的管理方式可以实现CPU资源的充分利用,但是资源池之间隔离不彻底,可能影响查询性能;专属限额的管理方式可以实现CPU资源的绝对隔离,但是在资源池CPU资源空闲时,会造成资源的浪费。