GaussDB(DWS) 资源管理技术浅析
1. 前言
- 适用版本:【8.1.1及以上】
通过引入资源监控和控制等手段,实现资源在可控的情况下被合理利用的目的,避免出现资源的无序使用,防止数据库系统性能变慢、停止响应。
2. 资源管理简介
通过引入资源监控和控制等手段,实现资源在可控的情况下被合理利用的目的,避免出现资源的无序使用,防止数据库系统性能变慢、停止响应。资源管理可以实现以下功能:
- 通过创建和管理队列,实现队列级别资源(CPU、内存、存储空间)隔离和作业的异常处理;
- 通过设置CN和队列的并发上限,限制允许运行的并发数,超出并发数后作业排队等待唤醒,防止并发过多导致性能下降;
- 通过优先级控制实现资源的有效调度,实现高优先级作业优先运行;
- 支持多维度资源监控视图,可以监控作业、用户和实例的资源消耗。
3. 资源管理功能
4. 资源管理框架
用户连接数据库执行SQL后,SQL会经过全局并发队列管控以及资源池队列管控。在作业进入管控逻辑前设置定时器,作业pending超时报错退出,作业经过队列管控开始运行前重新设置定时器,作业运行超时报错退出。作业下推DN执行时实时监控作业消耗的资源并上报CN,CN根据DN上报资源信息提供异常处理和监控视图。
下面对并发、内存和CPU管控配置方式进行简要说明:
-
全局并发队列
全局并发队列采用GUC参数max_active_statements控制单个CN上运行并发执行的作业数量。采用全局并发队列机制将控制所有普通用户的执行作业,不区分复杂度,即执行语句都将作为一个执行单元,当并发执行的作业数量达到此参数阈值时,将进入队列等待。对于初始用户(Oid=10)执行的作业,不走全局并发控制逻辑。
注:max_active_statements限制单CN上运行的作业数,默认值为60,假设用户有3个DN,则实际全局并发上限为3*60=180;DDL和DML语句均受max_active_statements并发控制。 -
资源池并发队列
资源池并发队列包含快车道并发队列和慢车道并发队列,配置方式如下:CREATE RESOURCE POOL respool_a WITH (max_dop=10,active_statements=5);
其中max_dop为快车道并发上限,active_statements为慢车道并发上限。
注:资源池队列只限制DML语句,不限制DDL语句;
max_dop限制单CN上资源池快车道并发数;
active_statements在静态负载管理模式下限制单CN上资源池慢车道并发数,在动态负载管理模式下限制所有CN上资源池慢车道并发数值。 -
内存管控
实例级别内存管控:guc参数max_process_memory限制DN和CN实例的最大可用内存,当使用内存超过max_process_memory时,作业报错退出;
可动态申请内存:max_dynamic_memory=max_process_memory-cstore_buffers(max_cstore_memory)-(udf_memory_limit - 200M) - max_shared_memory;
资源池内存管控:使用并发点数计算可执行的并发数量,active_statements<=0情况下资源池内存不受控。资源池总点数:total_points = active_statements * 100,作业使用点数:active_points = (estimate_mem/respool_mem) * active_statements * 100,estimate_mem为优化器估算的作业内存,资源池点数耗尽触发排队。 -
CPU管控
GaussDB(DWS)主要利用cgroups做cpu资源的管控,涉及cpu、cpuacct、cpuset子系统,cpu配额管控基于cpu子系统的cpu.shares实现,该配置方法的好处是:OS cpu没有占满的情况下,不触发cpu管控;cpu限额管控基于cpuset实现;cpuacct子系统主要用于cpu资源使用的监控。
使用gs_cgroup工具设置cpu限额和配额,gs_cgroup工具常用命令如下:
- root用户挂载cgroup
gs_cgroup -U user -d #删除当前挂载信息
gs_cgroup -U user -c -H homepath [-D mountpath] --upgrade
- 创建Class控制组
gs_cgroup -S class1 -s 40 -c
- 创建Workload控制组
gs_cgroup -S class 1 -G wg1 -c
- 为控制组分配cpu配额
gs_cgroup -S class 1 -G wg1 -g 20 -u
- 设置cpu限额
gs_cgroup -S class 1 -G wg1 -g 30 -u –fixed
- 删除控制组
gs_cgroup -S class 1 -G wg1 -d
- 查看控制组信息
gs_cgroup -p #静态配置文件信息
gs_cgroup -P #挂载信息(树形结构)
- 查询规则
设置查询规则
gs_cgroup -S class -G wg -E "blocktime=1200,elapsedtime=2400" –a
gs_cgroup -S class -G wg -E "spillsize=256,broadcastsize=100" –a
gs_cgroup -S class -E "allcputime=100" –penalty
gs_cgroup -S class -E "qualificationtime=2400,cpuskewpercnt=90
查询异常规则
select gs_respool_exception_info('rp_name')
cpu管控原理:
- cgroup挂载:使用root用户挂载cgroup;
gs_cgroup -U user -c -H homepath [-D mountpath] --upgrade
- cgroup创建:使用数据库安装用户创建cgroup;
gs_cgroup -S class1 -G wg1 -c
- cgroup关联资源池:创建组资源池pr1关联class控制组class1,创建业务资源池resp1关联workload控制组wg1
CREATE RESOURCE POOL pr1 WITH(CONTROL_GROUP='class1');
CREATE RESOURCE POOL resp1 WITH(CONTROL_GROUP='class1:wg1');
- 用户关联资源池:创建组用户role1关联组资源池pr1,创建业务用户usr1关联业务资源池resp1
CREATE ROLE role1 RESOURCE POOL 'pr1' PASSWORD disable;
CREATE USER usr1 RESOURCE POOL 'resp1' PASSWORD 'Gauss_234' USER GROUP 'role1';
- 使用业务用户usr1执行复杂作业,作业执行过程中调用api函数cgroup_attach_task将作业attach到class1:wg1控制组上实现cpu管控。
5. 总结
本文主要对资源管理中的计算资源和存储资源的管控进行了介绍,着重对全局并发队列、资源池并发队列、资源池并发队列和CPU管控管控原理进行说明。
- 点赞
- 收藏
- 关注作者
评论(0)