写点什么

一文了解数据库资源管理技术

发布于: 2021 年 03 月 22 日

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


本文分享自华为云社区《GaussDB(DWS) 资源管理技术浅析》,原文作者:门前一棵葡萄树。

1、资源管理是什么?

1.1    资源管理简介


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


1.    通过创建和管理队列,实现队列级别资源(CPU、内存、存储空间)隔离和作业的异常处理;

2.    通过设置 CN 和队列的并发上限,限制允许运行的并发数,超出并发数后作业排队等待唤醒,防止并发过多导致性能下降;

3.    通过优先级控制实现资源的有效调度,实现高优先级作业优先运行;

4.    支持多维度资源监控视图,可以监控作业、用户和实例的资源消耗。

1.2    资源管理功能



​资源管理主要包含并发控制、资源管控、资源监控以及异常作业处理。并发控制主要分为全局并发控制和资源池并发控制,其中资源池并发管控由快慢车道实现,快车道管控简单作业,慢车道管控复杂作业,支持自动识别和手动切换快慢车道,理论上快车道并发大、作业运行时间短、占用资源少;慢车道并发少、作业运行时间长,占用资源多。


资源管控通过对计算资源和存储资源分别管控实现作业间资源隔离,保证单作业异常不会影响到其他作业运行。下面分别对计算资源和存储资源管控进行概述:


1.    计算资源

计算资源包含:CPU、IO 和内存。GaussDB 中 CPU 和内存资源关联在队列上,用户通过关联队列使用计算资源。队列按使用场景分为超户队列、默认队列和用户队列。其中超户队列不受资源管控,用于运维和故障修复;默认队列(default_pool)为数据库初始化阶段创建的队列,未关联用户队列的用户使用默认队列;用户队列为用户自己创建的队列,按照用户配置的并发和资源进行管控。IO 管控基于逻辑 IO 实现,根据作业运行时间及优先级对 IO 进行管控,配置异常处理规则后,在系统 IO 达到瓶颈后,主动降低作业 IO 优先级。


2.存储资源

存储资源管控包含以下几个方面:


  • 数据库只读检测

数据库只读检测主要为防止出现磁盘满的问题,实现逻辑如下:cm_server 开启 enable_transaction_read_only 情况下,每十分钟检查一次磁盘空间占用率,当 磁盘空间占用率超过阈值(默认 90%)时,就通过 guc 参数设置数据库只读,数据库只读后只允许只读作业运行,作业发生写盘操作报错退出。但是因为数据库只读会导致用户所有业务无法运行,因此在磁盘空间占用率达到 80%时会提前告警提示用户。


  • 用户/schema 空间管控

存储资源包含:持久表空间、临时表空间和算子落盘空间。临时表空间和算子落盘空间是作业运行过程中占用的空间,属于临时占用空间。持久表空间和临时占  用空间采用两种不同的管控策略,持久表空间管控通过对用户(队列)和 schema 空间限制实现,8.1.1 版本之后的 GaussDB 空间管控均为单实例空间,防止出现数据倾斜导致的磁盘使用问题。临时占用空间同样支持在用户层级设置空间限额,另外还提供异常规则查杀临时空间占用异常的作业。


  • 异常处理规则

GaussDB 目前支持算子落盘异常规则,用户通过管控面或 gs_cgroup 工具设置算子落盘异常规则,设置异常规则后作业执行过程中算子落盘空间达到阈值后报错退出。

1.3   资源管理框架



​用户连接数据库执行 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 RESOURCEPOOL 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 主要利用 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 管控。


点击关注,第一时间了解华为云新鲜技术~


发布于: 2021 年 03 月 22 日阅读数: 17
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
一文了解数据库资源管理技术