1.ADB PG实例的资源的定义
CPU
内存
IO
并发连接
查询计划
2.资源管理方案
资源队列(Resource Queue)
资源组(Resource Group)
- 并发连接数被占满,无法接受连接
- 内存超过可用内存范围,进程被杀死
- IO带宽争用导致查询合写入性能下降
3.资源隔离:资源队列技术介绍
资源队列能够对数据库的CPU、内存等资源进行限制,对多租户资源限制、保障数据库稳定运行具有一定的作用。
支持进行四种类型的资源限制:并发限制、CPU限制、内存限制和查询计划限制。
MEMORY_LIMIT:队列中所有查询所使用的内存的量。例如,对ETL查询设置2GB的MEMORY_LIMIT,这样每个Segment里的ETL查询最多使用2GB的内存。
ACTIVE_STATEMENTS:队列中槽位的数量;一个队列中最大可并行数,当所有槽位都占用时,新的查询必须等待。默认每个查询使用等量的内存。
PRIORITY:查询使用的相对CPU使用量,可以设置为以下级别:LOW,MEDIUM,HIGH和MAX。默认级别是MEDIUM,查询优先权的机制会监控系统中所有正在运行的查询的CPU使用量,并根据其优先权别来调整其CPU使用量。例如,你可以为执行资源队列设置MAX优先权,为其他查询设置MEDIUM优先权,确保执行查询可以获得比较多的CPU资源。
MAX_COST、MIN_COST:查询计划消耗限制。数据库优化器会为每个查询结算消耗,如果该消耗超过了资源队列所设定的MAX_COST的值,该查询就会被拒绝。
4.资源隔离:CPU管理
例如,管理员创建三个资源队列:adhoc用于业务分析师提交的正在进行的查询,reporting用于计划的报表任务,而executive用于行政用户角色递交的查询。由于分析师可能临时提交查询,而这些查询的资源需求是不可预测的,管理员想要确保计划的报表任务不会受到这类查询的严重影响。还有,管理员想要确保行政角色递交的查询会被分配相当份额的CPU。相应地,资源队列的优先权被设置如下:
5.资源隔离:内存管理
队列主要是对内存资源进行分配和限制。所有运行在队列上的SQL均分资源,不存在互相抢占的情况。资源队列限制的内存和其他参数限制的关系如下图:
6.创建资源队列:
create resource queue q_name with (queue_attribute=value):
ACTIVE_STATEMENTS=integer
[MAX_COST=float[COST_OVERCOMMIT={TRUE|FALSE}]]
[MAX_COST=float]
[PRIORITY={MIN|LOW|MEDIUM|HIGH|MAX}]
[MEMORY_LIMIT='memory_units']
创建带有并发限制的队列:create resource queue adhoc with(ACTIVE_STATEMENTS=3);
创建带有内存限制的队列:create resource queue myqueue with(ACTIVE_STATEMENTS=20,MEMEORY_LIMIT='2000MB');
设置优先级:create resource queue executive with(ACTIVE_STATEMENTS=3,PRIORITY=MAX);
7.资源隔离:指派角色(用户)到资源队列
指派角色到优先级队列
一旦创建了一个资源队列,用户必须把角色(用户)指派到它们合适的资源队列。
如果没有显示地把角色指派给资源队列,它们将进入默认资源队列pg_default。默认资源队列的活动语句限制是20,没有代价限制,优先权设为MAX
Alter role role_name resource queue queue_name;
create role role_name with login resource queue queue_name;
从资源队列移除角色
如果用户想要从一个资源队列移除一个角色并且把他们放在默认队列中,可以将该角色的队列指派改成none。例如:
alter role role_name rosource queue none;
修改资源队列配置:
alter resource queue 命令更改资源队列的限制。要更改一个资源队列的限制,可以为该队列指定相应的限制:
alter resource queue adhoc with (ACTIVE_STATEMENTS=5);
alter resource queue exec with (PRIORITY=MAX);
删除资源队列:
DROP RESOURCE QUEUE 命令可以删除资源队列。要删除一个资源队列,该队列不能有指派给它的角色,也不能有任何语句在其中等待。
资源隔离:状态监控
监控操作 | 说明 | 语句 |
查看队列中的语句和资源队列状态 | gp_toolkit.gp_resqueue_status视图允许管理员查看一个负载管理资源队列的状态和活动 | select * from gp_toolkit.gp_resqueue_status; |
查看资源队列统计信息 | 如果想要持续跟踪资源队列的统计信息和性能,用户可以使用pg_stat_resqueues系统视图来查看在资源队列使用上收集的统计信息 | select * from pg_stat_resqueues; |
查看资源队列的等待查询 | 用户可以看到所有资源队列的所有当前活跃的以及在等待的查询 | select * from gp_toolit.gp_locks_on_resqueue where lorwaiting='true'; |
查询活动语句的优先权 | 查看当前正在被执行的语句并且提供优先权、会话ID和其他信息。 | select * from gp_toolkit.gp_resq_priority_statement; |
重置活动语句的优先全 | gp_adjust_priority(session_id,statement_count,priority)调整当前正在被执行的语句的优先权。使用这个函数,超级用户可以提升或者降低任意查询的优先权 | select gp_adjust_priority(752,24905,'HIGH'); |
查看指派到资源队列的角色 | 要查看指派给资源队列的角色,执行下列在pg_roles和gp_toolkit.gp_resqueue_status系统目录表 | select rolname,rsqname from pg_roles,gp_toolkit.gp_resqueue_status where pg_roles.rolresqueue=gp_toolkit.gp_resqueue_status.queueid; |