文档

资源组管理

更新时间:

云原生数据仓库 AnalyticDB PostgreSQL 版提供的资源组管理功能,支持绑定数据库账号到资源组,并为资源组内的查询设置最大并发事务数、CPU使用率和内存占比等,可以使资源变得弹性,获得更高的查询速度。

版本限制

  • 通过控制台开启或关闭资源组管理:

    内核版本为v6.6.1.0及以上的AnalyticDB PostgreSQL 6.0版实例,可以通过控制台开启或关闭资源组管理。

  • 通过提交工单开启或关闭资源组管理:

    • 内核版本为v6.6.1.0以下的AnalyticDB PostgreSQL 6.0版实例,需要提交工单开启或关闭资源组管理。

    • AnalyticDB PostgreSQL 7.0版实例,需要提交工单开启或关闭资源组管理。

  • AnalyticDB PostgreSQL 7.0版实例暂时无法通过控制台使用资源组,仅支持通过SQL语句使用资源组。

资源组(Resource Group)简介

云原生数据仓库 AnalyticDB PostgreSQL 版支持使用资源组(Resource Group)对数据库进行资源管理,相对于使用资源队列(Resource Queue)管理资源的方式具有更精细化、管理资源类别更全面的优势。资源组管理与资源队列管理不能同时使用,仅能使用一个,开启资源组管理之后资源队列自动失效。关于资源队列的更多介绍,请参见使用Resource Queue(资源队列)进行负载管理

在使用资源组进行资源管理时,可以为资源组绑定一个或多个数据库账号,并针对每个资源组单独设置其特定的CPU、内存和并发限制等,来管理各个资源组绑定账号提交的查询,但SET、RESET和SHOW命令不受资源组配置限制。

6.0资源组

AnalyticDB PostgreSQL 6.0版资源组支持配置的资源类别如下:

参数

描述

取值

CONCURRENCY

资源组内允许的最大并发事务数(并行运行的查询数)。

默认值:50,非必填,

取值范围:1-max_connections。该参数具体内容,请参见性能参数调优

CPU_RATE_LIMIT

用于定义在多个资源组竞争CPU资源时的CPU分配比例。

无默认值,必填,

取值范围:0-100,

各个资源组的取值之和不超过100。

MEMORY_LIMIT

资源组内存占总内存的百分比。具体内容,请参见6.0资源组内存管理

默认值:0,非必填,

取值范围:0-100,

各个资源组的取值之和不超过100。

MEMORY_SHARED_QUOTA

定义了资源组内部共享内存占所有内存的比例。具体内容,请参见6.0资源组内存管理

默认值:80,非必填,

取值范围:0-100。

MEMORY_SPILL_RATIO

内存敏感事务的内存使用阈值(算子落盘阈值)。

默认值:0,非必填

取值范围:0-100。

6.0资源组内存管理

数据库按照各个资源组设置的memory_limit在各个资源组之间预留内存资源,如果各个资源组的memory_limit总和小于100,数据库会将剩余未预留的内存分配给资源组全局共享内存池。数据库以先到先得的方式为事务分配资源组全局共享内存。

每个资源组预留的内存池内部,资源组按照MEMORY_SHARED_QUOTA设定每个资源组内用于固定预留部分和共享部分的内存比例。如果MEMORY_SHARED_QUOTA参数设置为100%,那么资源组内部的所有内存都将被视为共享内存,所有任务都可以使用这块内存;如果MEMORY_SHARED_QUOTA参数值小于100%,系统将根据设定的比例将内存划分为固定部分和共享部分,固定部分是每个任务独占的内存,而共享部分是所有任务共享的内存空间。AnalyticDB PostgreSQL 6.0版资源组内存管理机制详解如下图所示:

image.png

云原生数据仓库 AnalyticDB PostgreSQL 版资源组进行内存管理时,将数据库机器的内存池划分成组内固定、组内共享和全局共享。在执行查询时会首先使用组内固定部分的内存,在组内固定部分的内存不够时,会申请组内共享部分的内存值。在组内共享部分也耗尽时,会申请全局共享部分的内存值,当全局共享部分的内存也不足时,则会报OOM的错误终止查询。具体内容如下图所示:

image.png

当数据库查询同时满足以下条件时,对应查询将由于内存不足导致失败:

  • 没有可用的组内共享内存。

  • 没有可用的全局共享内存。

  • 该事务请求额外的内存。

image.png

在实际使用中,一般尽量让组内固定部分的内存覆盖大部分查询所需要的内存,这样在流量高峰到来时可以支持尽可能多的查询并行执行。在业务查询突发需要申请大内存时,也会有足够的查询共享部分内存以供业务正常执行。

6.0资源组并发管理

  • 当进入系统的查询达到所属资源组的并发数上限后,该资源组新进入的查询需要进行等待。并发限制排队时遵循先进先出的原则。

  • 当提交的查询由于达到并发限制而进行等待时,查看pg_stat_activity视图时对应查询处于waiting状态,并且waiting_reason为group。

6.0资源组CPU管理

云原生数据仓库 AnalyticDB PostgreSQL 版资源组支持管理各个组的CPU分配比例,是一种允许抢占的CPU管理方式,数据库按照各个group设定的CPU_RATE_LIMIT值的比例进行CPU时间片分配。如果某资源组设置了较高的CPU_RATE_LIMIT值,那么在竞争CPU时,该资源组将获得较多的CPU时间片,从而更多的执行任务,反之则限制其对CPU资源的使用。同时,资源管理功能支持CPU抢占,如果一个资源组在执行任务而其余资源组没有任务时,那么这个资源组就会占有全部CPU资源。

  • 在两个资源组都很繁忙时,使用CPU_RATE_LIMIT为40创建的资源组将分配两倍于使用CPU_RATE_LIMIT 为20创建的资源组的CPU资源。

  • 在CPU_RATE_LIMIT为40的资源组无查询进入时,CPU_RATE_LIMIT为20的资源组可以使用接近全部的CPU资源。

6.0落盘管理

云原生数据仓库 AnalyticDB PostgreSQL 版源组支持对查询的落盘阈值进行管理。在云原生数据仓库 AnalyticDB PostgreSQL 版中内存密集型算子执行过程可能会产生大量中间临时结果,会需要临时溢出到磁盘,通过调整MEMORY_SPILL_RATIO来增加或减少溢出。因此只有需要产生大量中间临时结果的操作类型受此控制。仍有很多操作是无法溢出到磁盘上的,这些操作会继续占用内存,即使内存使用超过上限值,内存仍有可能增加。

  • 当MEMORY_SPILL_RATIO大于0时,算子落盘阈值由MEMORY_SPILL_RATIO决定。当敏感事务内存达到此阈值,将被溢出到磁盘。

  • 当MEMORY_SPILL_RATIO等于0时,算子落盘阈值由statement_mem决定。statement_mem的详细信息,请参见性能参数调优

当集群负载大、内存资源紧张时,调小所在资源组的memory_spill_ratio,让内存密集型算子如hashagg、join、sort等在运算过程中更多地进行落盘运算,以减少内存使用。当集群负载小、内存资源充足时,调大所在资源组的memory_spill_ratio,让落盘阈值提高,更多地在内存中进行计算,以提高查询的执行效率。

7.0资源组

AnalyticDB PostgreSQL 7.0版资源组支持配置的资源类别如下:

参数

描述

取值

CONCURRENCY

资源组内允许的最大并发事务数(并行运行的查询数)。当进入系统的查询达到所属资源组的并发数上限后,该资源组新进入的查询需要进行等待,等待队列无长度限制。并发限制排队时遵循先进先出的原则。

当提交的查询由于达到并发限制而进行等待时,我们查看pg_stat_activity视图中会发现对应查询处于waiting状态,且waiting_reason为group。

默认值:50,非必填,

取值范围:1-max_connections。该参数具体内容,请参见性能参数调优

CPU_MAX_PERCENT

资源组的CPU利用率上限值。

无默认值,必填,

取值范围:0-100,

没有各个资源组的取值之和不超过100的限制。

CPU_WEIGHT

资源组的CPU分配权重。

默认值50,非必填,

取值范围:0-500。

MEMORY_LIMIT

资源组使用的内存总和目标值。

取值为int,单位MB。

默认值-1,非必填,代表单个查询使用的内存上限值为statement_mem,配置非-1的值之后,单个query能够使用的内存是max(memory_limit/concurrency, statement_mem)。

取值范围:大于0,小于gp_vmem_protect_limit参数。

statement_mem和gp_vmem_protect_limit参数具体内容,请参见性能参数调优

MIN_COST

最低受控于该资源组的优化器代价,优化器代价低于该cost将不受该group控制,使用全局资源。

默认值为0,代表全部限制,非必填,

取值范围:0-2147483647。

7.0资源组内存管理

AnalyticDB PostgreSQL 7.0版资源组结合MEMROY_LIMIT配置,以及statement_mem、gp_resgroup_memory_query_fixed_mem参数来管理资源组的内存使用。

  • 当gp_resgroup_memory_query_fixed_mem被配置为大于0的值后,单个查询能够使用的内存上限被限定为对应值;

  • 当gp_resgroup_memory_query_fixed_mem被配置为0(默认值)时,资源组结合statement_mem和MEMORY_LIMIT确定单个查询能够使用的内存值,具体如下:

    • 当所在资源组的MEMROY_LIMIT设置为-1时,资源组管理的单个查询能够使用的内存上限被限定为statement_mem。

    • 当所在资源组的MEMORY_LIMIT设置大于-1的值时,资源组管理的单个查询能够使用的内存上限被限定为max(memory_limit/concurrency, statement_mem),即MEMORY_LIMIT除以并发值的结果,与statement_mem中的最大值。例如,在数据库中有一个叫做etl的资源组,它的MEMORY_LIMIT设置成了2.0 GB,并发值设为5。所以默认情况下,单个查询预计能够使用的内存值为400 MB。考虑如下场景:

  • 用户etl1提交了查询Q1,并且session级别配置了gp_resgroup_memory_query_fixed_mem为800 MB(set gp_resgroup_memory_query_fixed_mem='800MB'),statement_mem设置为900MB,Q1最高能够占用800MB的内存。

  • 用户etl2提交了查询Q2,没有配置session级别配置gp_resgroup_memory_query_fixed_mem参数,statement_mem设置为300 MB,小于400 MB,所以Q2提交到系统,并占用了400 MB的内存。

  • 用户etl3提交了查询Q3,没有配置session级别配置gp_resgroup_memory_query_fixed_mem参数,statement_mem设置为700 MB,大于400 MB,所以Q3提交到系统,并占用了700 MB的内存。

7.0资源组CPU管理

AnalyticDB PostgreSQL 7.0版资源组基于CPU_MAX_PERCENT管理每个资源组能够使用的CPU利用率最大值,基于CPU_WEIGHT管理资源组在各个资源组之间的分配比例。会按照各个资源组的CPU_WEIGHT比例去分配CPU时间片,同时保证各个资源组的CPU利用率不超过设定的CPU_MAX_PERCENT值。

例如,数据库中存在rg1和rg2两个group,rg1的CPU_MAX_PERCENT设定为30,CPU_WEIGHT设定为100;rg2的CPU_MAX_PERCENT设定为60,CPU_WEIGHT设定为50。

  1. 只有rg1中存在活跃查询,rg2中不存在活跃查询。此时rg1的CPU利用率会达到30%,rg2的CPU利用率会达到60%。

  2. rg1和rg2中同时存在活跃查询。此时数据库会将CPU时间片按照100:50的优先级分配,直至某个资源组的CPU利用率达到了对应的CPU_MAX_PERCENT的限制值。例如,rg1的CPU利用率达到了30%,在此之后即使两者的WEIGHT依然是100:50的关系,也会优先向rg2分配,以确保rg1的CPU利用率不超过30%。

开启资源组管理

通过控制台开启资源组管理,即切换资源管理模式由资源队列变为资源组,切换过程中会重启实例,并存在大约5分钟实例不可用,请合理规划时间,避免您的业务受到影响。关于开启资源组管理的方式,请参见版本限制

  1. 登录云原生数据仓库AnalyticDB PostgreSQL版控制台
  2. 在控制台左上角,选择实例所在地域。
  3. 找到目标实例,单击实例ID。
  4. 在左侧导航栏,单击工作负载管理

  5. 单击开启资源组管理,并在弹窗中单击确定

开启资源组管理功能后,系统会自动创建一个default_group资源组。在监控与报警 > 实例监控页面的资源组监控页签可以查看所有资源组监控信息,以及各个segment的CPU和内存使用等。

新增资源组

开启资源组管理后,您可以通过控制台或后台执行SQL的方式新增资源组。

重要
  • AnalyticDB PostgreSQL 6.0版内部预留了admin_group资源组用于管理数据库本身的系统负载。

  • AnalyticDB PostgreSQL 6.0版实例中所有资源组的CPU总和与Memory总和均为100,admin_group资源组预留的CPU和Memory为10,因此其他资源组(新增资源组和default_group资源组)的CPU值总和与Memory值总和不能超过90。

  • AnalyticDB PostgreSQL 7.0版数据库存在默认的三个资源组,admin_groupsystem_group用于管控数据库本身的系统负载,default_group用于其他用户默认使用。

控制台操作

  1. 工作负载管理页面,单击新增资源组

  2. 按照资源组(Resource Group)简介章节中的参数限制填写参数,并单击保存新增

SQL操作

CREATE RESOURCE GROUP <group_name> WITH (group_attribute=value [, ... ])

对于AnalyticDB PostgreSQL 6.0版group_attribute包含:

CPU_RATE_LIMIT=integer
MEMORY_LIMIT=integer
[ CONCURRENCY=integer ]
[ MEMORY_SHARED_QUOTA=integer ]
[ MEMORY_SPILL_RATIO=integer ]

对于AnalyticDB PostgreSQL 7.0版group_attribute包含:

CPU_MAX_PERCENT=integer
[CPU_WEIGHT=integer ]
[ CONCURRENCY=integer ]
[ MEMORY_LIMIT=integer ]
[ MIN_COST=integer ]

查看资源组配置

新增资源组后,您可以通过控制台或后台执行SQL的方式查看资源组配置。

控制台操作

工作负载管理页面的资源组配置区域,查看实例中所有资源组配置。

SQL操作

使用如下SQL查看资源组配置:

SELECT * FROM gp_toolkit.gp_resgroup_config;

修改资源组配置

您可以通过控制台或后台执行SQL的方式修改资源组配置。

控制台操作

  1. 工作负载管理页面,单击资源组列表上方的编辑

  2. 根据业务需求,修改资源组的并发数、CPU使用或内存百分比等,并单击保存

SQL操作

对于AnalyticDB PostgreSQL 6.0版,仅数据库初始账号支持修改除admin_group资源组外其他所有资源组配置,普通账号无法操作。

ALTER RESOURCE GROUP <group_name> 
SET CONCURRENCY|CPU_RATE_LIMIT|MEMORY_LIMIT|MEMORY_SHARED_QUOTA|MEMORY_SPILL_RATIO <value>;

示例如下:

  • 修改test资源组的并发数为30。

    ALTER RESOURCE GROUP test SET CONCURRENCY 20;
  • 修改test_pg1资源组的CPU使用率为20。

    ALTER RESOURCE GROUP test_pg1 SET CPU_RATE_LIMIT 20;

对于AnalyticDB PostgreSQL 7.0版,仅数据库初始账号支持修改除admin_groupsystem_group资源组外其他所有资源组配置,普通账号无法操作。

ALTER RESOURCE GROUP <group_name> 
SET CPU_MAX_PERCENT|CPU_WEIGHT|CONCURRENCY|MEMORY_LIMIT|MIN_COST <value>;

示例如下:

  • 修改test资源组的并发数为30。

    ALTER RESOURCE GROUP test SET CONCURRENCY 20;
  • 修改test_pg1资源组的CPU利用率上限为20。

    ALTER RESOURCE GROUP test_pg1 SET CPU_MAX_PERCENT 20;

绑定数据库账号

您可以通过控制台或后台执行SQL的方式为资源组绑定数据库账号。如何创建数据库账号,请参见创建数据库账号

  • 每个资源组可以绑定一个或多个数据库账号,但每个账号只能绑定一个资源组。

  • 数据初始账号默认绑定default_group资源组。

  • 没有绑定资源组的数据库账号,会默认绑定default_group资源组。

控制台操作

  1. 工作负载管理页面的分配资源组区域,单击目标资源组卡片上的图片.png按钮。

  2. 选择需要角色(数据库账号),并单击确定

SQL操作

仅数据库初始账号支持绑定资源组,普通账号无法操作。将数据库账号绑定到指定资源组,语法如下:

  • 为已有数据库账号绑定资源组。

    ALTER ROLE <user_name> RESOURCE GROUP <group_name>;
  • 新建数据库账号时绑定资源组。

    CREATE ROLE <user_name> WITH LOGIN RESOURCE GROUP <group_name>;

删除资源组

您可以通过控制台或后台执行SQL的方式删除资源组。

控制台操作

工作负载管理页面,单击目标资源组操作列的删除,并单击确定

SQL操作

仅数据库初始账号支持删除资源组,数据库普通账号无法操作。

版本

参数

是否能被删除

AnalyticDB PostgreSQL 6.0版

admin_group

default_group

AnalyticDB PostgreSQL 7.0版

admin_group

default_group

system_group

DROP RESOURCE GROUP <group_name>;

关闭资源组管理

如果您需要将资源管理模式切换为资源队列,您可以通过控制台关闭资源组管理。关闭过程中会重启实例,并存在大约5分钟实例不可用,请合理规划时间,避免您的业务受到影响。关于关闭资源组管理的方式,请参见版本限制

  1. 登录云原生数据仓库 AnalyticDB PostgreSQL版控制台

  2. 在控制台左上角,选择实例所在的地域。

  3. 找到目标实例,单击实例ID。

  4. 在左侧导航栏,单击工作负载管理,单击关闭资源组管理

  • 本页导读 (1)