GaussDB DWS中的内存资源配置实践

GaussDB提供了资源负载管理手段,来均衡任务对系统资源的利用。

资源负载管理实现如下功能:

  • 通过创建并管理租户,实现按租户进行系统资源(CPU、内存、IO、存储空间)的隔离和作业的异常处理。
  • 通过限制集群和资源池允许运行的并发量,超出并发量的作业进行排队,以保证重点业务的运行,防止并发过多导致的性能下降。
  • 通过优先级控制实现对资源的有效调度,高优先级的作业得以优先执行。
  • 支持多维度的资源监控视图,可以查看作业的实时资源记录和历史资源记录。

相关概念

资源管理

GaussDB DWS对于系统资源的管理范围包含CPU资源、内存资源、IO资源和存储资源。通过对系统的资源进行合理的分配,避免发生资源的不合理占用导致系统运行效率下降或者引发系统运行问题。

负载管理

GaussDB DWS通过对业务的并发控制,实现系统负载的均衡。避免业务间争抢资源,实现所有作业的和谐共处,达到资源利用最优。

控制组

控制组(Cgroups)是control groups的缩写,是Linux内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如:CPU、内存、IO等)的机制。如果一个进程加入了某一个控制组,该控制组对Linux的系统资源都有严格的限制,进程在使用这些资源时,不能超过其最大限制。更多Cgroups的原理介绍,请查看相关操作系统的产品手册。

资源池

资源池(Resource Pool)是GaussDB提供的一种配置机制,用于对主机资源(内存、IO)进行划分并提供SQL的并发控制能力。资源池通过绑定Cgroups对资源进行管理。用户通过绑定资源池可以实现对其下作业的资源负载管理。

本文简单介绍GaussDB内存资源管理的配置部分。

内存是GaussDB 运行的一个关键资源,如果能够有效利用,可以提升业务查询性能。

内存管理分为如下三个类型:

实例级别的内存管理

通过设置系统级别的GUC参数“max_process_memory”,可以对数据库实例的最大可用物理内存进行管理。当作业申请的内存超过了给定限制时,会因为内存申请失败触发异常处理。根据实例在执行业务时的不同分工,需要的内存大小也不同。

资源池级别的内存管理

通过设置资源池的参数“MEM_PERCENT”,可以对资源池的内存进行管理。

作业级别的内存管理

通过设置session级别的GUC参数“query_mem”,可以对作业可用内存进行管理。

对内存资源管理进行配置的前提条件是逻辑内存管理功能已经开启,即参数enable_memory_limit已设置为“on”。

如果此参数为“off”,则通过gs_guc set -Z coordinator -Z datanode -N all -I all -c "enable_memory_limit=on"来开启逻辑内存管理功能。

参数描述如下:

-N all:表示集群所有主机。

-I all:表示实例主机中所有的实例。

enable_memory_limit:为逻辑内存管理模块的开关。

coordinator/datanode:表示执行该配置的实例类型为CN/DN实例。

  • 通过下列步骤可以配置数据库实例级的内存管理:

1、设置数据库DN实例的最大可用内存。max_process_memory为实例的最大可用内存,datanode表示执行该配置的实例类型为DN实例。

      gs_guc set -Z datanode -N all -I all -c "max_process_memory=32GB"

2、设置数据库CN实例的最大可用内存。根据经验,推荐将CN的最大可用内存设置为与DN一致,coordinator表示执行该配置的实例类型为CN实例。

      gs_guc set -Z coordinator -N all -I all -c "max_process_memory=32GB"

3、重启集群并执行作业。

     gs_om -t stop && gs_om -t start

  • 通过下列步骤可以配置资源池级别的内存管理:

修改资源池“resource_pool_a1”的内存比例为可用内存大小的20%,即设置MEM_PERCEN的取值为20。

多租户场景下:MEM_PERCENT的取值设置为"x"(1<=x<=100),表示设置资源池使用的内存大小为可用内存大小的"x%",查询作业将使用给定的内存来运行。

非多租户场景下:

当MEM_PERCENT参数取值为0时,查询作业的内存不受限。

当MEM_PERCENT参数取值为"x"(1<=x<=100)时,表示设置资源池使用的内存大小为可用内存大小的"x%",查询作业将使用给定的内存来运行。

ACTIVE_STATEMENTS取值范围为 -1 ~ INT_MAX, 默认值为10,建议使用该默认值。当设置为0或者-1时,内存不受限制。

  • 通过下列步骤可以配置作业级的内存管理:


1、设置query_mem为500MB

     set query_mem='500MB';

2、当结果显示为如下信息,则表示设置成功。

     SET

3、执行作业。

     如果query_mem超过资源池可用内存的上限或者低于256MB时,query_mem将不起作用,作业依然使用work_mem。

  • 查看内存资源的配置信息

           查询实例级别的内存设置

show max_process_memory;

查看资源池级别的内存设置

select * from pg_resource_pool;

查看作业级别的内存设置

show query_mem;

  • 内存监控

         查看当前CN的内存使用情况。

        SELECT * FROM pg_total_memory_detail;

        

       查询整个集群的内存使用情况

        通过视图pgxc_total_memory_detail查询,必须具有sysadmin权限。

        

1.png

(完)