1 资源管理概述
1.1 资源管理的作用和分类
从用户的角度看可以通过设定阈值或者优先级限定程序对资源的使用,保证承诺的服务等级 (SLA);同时满足不同用户间资源隔离,达成多租户的需求。
从系统的角度看,可以引入监控和控制等手段,实现资源在可控的情况下被合理利用的目的,避免 资源耗尽,防止系统停止响应、崩溃;根据任务优先级,保证服务等级协议(SLA);在资源富裕时,实现资源最 大化利用;实现动态资源负载平衡,处理引起资源使用不平均的runaway作业。
GaussDB 资源管理功能主要分为多租户管理资源隔离、负载管理、优先级控制、多维度资源监控等几个方面。下文将就这几个方面的功能展开具体介绍。
1.2 资源负载管理架构
GaussDB的资源负载管理主要包括资源分配与隔离(或管控)(CPU、内存、 IO和存储空间)、作业负载管理、优先级调度、资源监控、多租户服务等。其服务于 作业的整个生命周期,贯穿数据库内核的各个模块中。整体架构如下图:
2 DWS多租户管理
2.1 多租户管理实现方法
GaussDB采用两层用户的架构来组织租户(新版本中可能修改为单层架构)。一个组用户下可以有 多个业务用户,但一个业务用户只 能属于一个组用户;不同的租户(数据库用户)关联不 同的资源池, 每个资源池通过 CGroup控制CPU资源,通过逻辑内 存管理机制控制内存使用;资源池分配以百分比的形式提供用 户计算资源的隔离,数据库集群部 署环境对用户透明;创建用户时,指定用户持久化存储 空间大小,结合用户权限,提供用 户存储资源的隔离。存储空间大小 可在组用户级别指定,统筹所有业 务用户的存储空间。
2.2 多租户管理分层架构图
3 CPU资源负载管理
3.1 CPU资源管理方法
GaussDB的CPU资源管理是通过控制组(Control Group,CGroup)来实现的。 CGroup是Linux内核提供的一种限制、记录、隔离进程组所使用的物理资源(如CPU、 Memory、I/O等)的机制。
考虑到数据库系统、用户、作 业不同维度的隔离性和可配置 性,Gauss200 OLAP使用控制 组的层级特性构造符合数据库 场景的模型,满足客户SLA的 关键特性,并支持四个维度的 层次隔离和控制:
(1)、数据库程序与非数据库程序隔离
(2)、数据库常驻后备线程与执行作业线程隔离
(3)、数据库多用户之间的隔离
(4)、策略执行作业和批量拉链作业隔离
Gauss200 OLAP提供CPU核数隔离特性,实现指定控制组能够使用的CPU核,达到在CPU资 源上的隔离,使不同的控制组互不干扰,为多租户场景提供支持。
3.2 CPU资源管理架构
图中是控制组的一个挂载树,从最上层开始,就分为了两部分,一部分是属于Gaussdb的资源,一部分是留给系统其他进程使用的资源,我们使用的资源如图所示,都是挂载到Gaussdb:gaussdba的,其中第一层又分为两个控制组,Backend用来预留资源给数据库常驻的各个工作线程,Class控制组的资源用来分配给各个用户进行作业执行。
我们每创建一个父租户,就会对应创建一个UserClass1-n挂载到Class控制组下,去从Class控制组分到对应配额的CPU资源。而我们创建的子租户,会从他们的父租户那里分配资源,当前我们支持两层的架构,父租户对应数据库中的组用户,子租户对应数据库中的业务用户。
总体来说可以这样表述:给父租户分配40%的CPU,此时子租户将父租户的40%当做100%来分配,比如子租户A设置配额为50%,那么实际上是相当于分配了整体CPU资源的40%*50%=20%。
3.3 CPU优先级控制
GaussDB的优先级调度是根据控制组分配的CPU资源份额来实现的。用户在创建时, 需要绑定到一个控制组,限定其能够使用的CPU资源份额,该份额以百分比的形式指定, 份额越大,其优先级越高
Gauss200 OLAP还支持动态调整优先级,即在运行过程中,用户可以修改作业的优先级, 具体的实现分为以下几种情况:
(1)、调整资源池的优先级。
gs_ssh -c "gs_cgroup -u –S class1 –g 10 “
Create resource pool respool2 with (control_group= ‘Class1:Rush ’);
(2)、调整当前用户的优先级。调整用户的优先级可以通过调整其绑定的资源池来修改。
ALTER USER joe WITH RESOURCE POOL ' respool2 ';
(3)、调整当前会话的优先级或者执行作业时自动通过用户关联。
SET CGROUP_NAME=" class1:Rush ";
(4)、手动调整任务在队列中的位置(超级用户)。
SELECT pg_wlm_jump_queue(pid);
4 IO资源管理
GaussDB的IO资源管理基于数据内部的逻辑IO读写次数进行统计、监控、调度,实 现对于复杂作业的IO资源管控,提升查询作业的性能。新版本将能够做到对IOPS做到更加精确的控制。同时可以使用百分比权重方式分别对session和资源池级别配置。现阶段做不到IO资源的完全隔离。
5 内存资源管理
GaussDB的内存管理是通过逻辑内存管理来实现的。其实现原理是在原始的内存分 配之上增加一层逻辑内存管理,通过检查已分配内存是否超过规定的内存来决定是否为 作业分配内存。逻辑内存管理没有更改原有的内存资源分配机制,仅在分配内存之前增加一个逻辑判断 层,查看是否达到允许使用的内存上限,来决定是否分配内存。
GaussDB对于内存资源的管理分为三级:
6 存储资源管理
总体来说目前是采用逻辑记账的原理,对实际的插入空间进行记账,然后对这个值与设置的限制进行对比,若超出限制将会报错。
目前用户磁盘空间管控在CN上实现,CN每间隔5s从DN收集一次用户磁盘空间,每次通信只收集一个用户的磁盘空间,当用户量很大的时候可能出现延迟。同时虽然CN上的管控可以限制用户使用的空间,但是无法限制用户在某个DN上使用的空间,也就无法避免数据倾斜造成的磁盘空间占用过多的问题。
在新版本中将从根本上解决这个问题,从单DN用户磁盘空间进行管控,保证单DN上使用的磁盘空间不会超过限制,避免单DN占用磁盘空间的问题,同时也行从一定程度上防止用户数据过度倾斜。
7 资源监控
GaussDB提供的详细的资源监控视图对资源使用情况进行记录和监控,查看实时资源占用的情况查看以下视图:
查询历史资源使用情况: