前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Greenplum 资源队列

Greenplum 资源队列

原创
作者头像
小徐
修改2019-01-28 18:16:28
2K0
修改2019-01-28 18:16:28
举报
文章被收录于专栏:GreenplumGreenplum

13 Greenplum 资源队列

参考文章:

https://cloud.tencent.com/developer/article/1369185

13.1 队列说明

13.1.1 资源队列

在Greenplum的4.x版本之后,加入了资源队列的概念,其主要作用就是限制用户或者单个SQL对资源的消耗。避免出现消耗过多资源,影响其他用户或者SQL计算。这里的资源限制主要是指系统内存资源。

13.1.2 队列原理

在GP中,队列主要是对内存资源进行分配和限制。所有运行在队列上的SQL均分资源,不存在互相抢占的情况。

13.1.3 内存参数计算方法

1、max_statement_mem:设置每个查询最大使用的内存量,该参数是防止statement_mem参数设置的内存过大导致的内存溢出,默认为2GB。

2、statement_mem:设置每个查询在segment主机中可用的内存,该参数设置的值不能超过max_statement_mem设置的值,如果配置了资源队列,则不能超过资源队列设置的值MEMORY_LIMIT,默认125MB。推荐值计算方法:( gp_vmem_protect_limitGB * 0.9 ) / max_expected_concurrent_queries 。

3、gp_vmem_protect_limit:设置segment中所有的进程可用的内存,如果查询所使用的内存超过该内存值,则查询失败。该参数为本地参数,需要对所有的primary和mirror分别进行设置。默认为8192MB。

例如:

gp_vmem_protect_limit 设置为 8192MB (8GB) ,查询的最大并发量为40,其中10%为缓存空间,则statement_mem计算如下:

(8GB *0 .9) / 40 = 0.18GB = 184MB

注意:

1、statement_mem设置必须小于max_statement_mem。否则报错。ERROR: Invalid input for statement_mem. Must be less than max_statement_mem (2048000 kB). (cdbvars.c:1374)。

2、理论上statement_mem也必须小于队列参数MEMORY_LIMIT。但是在创建MEMORY_LIMIT小于statement_mem默认值125MB时,也能够成功,不会出错。不过在该队列上运行SQL时,则会报错。ERROR:  deadlock detected, locking against self。

13.1.4 内存分配

13.1.4.1 内存分配计算过程

1、当一个查询在资源队列上运行SQL计算任务时,将直接在每个segment分配使用固定内存,假设为X MB,即使实际使用的内存没有达到 X。

2、如果同时设置了statement_mem参数,为Y MB。 则SQL任务可以分配到的内存大小为MAX(X,Y)。因此会发生实际同时运行SQL还未达到ACTIVE_STATEMENTS,但是队列可用内存被耗尽的情况,当出现这种情况的时候,队列中的其他SQL查询会等待。直到由内存释放。

Greenplum为SQL计算任务分配内存大小计算过程如下图:

13.1.4.2 内存分配要点

1、当只设置MAX_COST,则为Min((planCost/MAX_COST), 1.0)*MEMORY_LIMIT和statement_mem较大者。

2、当只设置ACTIVE_STATEMENTS,则MEMORY_LIMIT /ACTIVE_STATEMENTS和statement_mem较大者。

3、如果都设置,则Min( 1.0/ ACTIVE_STATEMENTS, planCost / MAX_COST)*MEMORY_LIMIT 和statement_mem较大者。

4、没有设置MEMORY_LIMIT,则直接为statement_mem。

上图流程中,会计算出需要为该SQL任务计算出所分配的内存大小 X MB。并且会再次检查该内存大小必须小于MEMORY_LIMIT值,即statement_men也必须小于等于MEMORY_LIMIT,否则会报错。

13.1.5 内存大小模型

1、通过以上分析和内存分配计算过程的了解,我们可以清晰的知道各内存参数之间的关系,以及在Greenplum中起到的作用和各个参数需要配置为合适的值,避免出现内存过多或者过小的情况。

2、首先gp_vmem_protect_limit必须小于服务器物理内存,max_statement_mem和MEMORY_LIMIT必须小于gp_vmem_protect_limit。

3、其次statement_mem必须小于Min(max_statement_mem,MEMORY_LIMIT)。MEMORY_LIMIT可以大于max_statement_mem,但最好小于ACTIVE_STATEMENTS*max_statement_mem。

13.2 创建队列

13.2.1 创建队列语句

CREATE RESOURCE QUEUE name WITH (queue_attribute=value [, ... ])

where queue_attribute is:

ACTIVE_STATEMENTS=integer

[ MAX_COST=float [COST_OVERCOMMIT={TRUE|FALSE}] ]

[ MIN_COST=float ]

[ PRIORITY={MIN|LOW|MEDIUM|HIGH|MAX} ]

[ MEMORY_LIMIT='memory_units' ]

| MAX_COST=float [ COST_OVERCOMMIT={TRUE|FALSE} ]

[ ACTIVE_STATEMENTS=integer ]

[ MIN_COST=float ]

[ PRIORITY={MIN|LOW|MEDIUM|HIGH|MAX} ]

[ MEMORY_LIMIT='memory_units' ]

13.2.2 参数说明

1、ACTIVE_STATEMENTS:指运行同时运行的SQL数量,超过该数量的请求将会排队等待,默认为-1,表示不受限制。

2、MAX_COST:该队列允许运行的单个SQL最大COST值,默认为-1,表示不受限制.

3、MIN_COST:低于该COST值的SQL直接运行,不受队列资源的限制,默认为0。

4、PRIORITY:队列中任务分配CPU资源的优先级,默认为MEDIUM。

5、MEMORY_LIMIT:资源队列内存限制大小,单位为kB/MB/GB。默认为-1,表示不受限制。

13.2.3 创建队列说明

1、只有superuser 角色权限的用户才可以创建资源队列

2、ACTIVE_STATEMENTS 与 MAX_COST 必须二选一,不能都设置为-1。

3、队列名不能为none,为保留标识符。

13.2.4 创建队列实例

create resource queue test_queue with (ACTIVE_STATEMENTS=50, MEMORY_LIMIT='1024GB',PRIORITY=MAX);

test_queue : 队列的名字

注意:

1、resource_select_only: 如果值为off,那么insert,update,delete也将被资源队列限制。如果是on,那么只有select,select into,create table as select ,declare cursor被资源队列限制。

2、max_resource_queues :资源队列最大个数。

13.2.5 把队列给用户使用

alter role  xiaoxu  resource queue  test_queue;

xiaoxu : 系统中的用户信息

test_queue : 队列的名字

13.3 常用队列操作

13.3.1 修改变更资源队列

使用ALTER RESOURCE QUEUE命令来改变资源队列的限制

ALTER RESOURCE QUEUE test_queue WITH (ACTIVE_STATEMENTS=3);

ALTER RESOURCE QUEUE test_queue WITH (MAX_COST=100000.0);

将活动语句数量或者内存限制重置为无限制,可以使用-1值。

ALTER RESOURCE QUEUE test_queue WITH (MAX_COST=-1.0, MEMORY_LIMIT='2GB');

改变查询优先级

ALTER RESOURCE QUEUE test_queue WITH (PRIORITY=MIN);

13.3.2 删除资源队列

drop resource queue test_queue;

test_queue : 队列的名字

说明:

1、如果该队列上已有用户,则会删除失败。报错信息:ERROR: resource queue " test_queue" is used by at least one role

2、只能是superuser 执行该操作,否则ERROR: must be superuser to drop resource queues

13.3.3 添加用户到资源队列中

alter role  xiaoxu  resource queue test_queue;

xiaoxu : 系统用户名

test_queue : 队列的名字

13.3.4 恢复到使用默认的资源队列

alter role  xiaoxu  resource queue none;

xiaoxu :  系统用户名

说明:

1、普通用户角色也可以操作。

2、none为特殊队列名,表明该用户设置为默认的队列pg_default。

13.4 资源队列的相关查询语句

13.4.1 查看用户和用户的资源队列

SELECT rolname, rsqname FROM pg_roles, gp_toolkit.gp_resqueue_status

WHERE pg_roles.rolresqueue=gp_toolkit.gp_resqueue_status.queueid;

rolname : 角色的名字(用户名)

rsqname : 队列的名字

13.4.2 查看队列的配置参数信息

chinadaas=# select * from pg_resqueue_attributes;

  rsqname   |      resname      | ressetting | restypid

------------+-------------------+------------+----------

 pg_default | active_statements | 20         |        1

 pg_default | max_cost          | -1         |        2

 pg_default | min_cost          | 0          |        3

 pg_default | cost_overcommit   | 0          |        4

 pg_default | priority          | medium     |        5

 pg_default | memory_limit      | -1         |        6

 test_queue | active_statements | 50         |        1

 test_queue | max_cost          | -1         |        2

 test_queue | min_cost          | 0          |        3

 test_queue | cost_overcommit   | 0          |        4

 test_queue | priority          | max        |        5

 test_queue | memory_limit      | 1024GB     |        6

(12 rows)

Time: 6.955 ms

13.4.3 查看资源队列相关使用情况

chinadaas=# SELECT * FROM gp_toolkit.gp_resqueue_status;

 queueid |  rsqname   | rsqcountlimit | rsqcountvalue | rsqcostlimit | rsqcostvalue | rsqmemorylimit | rsqmemoryvalue | rsqwaiters | rsqholders

---------+------------+---------------+---------------+--------------+--------------+----------------+----------------+------------+------------

 2156929 | test_queue |            50 |             0 |           -1 |            0 |    1.09951e+12 |              0 |          0 |          0

    6055 | pg_default |            20 |             0 |           -1 |            0 |             -1 |              0 |          0 |          0

(2 rows)

Time: 40.856 ms

13.4.4 查看资源队列统计信息

chinadaas=# SELECT * FROM pg_stat_resqueues;

 queueid | queuename  | n_queries_exec | n_queries_wait | elapsed_exec | elapsed_wait

---------+------------+----------------+----------------+--------------+--------------

    6055 | pg_default |              0 |              0 |            0 |            0

 2156929 | test_queue |              0 |              0 |            0 |            0

(2 rows)

Time: 18.548 ms

13.4.5 查询角色分配的资源队列

chinadaas=# SELECT * from gp_toolkit.gp_resq_role;

      rrrolname      | rrrsqname  

---------------------+------------

 gpmon               | pg_default

 chinadaas           | pg_default

 gpadmin             | pg_default

************************

13.4.6 查询资源队列中的等待查询

chinadaas=# SELECT * FROM gp_toolkit.gp_locks_on_resqueue WHERE lorwaiting='true';

 lorusename | lorrsqname | lorlocktype | lorobjid | lortransaction | lorpid | lormode | lorgranted | lorwaiting

------------+------------+-------------+----------+----------------+--------+---------+------------+------------

(0 rows)

Time: 41.413 ms

13.4.7 查询活动语句的优先级

select * from gp_toolkit.gp_resq_priority_statement

13.4.8 清理资源队列中等待的查询

SELECT rolname, rsqname, pid, granted,current_query, datname

FROM pg_roles, gp_toolkit.gp_resqueue_status, pg_locks,pg_stat_activity

WHERE pg_roles.rolresqueue=pg_locks.objid

AND pg_locks.objid=gp_toolkit.gp_resqueue_status.queueid

AND pg_stat_activity.procpid=pg_locks.pid

AND pg_stat_activity.usename=pg_roles.rolname;

13.4.9 查询系统中的队列

chinadaas=# select * ,pg_resqueue.oid  from pg_resqueue;

  rsqname   | rsqcountlimit | rsqcostlimit | rsqovercommit | rsqignorecostlimit |   oid   

------------+---------------+--------------+---------------+--------------------+---------

 pg_default |            20 |           -1 | f             |                  0 |    6055

 test_queue |            50 |           -1 | f             |                  0 | 2156929

(2 rows)

13.5 设置当前会话的的参数

13.5.1 设置当前的会话参数

任何会话参数可以在活跃数据库会话使用SET命令来设置。例如:

#  SET statement_mem TO '200MB';

参数设置是有效的该会话结束或直到发出复位命令。例如:

# RESET statement_mem;

在会话级别的设置将覆盖那些角色级别。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 13 Greenplum 资源队列
    • 13.1 队列说明
      • 13.1.1 资源队列
      • 13.1.2 队列原理
      • 13.1.3 内存参数计算方法
      • 13.1.4 内存分配
      • 13.1.5 内存大小模型
    • 13.2 创建队列
      • 13.2.1 创建队列语句
      • 13.2.2 参数说明
      • 13.2.3 创建队列说明
      • 13.2.4 创建队列实例
      • 13.2.5 把队列给用户使用
    • 13.3 常用队列操作
      • 13.3.1 修改变更资源队列
      • 13.3.2 删除资源队列
      • 13.3.3 添加用户到资源队列中
      • 13.3.4 恢复到使用默认的资源队列
    • 13.4 资源队列的相关查询语句
      • 13.4.1 查看用户和用户的资源队列
      • 13.4.2 查看队列的配置参数信息
      • 13.4.3 查看资源队列相关使用情况
      • 13.4.4 查看资源队列统计信息
      • 13.4.5 查询角色分配的资源队列
      • 13.4.6 查询资源队列中的等待查询
      • 13.4.7 查询活动语句的优先级
      • 13.4.8 清理资源队列中等待的查询
      • 13.4.9 查询系统中的队列
    • 13.5 设置当前会话的的参数
      • 13.5.1 设置当前的会话参数
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档