Greenplum 6.9 资源队列(queue)示例
本文在Redhat 7.6环境使用Greenplum 6.9.0(部署在一台物理机上,2个segment)测试通过。
因为资源队列管理方式下,超级管理员(SUPERUSER)不受资源队列限制,所以下文将创建一个非超级管理员用户进行测试。
一、创建资源队列
- snippet.sql
[gpadmin@bogon ~]$ psql -d tpch1s -- 确认当前资源管理方式: tpch1s=# SHOW gp_resource_manager; gp_resource_manager --------------------- queue (1 ROW) -- 创建一个新的资源队列queue1: tpch1s=# CREATE RESOURCE QUEUE queue1 WITH (ACTIVE_STATEMENTS=2, MEMORY_LIMIT='600MB'); CREATE QUEUE -- 查询所有资源队列配置信息: tpch1s=# SELECT * FROM pg_resqueue; rsqname | rsqcountlimit | rsqcostlimit | rsqovercommit | rsqignorecostlimit ------------+---------------+--------------+---------------+-------------------- pg_default | 20 | -1 | f | 0 queue1 | 2 | -1 | f | 0 (2 ROWS)
二、角色与资源队列
- snippet.sql
-- 创建资源队列: tpch1s=# CREATE ROLE fairyfar WITH LOGIN RESOURCE QUEUE queue1; CREATE ROLE -- 查询角色: tpch1s=# \du List OF roles ROLE name | Attributes | Member OF -----------+----------------------------------------------------------------------------------------------------------+----------- fairyfar | | {} gpadmin | Superuser, CREATE ROLE, CREATE DB, Ext gpfdist TABLE, Wri Ext gpfdist TABLE, Ext http TABLE, Replication | {} -- 查询角色与资源队列关联关系: tpch1s=# SELECT rolname, rsqname FROM pg_roles, pg_resqueue WHERE pg_roles.rolresqueue = pg_resqueue.oid; rolname | rsqname ----------+------------ gpadmin | pg_default fairyfar | queue1 (2 ROWS) -- 可以尝试以下查询,试试效果: SELECT rolname, rsqname FROM pg_roles, gp_toolkit.gp_resqueue_status WHERE pg_roles.rolresqueue = gp_toolkit.gp_resqueue_status.queueid;
三、配置
登录权限
默认情况下,新建用户无法登录数据库,需要修改master节点的pg_hba.conf(以下方法是开放所有用户权限)。
- snippet.bash
# 仅需要修改master节点pg_hba.conf文件: [gpadmin@bogon ~]$ vim gpAux/gpdemo/datadirs/qddir/demoDataDir-1/pg_hba.conf # 追加: local all all trust
数据库访问查询权限
以上只是登录权限,还需要给新用户赋予数据库访问权限:
- snippet.sql
tpch1s=# GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO fairyfar;
启用资源队列统计
如果需要使用pg_stat_resqueues视图统计资源队列状态,需要启用master节点的stats_queue_level参数:
- snippet.bash
[gpadmin@bogon ~]$ vim gpAux/gpdemo/datadirs/qddir/demoDataDir-1/postgresql.conf stats_queue_level = on
资源配置
注意statement_mem与资源组MEMORY_LIMIT关系。
- snippet.sql
tpch1s=# SHOW statement_mem ; statement_mem --------------- 125MB (1 ROW)
四、测试
测试过程:
- 以上创建了用户fairyfar,并关联新建的资源队列queue1,该资源队列限制并发数为2。
- 同时使用fairyfar用户执行2个长查询和1个短查询,例如,2个长查询为TPC-H q01,短查询仅查询region表。
- 与此同时,再使用超级用户(避免查询排队)登录第4个客户端,查询资源队列状态。
第1个客户端查询:
- snippet.sql
tpch1s=> \i /opt/tpch/tpch1s_sql/1.sql
第2个客户端查询:
- snippet.sql
tpch1s=> \i /opt/tpch/tpch1s_sql/1.sql
第3个客户端查询:
- snippet.sql
tpch1s=> SELECT COUNT(*) FROM region;
第4个客户端:
- snippet.sql
tpch1s=# SELECT * FROM gp_toolkit.gp_resqueue_status; SELECT * FROM pg_stat_resqueues; queueid | rsqname | rsqcountlimit | rsqcountvalue | rsqcostlimit | rsqcostvalue | rsqmemorylimit | rsqmemoryvalue | rsqwaiters | rsqholders ---------+------------+---------------+---------------+--------------+--------------+----------------+----------------+------------+------------ 6055 | pg_default | 20 | 0 | -1 | 0 | 3.14573e+08 | 0 | 0 | 0 24693 | queue1 | 2 | 2 | -1 | 2280 | 5.24288e+08 | 5.24288e+08 | 1 | 2 (2 ROWS) queueid | queuename | n_queries_exec | n_queries_wait | elapsed_exec | elapsed_wait ---------+------------+----------------+----------------+--------------+-------------- 6055 | pg_default | 0 | 0 | 0 | 0 24693 | queue1 | 23 | 9 | 418 | 138 (2 ROWS)
从第4个客户端的统计信息可以看到:
- queue1资源队列并发限制为2。
- 客户端1和2执行查询过程中,客户端3(短查询)处于排队等待状态。
五、参考
打赏作者以资鼓励: