GaussDB(DWS) CPU管控
1.cpu管控背景
cpu管控的目的就是通过划分cpu,让sql跑的有快有慢,根据业务情况进行cpu资源划分(隔离)。当然sql跑的快慢和cpu,内存,io,网络都有一些关系,这里只讨论cpu的影响因素,cpu管控可以在以下场景发挥作用
- 假设有两个用户user_fast和user_slow,业务对user_fast的sql实时性要求较高,比如要1s内返回结果,对user_slow用户的实时性要求不是很高,sql下发下去慢慢能返回结果就行,这个时候就可以使用cpu管控,通过cpu资源的控制,在有限的cpu资源下,分给user_fast更多的cpu资源,给user_slow较小的cpu资源。
- 假设现在很多用户都在集群上跑sql,有一个用户写的sql比较烂,只要这个用户的作业一下发,就会导致集群所有的sql都变的很慢,这种场景也可以通过cpu管控,把烂sql控制在一个cpu使用率范围内,让他自己慢,不要影响别的用户sql的执行时间。
2.总体介绍
Gaussdb(DWS)CPU的资源隔离是通过linux内核中,提供控制组群(CGroups)功能,可为操作系统中所运行任务(进程)的用户定义组群分配资源 -- 比如 CPU 时间、CPU核数,系统内存。CGroups提供的功能主要包括:限制进程组可以使用的资源数量、进程组的优先级控制、记录进程组已使用的资源数量、进程组隔离及进程组控制等。
Gauss200 OLAP资源管理在设计之初考虑到数据库系统、用户、作业不同维度的隔离性和可配置性,通过控制组的层级特性构造满足数据库场景的模型。如图1所示:
图1 Gauss200 OLAP控制组层次模型
GaussDB(DWS)资源管理提供四个维度的层次隔离和控制:
1.数据库程序与非数据库程序隔离
每个数据库集群系统在操作系统Cgroup上均含有单一的目录“Gaussdb:user”,其子目录包含该数据库集群管辖的所有程序(线程)。尤其在大数据平台上,通过控制数据库程序使用的资源,可防止数据库程序对其他应用的影响。
2.数据库常驻后备线程与执行作业线程隔离
“Backend”Cgroup下承载了数据库的所有常驻后备线程。“Class”Cgroup下承载了数据库中所有执行作业相关的线程。通常“Backend”Cgroup下的常驻后备线程占用资源很少,但AutoVacuum工作线程除外;由于执行AutoVacuum时占用资源很高,单独提供“Vacuum”Cgroup用于控制AutoVacuum工作线程使用的资源,可防止对执行作业的影响。
3.数据库多用户之间的隔离
通常数据库管理员创建多个用户(角色)用于执行不同的任务,资源管理为此提供接口,可以新创建属于某用户的控制组,控制组的名称和资源配比由系统管理员用户设定,其父目录为顶层“Class”Cgroup。结合资源池特性,用户、控制组和资源池进行关联,不同用户执行的作业使用不同的资源,实现资源互相隔离。
4.策略执行作业和批量拉链作业隔离
根据作业类型不同,在每个用户(角色)的“Class”控制组下面制定两类控制组,其中“Default Workload”类型控制组由用户自定义控制组名称及资源配比,可用于策略执行作业;“Timeshare Workload”类型控制组为每个“Class”控制组下的固定控制组,共含有4个,按照1:2:4:8的资源比例分配,可用于批量拉链作业。
3 CPU管控的配额和限额
3.1 配额
cpu配额是指按照cpu时间片来划分cpu资源,cpu时间片是给线程为就绪状态分配cpu资源的,配额只有在cpu的使用率达到饱和时,参数才会真正的生效,比如我划分了两个cpu的控制组,workloadA和workloadB,分别设置配额为50%。
- 当只使用workloadA跑作业的时候,是可以使用100%的cpu资源
- 当只使用workloadB跑作业的时候,也是可以使用100%的cpu资源
- workloadA和workloadB同时跑作业的时候,但是cpu没有跑满,比如只跑了60%的cpu,这个时候也不会真正的限制workloadA和workloadB的cpu资源,因为还有cpu时间片可以分配
- 只有把cpu跑满的时候,才会按照各个控制组设置的配额进行cpu资源的分配
这种cpu资源的划分的好处是能充分利用cpu资源,不会因为设置cpu的配额,在cpu空闲的情况下不能跑满cpu。
坏处是不能达到资源的硬隔离,作业的执行时间不能很好的控制,workloadA和workloadB的作业会相互影响,两个控制组的作业同时跑和分开跑,sql的执行时间会有差异。
3.2 限额
cpu限额就是绑定cpu核,设定的控制组的作业就跑在指定的cpu核上,这些核心由该用户独享。
这种设置的好处就是cpu资源隔离性好,各个控制组之间不会相互影响,作业的执行时间也比较稳定。比如严格要求有秒级接口,这种场景就需要严格的资源管控,保障秒级接口的快速响应,将CPU的影响因素降到最低,做到接口的稳定。坏处就是会有cpu资源的浪费,不能使用空闲的cpu资源。
3.3 租户
概念说明:
概念 |
说明 |
父租户 |
父租户在MPPDB数据库有对应的组用户,组用户虽然是用户但不实际使用,只充当记录各种资源的标签,父租户不能与数据库用户绑定,创建子租户前必须先创建父租户。 |
子租户 |
子租户在MPPDB数据库中有对应的资源池,与实际的数据库用户绑定。一个父租户下允许创建多个子租户。父租户下边的子租户,分享父租户的CPU资源的配置。 |
资源池 |
资源池是进行负载管理的基本单元,负责管理业务运行所需的系统资源(包括CPU、内存),并提供SQL的并发控制功能。用户通过绑定资源池可以实现对其下作业的资源管理和负载管理。 |
“父租户”、“子租户”的概念是针对客户的多租户业务场景设定的。
4 实践操作
从gs_cgroup –help解释一下各个参数的含义
4.1 界面操作
云上环境每创建一个工作负载队列都会创建一个父租户和子租户,实际使用的是子租户的资源池 。
线下环境可以创建父子资源池,父租户下边的子租户分享父租户的资源配置。
比如父租户设置了40%的CPU配额资源,在这个下边的子租户设置了50%的CPU配额资源,子租户的50%CPU配额是基于父租户的40%CPU配额资源,也就是占用总的CPU配额为40% * 50% = 20%,也就是子租户占用了总共CPU配额的20%的CPU资源,限额同理。
4.2 命令操作
4.2.1 创建父控制组和子控制组
gs_ssh -c "gs_cgroup -c -S group1" (创建第一个控制组group1,可以加-s 40 指定配置40%配额, 没有-s参数时默认配置20%cpu资源)
gs_ssh -c " gs_cgroup -c -S group2" (创建第二个控制组group2)
gs_ssh -c "gs_cgroup -u -S group2 -s 30 --fixed" (父控制group2,绑定30%的cpu核数)
gs_ssh -c " gs_cgroup -c -S group1 -G batch" (创建子控制组batch,父控制组为group1,可以加-g 30 指定配置30%配额, 没有-g参数时默认配置父控制组的20%cpu资源)
gs_ssh -c " gs_cgroup -c -S group2 -G query" (创建子控制组query,父控制组为group2, 可以加-g 30 指定配置30%配额, 没有-g参数时默认配置父控制组的20%cpu资源)
gs_ssh为在所有节点执行,-c参数后边跟执行的命令
-c 参数 创建一个控制组
-S 参数 指定的父控制组
-G 参数 指定子控制组
-s 参数 指定父控制组CPU配额或限额
-g 参数 指定子控制组CPU配额或者限额
--fixed 参数 绑定CPU核数(限额)
4.2.2 创建资源池
1)创建父资源池res_pool1,关联group1父控制组,创建子资源池batch_pool,关联group1:batch子cgroup控制组
CREATE RESOURCE POOL res_pool1 WITH (CONTROL_GROUP="group1");
CREATE RESOURCE POOL batch_pool WITH (CONTROL_GROUP="group1:batch");
2)创建父资源池res_pool2,关联group2父控制组,创建子资源池batch_pool,query_pool,关联group1:batch子cgroup控制组
CREATE RESOURCE POOL res_pool2 WITH (CONTROL_GROUP="group2");
CREATE RESOURCE POOL query_pool WITH (CONTROL_GROUP="group2:query");
4.2.3 创建资源池用户
1)创建父控制组group1的用户batch_user_group用户组用户,创建子用户batch_user,关联 batch_pool资源池
create user batch_user_group password 'Gauss_234' resource pool 'res_pool1';
create user batch_user password 'Gauss_234' resource pool 'batch_pool' user group 'batch_user_group';
2)创建父控制组group2的用户query_user_group用户组用户,创建子用户query_user,关联 query_pool资源池
create user query_user_group password 'Gauss_234' resource pool 'res_pool2';
create user query_user password 'Gauss_234' resource pool 'query_pool' user group 'query_user_group';
经过上边的以上操作就可以得到两个实际干活的用户,batch_user和query_user。
batch_user在group1父控制组(设置了20%CPU配额)下边,关联子控制组batch(设置了20%CPU配额),batch_user实际设置了20% (父控制组)* 20%(子控制组)= 4%的CPU配额。
query_user在group2父控制组(设置了30%的CPU限额,20%CPU配额)下边,关联子控制组query(设置了20%的CPU配额),因为query_user的父控制组设置CPU限额,所以作业只能占用30%的CPU核,在这30%CPU核资源上,可以使用20% (父控制组)* 20%(子控制组)= 4%的CPU配额。
4.2.4 创建结果显示
通过视图pg_resource_pool可以看到自己创建的资源池
gs_cgroup -p 显示cgroup的设置
父控制组为Class控制组
子控制组为Workload控制组
4.2.5 更新控制组cpu资源
gs_ssh -c " gs_cgroup -u -S group1 -s 30" (更新父控制组CPU配额为30%)
gs_ssh -c " gs_cgroup -u -S group1 -G batch -g 20" (更新子控制组batchCPU配额为20%)
gs_ssh -c " gs_cgroup -u –S group2 -s 20 --fixed" (更新父控制组group2CPU限额为20%)
-u 参数 更新控制组
-S 参数 指定的父控制组
-G 参数 指定子控制组
-s 参数 指定父控制组cpu配额或者限额
-g 参数 指定子控制组cpu配额或者限额
--fixed 参数 绑定CPU核数(限额)
5 推荐配置
CPU管控一般推荐使用配额,在秒级接口响应或者保证一些一类作业稳定运行的时候可以考虑使用CPU限额。
一般推荐用户设置两个资源池,CPU的配额设置比例为40%,60%。
- 点赞
- 收藏
- 关注作者
评论(0)