GaussDB(DWS) 资源管理技术浅析

举报
门前一棵葡萄树 发表于 2021/02/10 15:40:30 2021/02/10
【摘要】 通过引入资源监控和控制等手段,实现资源在可控的情况下被合理利用的目的,避免出现资源的无序使用,防止数据库系统性能变慢、停止响应。

1. 前言

  • 适用版本:【8.1.1及以上】

通过引入资源监控和控制等手段,实现资源在可控的情况下被合理利用的目的,避免出现资源的无序使用,防止数据库系统性能变慢、停止响应。

2. 资源管理简介

通过引入资源监控和控制等手段,实现资源在可控的情况下被合理利用的目的,避免出现资源的无序使用,防止数据库系统性能变慢、停止响应。资源管理可以实现以下功能:

  1. 通过创建和管理队列,实现队列级别资源(CPU、内存、存储空间)隔离和作业的异常处理;
  2. 通过设置CN和队列的并发上限,限制允许运行的并发数,超出并发数后作业排队等待唤醒,防止并发过多导致性能下降;
  3. 通过优先级控制实现资源的有效调度,实现高优先级作业优先运行;
  4. 支持多维度资源监控视图,可以监控作业、用户和实例的资源消耗。

3. 资源管理功能

4. 资源管理框架

用户连接数据库执行SQL后,SQL会经过全局并发队列管控以及资源池队列管控。在作业进入管控逻辑前设置定时器,作业pending超时报错退出,作业经过队列管控开始运行前重新设置定时器,作业运行超时报错退出。作业下推DN执行时实时监控作业消耗的资源并上报CN,CN根据DN上报资源信息提供异常处理和监控视图。

下面对并发、内存和CPU管控配置方式进行简要说明:

  1. 全局并发队列
    全局并发队列采用GUC参数max_active_statements控制单个CN上运行并发执行的作业数量。采用全局并发队列机制将控制所有普通用户的执行作业,不区分复杂度,即执行语句都将作为一个执行单元,当并发执行的作业数量达到此参数阈值时,将进入队列等待。对于初始用户(Oid=10)执行的作业,不走全局并发控制逻辑。
    注:max_active_statements限制单CN上运行的作业数,默认值为60,假设用户有3个DN,则实际全局并发上限为3*60=180;DDL和DML语句均受max_active_statements并发控制。

  2. 资源池并发队列
    资源池并发队列包含快车道并发队列和慢车道并发队列,配置方式如下:
    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上资源池慢车道并发数值。

  3. 内存管控
    实例级别内存管控: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为优化器估算的作业内存,资源池点数耗尽触发排队。

  4. 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管控管控原理进行说明。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。