Greenplum是一款广泛应用的开源MPP数据库的产品,兼容PostgreSQL生态,被广泛应用与大数据的存储与分析。
Resource Group是Greenplum的一种资源管理方式。Resource Group由GP5开始被支持,相比于早期的Resource Queue的资源管理方式,具有支持更细粒度的资源管理、 支持组内资源共享等优点。在前一篇文章《Greenplum资源管理——Resource Group使用和实现分析》中笔者结合源码介绍了Resource Group的基础机制,这篇文章主要是面向DBA,介绍Resource Group的常见用法、Resource Group相关的参数含义、作用原理和配置建议,以及Greenplum重点客户使用过程中疑问比较多的常见问题。
Resource Group基本用法
Resource Group是Greenplum默认的资源管理方式,其基本原理和使用场景在前一篇文章《Greenplum资源管理——Resource Group使用和实现分析》中已经有所介绍,这里简要介绍Resource Group的常用SQL以帮大家回忆其基本内容,如果想对Resource Group有更深了解,可以阅读下前篇文章。
创建resource group:
CREATE RESOURCE GROUP rgroup1 WITH (CPU_RATE_LIMIT=20, MEMORY_LIMIT=25, MEMORY_SPILL_RATIO=20);
修改resource group配置:
ALTER RESOURCE GROUP rgroup1 SET CONCURRENCY 10;
查看当前系统的resource group配置:
SELECT * FROM gp_toolkit.gp_resgroup_config;
查看当前各个resource group负载情况:
SELECT * FROM gp_toolkit.gp_resgroup_status;
按segment查询resource group负载状态:
SELECT * FROM gp_toolkit.gp_resgroup_status_per_host;
查看用户对应的resource group:
select rolresgroup,* from pg_roles;
修改用户关联的resource group:
ALTER ROLE m1 RESOURCE GROUP rgroup1;
Resource Group参数配置及原理
参数名 | 取值 | 含义 | 作用原理 |
gp_resource_manager | group/queue | 数据库当前的资源管理方式: group:resource group; queue:resource queue; | queue为默认值,若想切换为resource group需要进行一次重启。 |
gp_resgroup_memory_policy | auto, eager_free | 单个查询的子运算之间的内存分配方式 | eager_free为默认值。 我们除了通过resource group设定单个查询使用的最大内存之外,还可以设定如何在子算子之间(例如一个select查询通常包含一个scan子算子和gather motion自单子)如何分配内存。 eager_free代表优化器采用贪婪的内存分配算法。因为查询的所有运算符不会同时执行,所以在分配上,优化器选择急切地释放在该阶段执行结束时分配给前一阶段的内存, 然后将急切释放的内存分配给新阶段。 auto代表一种均分的逻辑。他会把要执行的operator分成耗费内存型和固定内存型,然后为每个固定内存型算子分配100KB内存,而其他耗费内存型operator平分所分配的resource group内存。 以上内存份额的分配是在执行器逻辑开始执行之前(standard_ExecutorStart)进行的。 |
gp_resource_group_memory_limit | 浮点型 | 标识要分配给每个segment节点上的资源组的系统内存资源的最大百分比。 | 这个参数主要关系resource group能够使用的物理内存上限。 每个机器实际可用的内存 rg_perseg_mem = ((RAM * (vm.overcommit_ratio / 100) + SWAP) * gp_resource_group_memory_limit) / num_active_primary_segments_per_host 其中,RAM代表物理内存值,vm.overcommit_ratio是内核参数,num_active_primary_segments_per_host代表机器当前active额primary节点个数。 |
gp_resource_group_cpu_limit | 浮点型 | 标识要分配给每个segment节点上的资源组的系统CPU资源的最大百分比。 | 与内存占比值类似。 |
gp_resource_group_bypass | on/off | 设置为true以绕过资源组并发事务限制 | 为某个session设置参数为on,可以使这个session的查询绕过资源组限制,使用全局的共享内存来分配。 |
Resource Group常见问题
Resource Group是Greenplum重要的资源管理方式,其稳定性和有效性也在大型金融、运营商客户的离在线业务中得到了充分验证。本节选择Greenplum客户在使用过程中提出频率最高的一些问题以进一步介绍Greenplum Resource Group的原理和使用。
1)resource group如何开启,我是否能使用resource group?
resource group目前只在DBStack形态下输出,公有云和企业版暂时不能使用resource group进行资源管理。resource group可以在控制台进行开启,也可以提交工单由值班人员操作开启。
2)resource group基于cgroup实现,如果某台机器cgroup突然失效甚至硬件坏掉导致本质cgroup配置丢失,重启之后cgroup还能正常使用吗?
可以的。Greenplum除了将需要的cgroup配置写入本地之外,还在catalog中存储相关信息,并在每次开启时进行检查和初始化,所以cgroup意外丢失或者底层机器迁移之后cgroup会自动适配,不会影响resource group功能使用。
3)resource group对于底层OS有要求吗?
需要支持cgroup,且cgroup下面的cpu和cpuset路径分开挂载。
4)resource group功能可以在k8s部署形态下使用吗?
可以的,虽然k8s基于cgroup做资源隔离,单resource group可以级联挂在cgroup,resource group功能可以正常使用。
5)resource group能否设置一个用户对应多个队列,或者多个用户对应一个队列?
resource group中用户与group是多对一的关系。一个group可以管理多个用户,但是同一个用户只能属于一个资源group。
6)resource group是database级别,还是集群级别?
resource group是集群级别,整个集群共享配置以及相关系统表;连接在某一个数据库上设置和修改的resource group配置,在连接到其他数据库上看到的是一致的。