GreenPlum资源组的使用

2022-06-07 00:00:00 查询 队列 设置 内存 资源

资源组和资源队列

在Greenplum4版本中,要管理数据库的内存、CPU和并发事务只有资源队列(Resource Queues)这一种方法。而Greenplum5及之后的版本,提供了两种负载管理方法:资源队列(Resource Queues)和资源组(Resource Group),且Greenplum数据库中同时只能启用资源组或资源队列中的一个资源管理模式。

下面是资源队列和资源组的区别:

参数资源队列资源组
并行在查询级别管理在事务级别管理
CPU指定队列顺序指定CPU的使用百分比;使用Linux控制组
内存在队列和操作级别管理;用户可以过量使用在事务级别管理,可以进一步分配和追踪;用户不可以过量使用。
内存隔离同资源组下的事务使用的内存是隔离的,不同资源组使用的内存也是隔离的。
用户仅非管理员用户有限制。非管理员用户和超级用户都有限制
排序当没有可用槽位时,才开始排序当槽位或内存不足时,开始排序
查询失效当内存不足时,查询可能会立即失效在没有更多的共享资源组内存的情况下,若事务到达了内存使用量限制后仍然提出增加内存的申请,查询可能会失效
避开限制超级用户角色以及特定的操作者和功能不受限制。SET、RESET和SHOW指令不受限制
外部组件管理PL/Container CPU和内存资源

操作系统和Greenplum数据库内存设置对采用资源组来管理日常工作是非常有必要的:

  • vm.overcommit_memory

    该Linux内核参数在/etc/sysctl.conf文件中设置,用来指定操作系统分配给系统进程使用多少内存的方法。vm.overcommit_memory在Greenplum数据库所在的机器上必须设置为2。

  • vm.overcommit_ratio

    该Linux内核参数在/etc/sysctl.conf文件中设置,用来执行应用进程可以使用的内存百分比;剩余的内存留给操作系统。操作系统默认值(Red Hat上默认是50)对于部署Greenplum数据库集群基于资源组的管理方式是一个不错的初始值。如果感觉内存利用率太低,便可以提高该值;如果内存或交换分区使用太高,就减少该设置。

  • gp_resource_group_memory_limit

    系统分配给Greenplum数据库的内存百分比。默认值为.7(70%)。

  • gp_workfile_limit_files_per_query

    设置gp_workfile_limit_files_per_query以限制每个查询允许使用的临时溢出文件(工作文件)的大数量。当查询要求的内存比它能分配的更多时,它将创建溢出文件。当上述限制被超过时,查询会被中止。默认值为零,允许无限多的溢出文件并且可能会填满文件系统。

  • gp_workfile_compression

    如果有很多溢出文件,则设置gp_workfile_compression来压缩这些溢出文件。压缩溢出文件可能有助于避免IO操作导致磁盘子系统过载。

其他考虑因素:

  • 不要启用操作系统大页配置。

  • 当您配置资源组内存时,提前考虑出现segment实例或segment主机宕机时,镜像segment变成主segment对系统内存的占用。

启用资源组

Resource Group基于linux内核提供的cgroup模块来实现,因此当使用Resource Group时,需要保证数据库所运行的操作系统上支持cgroup模块。

安装模块

yum install libcgroup-tools

配置文件/etc/cgconfig.d/gpdb.conf

group gpdb {
     perm {
         task {
             uid = gpadmin;
             gid = gpadmin;
         }
         admin {
             uid = gpadmin;
             gid = gpadmin;
         }
     }
     cpu {
     }
     cpuacct {
     }
     memory {
     }
     cpuset {
     }
 }

启动服务并加入开机启动

systemctl start cgconfig.service
systemctl enable cgconfig.service

配置数据库参数,启用资源组

gpconfig -c gp_resource_manager -v "group"

重启数据库

gpstop
gpstart

数据库成功启用资源组后,会创建默认资源组admin_group和default_group,它具有以下属性

Limit Typeadmin_groupdefault_group
CONCURRENCY1020
CPU_RATE_LIMIT1030
CPUSET-1-1
MEMORY_LIMIT1030
MEMORY_SHARED_QUOTA5050
MEMORY_SPILL_RATIO2020
MEMORY_AUDITORvmtrackervmtracker

创建资源组

在创建一个Resource Group时,可以指定如下的属性:

Limit TypeDescription
MEMORY_AUDITORThe memory auditor in use for the resource group.vmtracker (the default) is required if you want to assign the resource group to roles. Specify cgroup to assign the resource group to an external component.
CONCURRENCYThe maximum number of concurrent transactions, including active                and idle transactions, that are permitted in the resource group.
CPU_RATE_LIMITThe percentage of CPU resources available to this resource                group.
CPUSETThe CPU cores to reserve for this resource group.
MEMORY_LIMITThe percentage of memory resources available to this resource                group.
MEMORY_SHARED_QUOTAThe percentage of memory to share across transactions submitted                in this resource group.
MEMORY_SPILL_RATIOThe memory usage threshold for memory-intensive transactions.                When a transaction reaches this threshold, it spills to disk.

在用角色创建资源组时,必须设置CPU_RATE_LIMIT或CPUSET和MEMORY_LIMIT限制值:

CREATE RESOURCE GROUP mygroup1 WITH (CPU_RATE_LIMIT=20, MEMORY_LIMIT=25);

在为外部组件创建资源组时,除了设置CPU_RATE_LIMIT或CPUSET和MEMORY_LIMIT限制值,还需要指定MEMORY_AUDITOR和设置CONCURRENCY =0,如:

CREATE RESOURCE GROUP mygroup_ext WITH (MEMORY_AUDITOR=cgroup, CONCURRENCY=,
     CPUSET='1', MEMORY_LIMIT=15);

修改资源组参数设置

ALTER RESOURCE GROUP mygroup1 SET MEMORY_LIMIT 10;
ALTER RESOURCE GROUP mygroup_ext SET CPUSET '0,1';

为用户指定资源组

alter role test resource group mygroup1;

常用查询语句

查询资源组列表和参数设置的视图

SELECT * FROM gp_toolkit.gp_resgroup_config

其视图的sql语句

SELECT g.oid AS groupid, g.rsgname AS groupname,
     t1.value AS concurrency, t1.proposed AS proposed_concurrency,
     t2.value AS cpu_rate_limit, t3.value AS memory_limit,
     t3.proposed AS proposed_memory_limit,
     t4.value AS memory_shared_quota,
     t4.proposed AS proposed_memory_shared_quota,
     t5.value AS memory_spill_ratio,
     t5.proposed AS proposed_memory_spill_ratio,
     CASE
       WHEN t6.value IS NULL THEN 'vmtracker'::text
       WHEN t6.value = '0'::text THEN 'vmtracker'::text
       WHEN t6.value = '1'::text THEN 'cgroup'::text
       ELSE 'unknown'::text
     END AS memory_auditor,
     t7.value AS cpuset
   FROM pg_resgroup g
     JOIN pg_resgroupcapability t1 ON g.oid = t1.resgroupid AND t1.reslimittype = 1
     JOIN pg_resgroupcapability t2 ON g.oid = t2.resgroupid AND t2.reslimittype = 2
     JOIN pg_resgroupcapability t3 ON g.oid = t3.resgroupid AND t3.reslimittype = 3
     JOIN pg_resgroupcapability t4 ON g.oid = t4.resgroupid AND t4.reslimittype = 4
     JOIN pg_resgroupcapability t5 ON g.oid = t5.resgroupid AND t5.reslimittype = 5
     LEFT JOIN pg_resgroupcapability t6 ON g.oid = t6.resgroupid AND t6.reslimittype = 6
     LEFT JOIN pg_resgroupcapability t7 ON g.oid = t7.resgroupid AND t7.reslimittype = 7;

查询资源状态信息

SELECT * FROM gp_toolkit.gp_resgroup_status;

查询角色和资源组的关系

SELECT rolname, rsgname FROM pg_roles, pg_resgroup
WHERE pg_roles.rolresgroup=pg_resgroup.oid;

来源 https://www.modb.pro/db/52514

相关文章