资源管理

相关参数

下表列出了可配置的资源组参数

参数 描述 取值范围 默认参数
CONCURRENCY 资源组中允许的最大并发事务数,包括活动事务和空闲事务。 [0 - 最大连接数] 20
CPU_MAX_PERCENT 配置资源组可以使用的CPU资源的最大百分比。 [1 - 100] -1 (未启用)
CPU_WEIGHT 配置资源组的调度优先级。 [1 - 500] 100
CPUSET 为该资源组保留的特定CPU逻辑核心(或超线程中的逻辑线程)。 依赖系统核心配置 -1
MEMORY_QUOTA 为资源组指定内存限制值。 整数(MB) -1 (未启用,使用 statement_mem 作为单次查询的内存限制)
MIN_COST 一个查询计划被包含在资源组中的最小成本。 整数 0
IO_LIMIT 对设备 I/O 使用情况进行设置,以管理读写操作的最大吞吐量和每秒最大读写操作数。按表空间设置该值。 [2 - 4294967295 or max] -1

注意!
针对 SET / RESET / SHOW 命令,资源组不会生效

设置说明

当用户运行查询时,YMatrix 会根据为资源组定义的一组限制来评估查询状态。

并发资源管理

CONCURRENCY 控制资源组允许的最大并发事务数。默认限制值为 20,值为 0 时表示此资源组不允许运行查询。
如果资源限制尚未达到且查询不会导致超出资源组的并发事务限制,YMatrix 会立即运行查询。如果已达到资源组的最大并发事务数,YMatrix 会将资源组达到其 CONCURRENCY 限制后提交的任何事务排队,并且等到其他查询完成后进行运行。

gp_resource_group_queuing_timeout 可以用来指定队列中事务取消前的等待时间。默认为 0,意味着事务无限期排队。

绕过资源组分配限制

  • gp_resource_group_bypass 用于启用或禁用资源组的并发事务限制,使查询可以立即执行。设为 true,查询就会跳过资源组的并发限制。此时查询的内存配额按照 statement_mem 进行分配,如果内存不足,查询就会失败。此参数只能在单个会话中设置,不能在事务或函数内设置。
  • gp_resource_group_bypass_catalog_query 用于系统表查询是否跳过资源组的资源限制。默认为 true。适用于类似数据库的图形用户界面(GUI)客户端运行目录查询以获取元数据的情况。其资源分配在资源组之外,内存配额为每个查询的 statement_mem
  • gp_resource_group_bypass_direct_dispatch 用于控制直接分发查询(direct dispatch queries)是否跳过资源组的限制。将其设为 true,查询时将不再受其所属资源组分配的 CPU 或内存限制的约束,从而可以立即执行。此时查询的内存配额按照 statement_mem 进行分配,如果内存不足,查询就会失败。此参数只能在单个会话中设置,不能在事务或函数内设置。

CPU 资源管理

YMatrix 通过以下两种方式分配 CPU 资源:

  1. 分配指定百分比的 CPU 资源
  2. 分配特定的 CPU 核心(Core)

在同一群集上可以为不同的资源组配置不同的 CPU 资源分配模式,同一资源组只能使用一种 CPU 资源分配模式。 运行时也可更改资源组的 CPU 资源分配模式。

可通过 gp_resource_group_cpu_limit 来确定要分配给每个 segment 节点的资源组的系统 CPU 资源的最大百分比。

通过核心(Core)分配 CPU 资源

CPUSET 用于设置要为资源组保留的 CPU 核心。当为资源组配置 CPUSET 时,YMatrix 会停用该组的 CPU_MAX_PERCENTCPU_WEIGHT,并将其值设置为 -1

使用注意:

  • 使用分号 (;) 分隔主节点和 segment 节点指定 CPU 核心,。使用逗号(,)分隔的单核编号或编号区间列表,且需将核心编号/区间列表使用单引号(' ')括起来。例如,'1;1,3-4' 在主节点上使用 core1,在 segment 上使用core 1、core 3 和 core 4。
  • 避免使用 CPU core0,其次将 core 分配给资源组时,使用尽可能低的核心数。如果替换数据库节点,并且新节点的 CPU 核心数少于原始节点,或者如果备份数据库并希望在具有较少 CPU 核心的节点的集群上恢复它,则操作可能会失败。例如,如果数据库集群有 16 个core,则分配 core 1-7 是最佳选择。如果创建资源组并将 CPU core 9 分配给该组,则将数据库恢复到 8 核节点将失败。

通过百分比分配 CPU 资源

CPU_MAX_PERCENT 用于设置 segment 可以使用的 CPU 资源上线,比如设置为 40,表明最多可以使用可用 CPU 资源的 40%。当资源组中的任务处于空闲状态且未使用任何 CPU 时间时,剩余时间将被收集到未使用 CPU 周期的全局池中,其他资源组可以从此池中借用 CPU 周期。

CPU_WEIGHT 用于分配当前组的调度优先级。默认值是 100,取值范围是 1 到 500。该值指定了资源组中任务可获得的相对份额的 CPU 时间。

使用注意:

  • 如果一个资源组的相对份额是 100,另外两个资源组的相对份额是 50,当所有资源组中的进程都试图使用 100% 的 CPU(即所有组的 CPU_MAX_PERCENT 值都设置为 100)时,第一个资源组将获得 50% 的总 CPU 时间,另外两个组各获得 25%。
  • 如果再次添加一个相对份额为 100 (CPU_MAX_PERCENT 设置为 100)的组,则第一个组只能使用 33% 的 CPU,剩下的组分别获得 16.5%、16.5% 和 33%。

配置说明

Group Name CONCURRENCY CPU_MAX_PERCENT CPU_WEIGHT
default_group 20 50 10
admin_group 10 70 30
system_group 10 30 10
test 10 10 10
  • 默认组(default_group)中角色根据 CPU_WEIGHT 参数所确定的可用 CPU 百分比为 10/(10+30+10+10)=16%。这意味着在系统负载较高时,它们至少可以使用 16% 的CPU资源。当系统存在空闲 CPU 资源时,它们可以使用更多资源,因为硬限制(由 CPU_MAX_PERCENT 设置)为50%。
  • 管理组(admin_group)中角色在系统负载较高时的可用 CPU 百分比为 30/(10+30+10+10)=50%。当系统有空闲 CPU 资源时,它们可以使用的资源上限由硬限制 70% 决定。
  • 测试组(test)中角色的可用 CPU 百分比为 10/(10+30+10+10)=16%。然而,由于硬限制(由CPU_MAX_PERCENT 确定)为 10%。因此即使在系统空闲时,它们也只能使用最多 10% 的资源。

内存资源管理

MEMORY_QUOTA 表示 Segment 上为该资源组保留的最大内存量。这是查询执行期间 Segment 上所有查询的工作进程可以消耗的总内存量。分配给某个查询的内存量是该组内存限制除以该组并发限制:MEMORY_QUOTA / CONCURRENCY

如果一个查询需要更大内存,可以使用 gp_resgroup_memory_query_fixed_mem 在会话级别为查询设置所需内存量,该配置可覆盖并超过资源组分配的内存。

使用注意

  • 如果设置了 gp_resgroup_memory_query_fixed_mem,会使用设置值来绕过资源组设置。
  • 如果未设置 gp_resgroup_memory_query_fixed_mem,会使用 MEMORY_QUOTA / CONCURRENCY 作为查询分配的内存量。
  • 如果未设置 MEMORY_QUOTA,则查询内存分配的值默认为 statement_mem
  • 对于所有查询,如果系统中没有足够的内存,它们就会溢出到磁盘。当达到限制 gp_workfile_limit_files_per_query 时,YMatrix 会生成内存不足 (OOM) 错误。

配置示例
考虑一个名为 adhoc 的资源组,MEMORY_QUOTA 设置为 1.5 GB,CONCURRENCY 设置为 3。默认情况下,提交给该组的每个语句都分配 500MB 的内存。现在考虑以下一系列事件:

  • 用户 ADHOC_1 提交查询 Q1,覆盖 gp_resgroup_memory_query_fixed_mem 到800MB。Q1 语句被允许进入系统。
  • 用户 ADHOC_2 提交查询 Q2,使用默认的 500MB。
  • Q1Q2 仍在运行的情况下,用户 ADHOC_3 提交查询 `Q3,使用默认的 500MB 。
  • 查询 Q1Q2 已经使用了该资源组 1500MB 中的 1300MB。但是,如果某些时段系统有足够的可用内存用于查询 Q3Q3 则可以正常运行。
  • 用户 ADHOC_4 提交查询 Q4,使用 gp_resgroup_memory_query_fixed_mem 设置为 700MB。 由于查询 Q4 绕过资源组限制,他会立即运行。

特殊使用注意事项

  • 如果 gp_resource_group_bypassgp_resource_group_bypass_catalog_query 设置配置参数以绕过资源组限制,则查询的内存限制值为 statement_mem
  • 当( MEMORY_QUOTA / CONCURRENCY)< statement_mem 时,则使用 statement_mem 作为查询分配的固定内存量。
  • statement_mem 的最大值上限为 max_statement_mem
  • 查询计划成本低于限制值 MIN_COST 的查询语句,使用 statement_mem 作为内存配额。

I/O 资源管理

IO_LIMIT 限制分配给特定资源组查询的最大读写磁盘 I/O 吞吐量,以及每秒最大读写 I/O 操作数。确保高优先级资源组的使用,并避免磁盘带宽的过度使用。该参数的值需按表空间来进行设置。

注意!
IO_LIMIT 仅 Cgroup v2 支持。

在进行磁盘 I/O 限制时,可通过以下参数进行配置:

  • 设置需要限制的表空间名称或表空间对象 ID (OID)。或使用 * 为所有表空间设置限制。
  • rbpswbps 用于限制资源组中磁盘 I/O 的最大读写吞吐量,单位为 MB/s。默认值为 max,表示无限制。
  • riopswiops 用于限制资源组中每秒的最大读写 I/O 操作数。默认值为 max,表示无限制。

配置说明

如果未设置 IO_LIMIT 参数,则 rbpswpbsriopswiops 的默认值将设置为 max,这意味着磁盘 I/O 无限制。如果仅设置了 IO_LIMIT 的部分值(如,rbps),则未设置的参数将默认为 max(在本例中,则为 wbpsriopswiops 为默认值 `max)。