资源池
背景信息
GaussDB(DWS)资源负载管理的核心是资源池,资源池提供多种属性可以控制内存、IO和CPU资源的控制,基于优先级调度机制实现资源管理和分配,对用户业务提供资源负载管理服务。
基于资源池的资源负载管理的范围包括:并发管理、优先级调度。
资源池概述(Resource Pools)
资源池是一种配置机制,用于对主机资源进行划分。资源池指定资源和并发队列属性,业务作业通过绑定资源池,来设置业务作业能够利用到的资源。
数据库管理员需要根据不同的业务类型,将资源池绑定至对应的控制组。
基于资源池的负载管理
资源负载管理的工作原理如图1所示。
资源池通过绑定控制组进行实现资源的分配,作业的优先级和其关联的资源池的资源数量有关。一般情况下,我们认为作业关联到的资源池拥有的资源数量越多,则其优先级越高,因为该作业能够拥有更多的资源去执行。
在示例中:
- 作业A的优先级高于作业C和D,因为作业A关联的资源池拥有的资源最多。
- 作业A和作业B在同一资源池中,两者优先级相同,发生资源竞争时,平分资源池1的系统资源。
如果要调整作业的优先级,只要切换其绑定的资源池就可以了。
任务流程
default_pool
在开启了资源负载管理功能之后,default_pool是由系统自动创建的,当一个会话或者用户没有指定关联的资源池时,都会被默认关联到default_pool。default_pool默认绑定DefaultClass:Medium控制组,并且不限制所关联的业务的并发数。
default_pool的详细属性参见表2:
属性 |
属性值 |
说明 |
---|---|---|
respool_name |
default_pool |
资源池名称。 |
mem_percent |
100 |
最大占用内存百分比。 |
cpu_affinity |
-1 |
CPU亲和性,保留参数。 |
control_group |
DefaultClass:Medium |
资源池关联的控制组。 |
active_statements |
-1 |
资源池允许的最大并发数。-1为不限制并发数量。 |
max_dop |
1 |
开启SMP后,算子执行的并发度,保留参数。 |
memory_limit |
8GB |
内存使用上限,保留参数。 |
parentid |
0 |
父资源池OID。 |
io_limits |
0 |
每秒触发IO的次数上限。行存单位是万次/s,列存是次/s。0表示不控制。 |
io_priority |
None |
IO利用率高达90%时,重消耗IO作业进行IO资源管控时关联的优先级等级,包括三档可选:Low、Medium和High,分别对应限制iops为该作业原始触发数值的25%、50%及80%。None表示不控制。 |
- GaussDB(DWS)不允许对default_pool参数进行修改。
- default_pool资源池关联的业务并发量会受到全局并发参数max_active_statements的影响。max_active_statements是指允许在某一CN上执行的最大查询。
操作过程
创建资源池
开启资源负载管理之后,仅使用默认资源池并不能满足业务对资源负载管理的诉求,必须根据需要创建新的资源池,对系统资源进行重分配,来满足实际业务对系统资源精细管理的需要。
使用或具有DBA权限的用户连接数据库后,就可以使用相关SQL语句创建和管理资源池。详细语法信息请参考CREATE RESOURCE POOL、ALTER RESOURCE POOL和DROP RESOURCE POOL。
- 创建一个关联默认控制组的资源池。如果在创建资源池的时候不指定所关联的控制组,则该资源池会被关联到默认控制组(DefaultClass控制组下的"Medium" Timeshare控制组)。
1
CREATE RESOURCE POOL respool1;
当结果显示为如下信息,则表示创建成功。
CREATE RESOURCE POOL
- 创建一个关联到"Rush" Timeshare控制组的资源池。
1
CREATE RESOURCE POOL respool2 WITH (control_group='Rush');
当结果显示为如下信息,则表示创建成功。
CREATE RESOURCE POOL
- control_group取值区分大小写,指定时要使用单引号''。
- 只可以指定Timeshare控制组代表的字符串,即"Rush"、"High"、"Medium"或"Low"其中一种,如control_group的字符串为"High";代表资源池指定到DefaultClass控制组下的"High" Timeshare控制组。
- 创建一个具有并发限制的资源池。在创建资源池的时候可以通过制定ACTIVE_STATEMENTS限制关联在其上的并发任务数,当并发数量超过所设定的ACTIVE_STATEMENTS上限时,会启用排队机制,从而实现任务并发数控制。
1
CREATE RESOURCE POOL respool3 WITH (active_statements=5);
当结果显示为如下信息,则表示创建成功。
CREATE RESOURCE POOL
- active_statements字段的默认值为 10,代表该资源池上的语句最多可以有10个并发。
- 其取值范围为 -1 ~ INT_MAX, 当为-1时,代表不受限制。
- 创建一个具有内存限制的资源池。在创建资源池时,可以通过MEM_PERCENT参数来限制该资源池可以使用的最大内存。MEM_PERCENT的取值范围为0-100的整数。
1
CREATE RESOURCE POOL respool4 WITH (MEM_PERCENT=20);
当结果显示为如下信息,则表示创建成功。
CREATE RESOURCE POOL
设置资源池使用的内存大小为可用内存大小的20%。
管理资源池
在完成创建资源池后,管理员经常会根据需要对资源池进行调整配置以及删除已经废弃的资源池。
管理资源池,主要包括以下方面:
- 修改资源池的属性。
- 修改资源池关联的控制组。
1
ALTER RESOURCE POOL respool1 WITH (control_group="Rush");
当结果显示为如下信息,则表示修改成功。
ALTER RESOURCE POOL
- 修改资源池的并发量。
1
ALTER RESOURCE POOL respool1 WITH (ACTIVE_STATEMENTS=15);
当结果显示为如下信息,则表示修改成功。
ALTER RESOURCE POOL
- 修改资源池的内存限制。
1
ALTER RESOURCE POOL respool1 WITH (MEM_PERCENT=20);
当结果显示为如下信息,则表示修改成功。
ALTER RESOURCE POOL
更多使用方式请参考ALTER RESOURCE POOL。
- 修改资源池关联的控制组。
- 删除一个资源池。
1 2
DROP RESOURCE POOL respool1; DROP RESOURCE POOL
局部并发管理
局部并发量,又称资源池并发量,是指各个资源池上允许运行的最大作业并发量。资源池并发量是有资源池参数“ACTIVE_STATEMENTS”来限定的。
一般而言,全局并发量应该大于局部并发量之和。如果全局并发量小于局部并发量,则实际业务执行时的并发量不大于设置的全局并发量。
资源池并发量可以在创建资源池时指定,也可以在资源池创建成功后调整。
- 资源池创建时指定:
1
CREATE RESOURCE POOL pool1 WITH (ACTIVE_STATEMENTS=5);
- 资源池创建成功后调整:
1
ALTER RESOURCE POOL pool1 WITH (ACTIVE_STATEMENTS=3);
资源池使用并发点数的计数方式来计算可执行的并发数量,并发点数计算公式为
作业使用点数:active_points = (query_mem/respool_mem) * active_statements * 100
资源池总点数:total_points = active_statements * 100
单位点数: 100
- 作业不使用query_mem时会使用单位点数。
- 当资源池总点数耗尽后,会触发排队操作,队列满足先进先出。
- MAX_DOP对快车道并发进行限制,取值范围为-1~ INT_MAX,默认值为-1,表示不管控。
- ACTIVE_STATEMENTS取值范围为 -1 ~ INT_MAX, 默认值为10,建议使用该默认值。当取值设置为0或者-1时,慢车道并发不受ACTIVE_STATEMENTS限制。
- MEM_PERCENT取值范围为0~100,当取值设置为0时,慢车道并发不受MEM_PERCENT限制。
- 慢车道并发受ACTIVE_STATEMENTS和MEM_PERCENT限制,使用点数控制方式,总点数由ACTIVE_STATEMENTS决定。
- 当ACTIVE_STATEMENTS=-1或0时,total_points=90。
- 作业点数分为内存点数和并发点数,内存点数由作业估算内存决定,并发点数固定为100,内存点数和并发点数分别进行点数管控,总点数耗尽后,慢车道查询会触发排队操作,队列满足先进先出。
- 一般而言,全局并发量应该大于或者等于局部并发量之和。如果全局并发量小于局部并发量,则实际业务执行时的并发量不大于设置的全局并发量。
- 非自适应负载模式下复杂语句是指执行代价大于等于GUC参数parctl_min_cost值的语句。常用语句中,DDL语句和set语句因为执行代价小,并不受局部并发机制管理。
- 自适应负载模式下复杂作业是指,执行语句估算消耗的内存大于给定的阈值(当前为32MB)的语句。
- enable_transaction_parctl=off情况下,存储过程和事务不受局部并发控制。
- enable_transaction_parctl=on情况下,若设置了transaction_pending_time>0,事务块语句和存储过程语句排队超过所设数值的时间后,无视当前资源情况强制执行。
- 内部逻辑触发语句不受局部并发控制,例如系统视图内部逻辑、gs_clean、CM等工具执行逻辑等。
- 内存和并发支持单独管控和联合管控,联合管控时需要内存和并发均满足下发条件时作业才能运行。
查看当前资源池的信息
- 不允许使用insert、update、delete、truncate操作资源负载管理的系统表pg_resource_pool,否则会导致通过不同CN查到的pg_resource_pool表的内容不一致。
- 不允许修改资源池的cpu_affinity属性。
- 查看某一用户所绑定的资源池。
1 2 3 4 5
SELECT rolrespool FROM PG_AUTHID WHERE rolname = 'rolename'; rolrespool -------------- default_pool (1 row)
- 查看当前集群中所有的资源池信息。
1
SELECT * FROM PG_RESOURCE_POOL;
respool_name | mem_percent | cpu_affinity | control_group | active_statements | max_dop | memory_limit | parentid | io_limits | io_priority --------------+-------------+--------------+---------------------+-------------------+---------+--------------+----------+-----------+------------- default_pool | 100 | -1 | DefaultClass:Medium | -1 | 1 | 8GB | 0 | 0 | None (1 row)
查看资源池的控制组信息
1 |
SELECT * FROM gs_control_group_info('resource_pool_a1');
|
name | class | workload | type | gid | shares | limits | rate | cpucores ---------------------+---------+-------------+-------+-----+--------+--------+------+---------- class_a:workload_a1 | class_a | workload_a1 | DEFWD | 87 | 30 | 0 | 0 | 0-3 (1 row)
属性 |
属性值 |
说明 |
---|---|---|
name |
class_a:workload_a1 |
class和workload名称 |
class |
class_a |
Class控制组名称 |
workload |
workload_a1 |
Workload控制组名称 |
type |
DEFWD |
控制组类型(Top、CLASS、BAKWD、DEFWD、TSWD) |
gid |
87 |
控制组id |
shares |
30 |
占父节点CPU资源的百分比 |
limits |
0 |
占父节点CPU核数的百分比 |
rate |
0 |
Timeshare中的分配比例 |
cpucores |
0-3 |
CPU核心数 |