前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GPDB-内核特性-资源组内存管理机制-1

GPDB-内核特性-资源组内存管理机制-1

作者头像
yzsDBA
发布2023-03-27 11:26:19
4530
发布2023-03-27 11:26:19
举报
文章被收录于专栏:PostgreSQL研究与原理解析

GPDB-内核特性-资源组内存管理机制-1

GreenPlum有两种资源管理方法:资源队列和资源组。前期我们分析过资源队列内存相关我问题gp_vmem_protect_limit如何实现,本文介绍资源组关于内存的管理机制。

1、简介

资源组使GP的一种资源管理方式,能够细粒度对每个用户的资源使用进行限制,支持通过SQL语句的方式进行配置。支持三种资源限制:并发、CPU和内存。

超级用户通过SQL语句在数据库内定义多个资源组,并设置每个资源组的限制。每个资源组可以关联一个或多个数据库用户,每个数据库用户只能属于单个资源组。资源组支持的资源限制的属性:

1)concurrency:资源组中允许的最大并发事务数,包括活动和空闲事务

2)cpu_rate_limit:该资源组可以使用的CPU资源百分比

3)cpuset:该资源组保留的CPU核数,具体使用哪几个CPU逻辑核

4)memory_limit:资源组可用的内存资源百分比

5)memory_shared_quota:该资源组内的事务之间共享的内存资源百分比

6)memory_spill_ratio:内存密集型事务的内存使用阈值,超过该阈值,将溢出到磁盘。

7)memory_auditor:资源组使用的内存auditor,默认vmstacker:分配资源组到角色;cgroup:分配资源组到external component。

资源组通过master上的并发锁实现对并发的限制,通过cgroup实现对CPU的限制,支持内存基于vmtracker和cgroup进行两种方式的限制。

2、资源组的使用

创建资源组

代码语言:javascript
复制
CREATE RESOURCE GROUP rgroup1 WITH (CPU_RATE_LIMIT=20, MEMORY_LIMIT=25, MEMORY_SHARED_QUOTA=60,MEMORY_SPILL_RATIO=20);

数据库包含2个默认的资源组:admin_group和default_group。启用资源组后,未明确分配资源组的任何角色分配到default_group。SUPERUSER分配admin_group。

资源组分配给角色

使用CREATE ROLE或ALTER ROLE命令将资源组分配给角色:

代码语言:javascript
复制
ALTER ROLE yzs RESOURCE GROUP yzsgroup;
CREATE ROLE yzs RESOURCE GROUP yzsgroup;

从角色中删除资源组并分配到默认组:

代码语言:javascript
复制
ALTER ROLE yzs RESOURCE GROUP NONE;

修改资源组配置

代码语言:javascript
复制
ALTER RESOURCE GROUP yzs SET MEMORY_LIMIT 30;

删除资源组

代码语言:javascript
复制
DROP RESOURCE GROUP yzs;

资源组监控:

资源组配置:

代码语言:javascript
复制
SELECT * FROM gp_toolkit.gp_resgroup_config;

资源组使用情况:

代码语言:javascript
复制
SELECT * FROM gp_toolkit.gp_resgroup_status;

每个segment上资源组使用情况:

代码语言:javascript
复制
SELECT * FROM gp_toolkit.gp_resgroup_status_per_segment;

每个host主机上资源组使用情况:

代码语言:javascript
复制
SELECT * FROM gp_toolkit.gp_resgroup_status_per_host;

3、资源组监控项含义

rsgname

资源组名

groupid

资源组oid

hostname

主机名

cpu

当前资源组的CPU使用率

memory_used

当前资源组实际使用的内存总量

memory_avaliable

当前资源组可用的内存总量

memory_quota_used

当前资源组固定分额slots部分实际使用的内存总量

memory_quota_avaliable

当前资源组固定分额slots可用的内存总量

memory_shared_used

当前资源组共享部分实际使用的内存总量

memory_shared_avaliable

当前资源组共享部分可用的内存总量

memory_used = memory_quota_used + memory_shared_used

available = memory_quota_granted(slots实际总配额) + memory_shared_granted(共享区部分实际总配额) - memory_used

memory_quota_granted = memory_quota_used + memory_quota_available

memory_shared_granted = memory_shared_used + memory_shared_available

4、资源组内存管理实现分析

想要了解资源组如何实现的,首先需要理解资源组的数据结构。资源组管理器由ResGroupControl进行管理。由函数ResGroupControlInit进行初始化,调用堆栈:

代码语言:javascript
复制
CreateSharedMemoryAndSemaphores->ResManagerShmemInit->ResGroupControlInit

该函数中也可以看出来,pResGroupControl资源组管理器通过ShmemInitStruct函数在共享内存中申请,所有进程共享。

ResGroupControl中比较重要的成员变量有:

1)totalChunks

Segment上总的chunk个数。

2)chunkSizeInBits

一个chunk的大小:#define BITS_IN_MB 20,也就是1MB

3)htbl

资源组的hash表。所有资源组都在该hash表中。可以根据资源组OID通过函数groupHashFind在该hash表中找到对应的资源组

4)slots[]数组

资源组管理器中的slot池。数组大小为RESGROUP_MAX_SLOTS,即MaxConnections最大连接数。该slots数组的空闲slot由链表进行管理,该链表头为freeSlot,初始时为slot[MaxConnections],然后依次通过slot->next将所有slots管理起来,即初始时所有的slot都是空闲的。

5)freeChunks

空闲chunk个数,初始时等于totalChunks

6)groups[]数组

资源组池。数组大小MaxResourceGroups,即100。也就是最大能建立100个资源组。Hash表中的ResGroupHashEntry的index即为该数组下标。

创建资源组的时候,顺序扫描该资源组池,找到一个空闲的group;然后将该资源组OID作为key插入hash表,插入hash表的entry的index为groups[]数组下标,这样将hash表和资源组池关联起来。

Slot结构ResGroupSlotData的成员

这个和资源组并发限制有关。每个并发,即每个事务对应一个slot。重要成员有:

1)groupId:slot所属资源组的OID

2)ResGroupData* group:该slot所属的资源组

3)memQuota:该slot的内存配额,真实分配的

4)memUsage:该slot已使用的chunk数

5)nProcs:该slot上的进程数

6)caps:所属资源组的属性

资源组结构ResGroupData的成员

1)groupId:资源组的OID

2)memExpected:资源组定义的内存配额

3)memQuotaGranted:资源组slots实际总配额

4)memSharedGranted:资源组内存中shared共享部分的实际配额

5)memQuotaUsed:当前资源组中正使用的所有slots的总chunk数

6)memSharedUsage:当前资源组中shared共享部分使用的chunk数

7)groupMemOps:资源组使用的auditor

8)caps:所属资源组的属性,包括并发限制、CPU限制、内存限制等。其中memLimit表示定义使用总量的百分比。memSharedQuota表示该资源组共享区占用该资源组内存的百分比。memAuditor表示该资源组需要使用哪个auditor

5、总结

资源组内存分配如上图所示。

参考

https://cn.greenplum.org/wp-content/uploads/2022/03/Greenplum%E4%B8%AD%E7%9A%84%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86%E7%AD%96%E7%95%A5.pdf

https://www.modb.pro/db/477684

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-03-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 yanzongshuaiDBA 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、简介
  • 2、资源组的使用
  • 3、资源组监控项含义
  • 4、资源组内存管理实现分析
  • 5、总结
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档