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

1 资源管理是什么?

1.1 资源管理简介

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

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

1.2 资源管理功能

做好数据库运维,资源管理技术必须要掌握-LMLPHP

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

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

(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 资源管理框架

做好数据库运维,资源管理技术必须要掌握-LMLPHP

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

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

03-25 08:21