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

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

GPDB-内核特性-资源组内存管理机制-1GreenPlum有两种资源管理方法:资源队列和资源组。前期我们分析过资源队列内存相关我问题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、资源组的使用


创建资源组

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命令将资源组分配给角色:

ALTER ROLE yzs RESOURCE GROUP yzsgroup;
CREATE ROLE yzs RESOURCE GROUP yzsgroup;

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

ALTER ROLE yzs RESOURCE GROUP NONE;

修改资源组配置

ALTER RESOURCE GROUP yzs SET MEMORY_LIMIT 30;

删除资源组

DROP RESOURCE GROUP yzs;

资源组监控:资源组配置:

SELECT * FROM gp_toolkit.gp_resgroup_config;

资源组使用情况:

SELECT * FROM gp_toolkit.gp_resgroup_status;

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

SELECT * FROM gp_toolkit.gp_resgroup_status_per_segment;

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

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_usedavailable = memory_quota_granted(slots实际总配额)+ memory_shared_granted(共享区部分实际总配额)- memory_usedmemory_quota_granted = memory_quota_used + memory_quota_availablememory_shared_granted = memory_shared_used + memory_shared_available


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


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

    CreateSharedMemoryAndSemaphores->ResManagerShmemInit->ResGroupControlInit

    该函数中也可以看出来,pResGroupControl资源组管理器通过ShmemInitStruct函数在共享内存中申请,所有进程共享。ResGroupControl中比较重要的成员变量有:1)totalChunks   Segment上总的chunk个数。2)chunkSizeInBits   一个chunk的大小:#define BITS_IN_MB 20,也就是1MB3)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个数,初始时等于totalChunks6)groups[]数组  资源组池。数组大小MaxResourceGroups,即100。也就是最大能建立100个资源组。Hash表中的ResGroupHashEntry的index即为该数组下标。

    创建资源组的时候,顺序扫描该资源组池,找到一个空闲的group;然后将该资源组OID作为key插入hash表,插入hash表的entry的index为groups[]数组下标,这样将hash表和资源组池关联起来。Slot结构ResGroupSlotData的成员这个和资源组并发限制有关。每个并发,即每个事务对应一个slot。重要成员有:1)groupId:slot所属资源组的OID2)ResGroupData* group:该slot所属的资源组3)memQuota:该slot的内存配额,真实分配的4)memUsage:该slot已使用的chunk数5)nProcs:该slot上的进程数6)caps:所属资源组的属性资源组结构ResGroupData的成员1)groupId:资源组的OID2)memExpected:资源组定义的内存配额3)memQuotaGranted:资源组slots实际总配额4)memSharedGranted:资源组内存中shared共享部分的实际配额5)memQuotaUsed:当前资源组中正使用的所有slots的总chunk数6)memSharedUsage:当前资源组中shared共享部分使用的chunk数7)groupMemOps:资源组使用的auditor8)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.pdfhttps://www.modb.pro/db/477684

    目录
    相关文章
    |
    8月前
    |
    存储 算法 编译器
    【C++ 内存管理 重载new/delete 运算符 新特性】深入探索C++14 新的/删除的省略(new/delete elision)的原理与应用
    【C++ 内存管理 重载new/delete 运算符 新特性】深入探索C++14 新的/删除的省略(new/delete elision)的原理与应用
    189 0
    |
    1月前
    |
    算法 Linux
    深入探索Linux内核的内存管理机制
    本文旨在为读者提供对Linux操作系统内核中内存管理机制的深入理解。通过探讨Linux内核如何高效地分配、回收和优化内存资源,我们揭示了这一复杂系统背后的原理及其对系统性能的影响。不同于常规的摘要,本文将直接进入主题,不包含背景信息或研究目的等标准部分,而是专注于技术细节和实际操作。
    |
    2月前
    |
    算法 Linux 开发者
    深入探究Linux内核中的内存管理机制
    本文旨在对Linux操作系统的内存管理机制进行深入分析,探讨其如何通过高效的内存分配和回收策略来优化系统性能。文章将详细介绍Linux内核中内存管理的关键技术点,包括物理内存与虚拟内存的映射、页面置换算法、以及内存碎片的处理方法等。通过对这些技术点的解析,本文旨在为读者提供一个清晰的Linux内存管理框架,帮助理解其在现代计算环境中的重要性和应用。
    |
    2月前
    |
    存储 算法 安全
    深入理解Linux内核的内存管理机制
    本文旨在深入探讨Linux操作系统内核的内存管理机制,包括其设计理念、实现方式以及优化策略。通过详细分析Linux内核如何处理物理内存和虚拟内存,揭示了其在高效利用系统资源方面的卓越性能。文章还讨论了内存管理中的关键概念如分页、交换空间和内存映射等,并解释了这些机制如何协同工作以提供稳定可靠的内存服务。此外,本文也探讨了最新的Linux版本中引入的一些内存管理改进,以及它们对系统性能的影响。
    |
    8月前
    |
    算法 安全 Linux
    探索Linux内核的虚拟内存管理
    【5月更文挑战第20天】 在本文中,我们将深入探讨Linux操作系统的核心组成部分之一——虚拟内存管理。通过剖析其关键组件和运作机制,揭示虚拟内存如何提供高效的内存抽象,支持庞大的地址空间,以及实现内存保护和共享。文章将重点讨论分页机制、虚拟内存区域(VMAs)的管理、页面置换算法,并简要分析这些技术是如何支撑起现代操作系统复杂而多变的内存需求的。
    |
    2月前
    |
    缓存 算法 Linux
    Linux内核中的内存管理机制深度剖析####
    【10月更文挑战第28天】 本文深入探讨了Linux操作系统的心脏——内核,聚焦其内存管理机制的奥秘。不同于传统摘要的概述方式,本文将以一次虚拟的内存分配请求为引子,逐步揭开Linux如何高效、安全地管理着从微小嵌入式设备到庞大数据中心数以千计程序的内存需求。通过这段旅程,读者将直观感受到Linux内存管理的精妙设计与强大能力,以及它是如何在复杂多变的环境中保持系统稳定与性能优化的。 ####
    45 0
    |
    3月前
    |
    存储 算法 C语言
    MacOS环境-手写操作系统-15-内核管理 检测可用内存
    MacOS环境-手写操作系统-15-内核管理 检测可用内存
    58 0
    |
    5月前
    |
    算法 安全 UED
    探索操作系统的内核空间:虚拟内存管理
    【7月更文挑战第50天】 在现代操作系统中,虚拟内存管理是核心功能之一,它允许操作系统高效地使用物理内存,并为应用程序提供独立的地址空间。本文将深入探讨操作系统虚拟内存管理的机制,包括分页、分段以及内存交换等关键技术,并分析它们如何共同作用以实现内存的有效管理和保护。通过理解这些原理,读者可以更好地把握操作系统的内部工作原理及其对应用程序性能的影响。
    |
    7月前
    |
    算法 Java
    垃圾回收机制(Garbage Collection,GC)是Java语言的一个重要特性,它自动管理程序运行过程中不再使用的内存空间。
    【6月更文挑战第24天】Java的GC自动回收不再使用的内存,关注堆中的对象。通过标记-清除、复制、压缩和分代等算法识别无用对象。GC分为Minor、Major和Full类型,针对年轻代、老年代或整个堆进行回收。性能优化涉及算法选择和参数调整。
    82 3
    |
    7月前
    |
    Rust 安全 开发者
    探索Rust语言的内存安全特性
    【6月更文挑战第8天】Rust语言针对内存安全问题提供了创新解决方案,包括所有权系统、借用规则和生命周期参数。所有权系统确保值与其所有者绑定,防止内存泄漏;借用规则保证同一时间只有一个可变引用或多个不可变引用,消除数据竞争和野指针;生命周期参数则强化了引用的有效范围,提升安全性。通过这些特性,Rust帮助开发者编写出更健壮、安全的高性能软件,有望成为系统编程领域的领头羊。