GaussDB 重要内存参数设置

举报
HuaweiCloudDeveloper 发表于 2024/12/25 12:12:34 2024/12/25
【摘要】 GaussDB 内存参数设置是否合理,也要根据实际的业务场景,其目的使服务器资源的最大化利用,设置的合理可以提升性能。

1 引言

GaussDB的内存管理是通过逻辑内存管理来实现的。其实现原理是在原始的内存分配之上增加一层逻辑内存管理,通过检查已分配内存是否超过规定的内存来决定是否为作业分配内存,设置合理的内存参数使内存资源合理的利用。

2 技术背景

2.1 GaussDB内存模型

内存是GaussDB运行的一个关键资源,如果能够有效利用,可以提升业务查询性能。以下是内存模型图,从这个模型图来分析,GaussDB将数据库进程最大内存分成三个块,分别为动态内存、共享内存与其它内存(动态库+jemalloc缓存内存)。动态内存中会话内存与全局内存主要是缓存SQL执行计划

其中,使用gs_total_memory_detail视图查看相关指标:

  •  逻辑内存管理参数为max_process_memory:用于控制数据库上可用内存的最大峰值。
  • cstore_buffers:设置列存表所使用的共享缓冲区的大小。
  • shared_buffers:设置数据库使用的共享内存大小,用于缓存事务交易中的数据。
  • work_mem:设置内部排序操作和Hash表在开始写入临时磁盘文件之前使用的内存大小,一量work_mem限定的物理内存不够,算子运算数据将写入临时表空间,带来5~10倍的性能下降。
  • Maintrnance_work_mem:设置在维护性操作(如:vacuumcreate index)中可使用的最大的内存

2.2 GaussDB内存资源管理

GaussDB对内存资源管理类型分为以下4种:

内存管理方式

说明

实例级别的内存管理

通过设置系统级别的GUC参数max_process_memory 可以对数据库实例的最大可用物理内存进行管理。当作业申请的内存超过了给定限制时,会因为内存申请失败触发异常处理。

说明:

根据实例在执行业务时的不同分工,需要的内存大小也不同。以DN为例,可以参见max_process_memory设定的公式进行计算。

资源池级别的内存管理

通过设置资源池的参数max_dynamic_memory、max_shared_memory,可以对资源池可用的内存进行管理。

session级别的内存管理

通过设置session级别的GUC参数设置session_max_dynamic_memory,可以对SESSION可用内存进行管理。

SQL级别的内存管理

通过设置session级别的GUC参数设置query_max_mem,可以对SQL可用内存进行管理。

要设置4种类型内存资源管理的前提要开启逻辑内存管理功能:即设置enable_memory_limit为on。

2.2.1 实例级的内存管理

数据库管理员可以通过下列步骤实现数据库实例级的内存管理。

1) 查看逻辑内存管理功能的启用状态。

Gaussdb#SHOW enable_memory_limit;
  • 若结果为on,则开启逻辑内存管理。
  •  若结果为off,则关闭逻辑内存管理。

2) 启用逻辑内存管理模块

gs_guc set -Z datanode -N all -I all -c "enable_memory_limit=on"
  • -N all:表示集群所有主机。
  • -I all:表示实例主机中所有的实例。
  •  enable_memory_limit:为逻辑内存管理模块的开关。
  •  datanode:表示执行该配置的实例类型为DN实例。

3) 设置数据库DN实例的最大可用内存

gs_guc set -Z datanode -N all -I all -c "max_process_memory=32GB"
  • max_process_memory为实例的最大可用内存。
  • datanode表示执行该配置的实例类型为DN实例。

4) 重启集群

gs_om -t stop && gs_om -t start

须知:

如果设置的max_process_memory值太小,可能会导致逻辑内存管理模块失效。

2.2.2 资源池级别的内存管理

1) 修改资源池resource_pool_a1的最大动态内存max_dynamic_memory和最大共享缓存max_shared_memory

Gauss=#ALTER RESOURCE POOL resource_pool_a1 WITH (max_dynamic_memory="20MB" and max_shared_memory="20MB");
ALTER RESOURCE POOL            

 2) max_dynamic_memory的取值设置为-1~max_process_memory,可以指定kBMBGB为单位,未指定时默认为kB。表示设置资源池使用的动态内存大小,-1表示不限制。查询作业将使用给定的内存来运行。

3) max_shared_memory的取值设置为-1~shared_buffer,可以指定kBMBGB为单位,未指定时默认为kB。表示设置资源池使用的共享缓存大小,-1表示不限制。查询作业将使用给定的内存来运行。

2.2.3 session级别的内存管理

数据库管理员可以通过下列步骤实现session级别的内存管理。

1) 设置session_max_dynamic_memory32kB

Gauss=# SET session_max_dynamic_memory=32;
SET

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

2) 执行作业

须知:

如果session使用的内存超过32kB,则session会报错,中断语句执行。

2.2.4 SQL级别的内存管理

数据库管理员可以通过下列步骤实现作业级别的内存管理。

1) 设置query_max_mem32kB

Gauss=# SET query_max_mem=32;
SET

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

2) 执行作业。

须知:

如果SQL使用的内存超过32kB,则SQL会报错,中断语句执行。

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

1) 查询实例级别的内存设置。                                            

Gauss=# show max_process_memory;
max_process_memory
--------------------
32GB
(1 row)

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

Gauss=# select * from pg_resource_pool;
respool_name | mem_percent | cpu_affinity | control_group | active_statements | max_dop | memory_limit | parentid | io_limits | io_priority | nodegroup | is_foreign | max_worker | max_connections | max_dynamic_memory | max_shared_memory | max_concurrency
------------------+-------------+--------------+---------------------+-------------------+---------+--------------+----------+-----------+--------------+--------------+------------
default_pool | 100 | -1 | DefaultClass:Medium | -1 | 1 | 8GB | 0 | 0 | None | installation | f | 1 | -1 | -1 | -1 | -1
resource_pool_a1 | 20 | -1 | class_a:workload_a1 | 10 | 1 | 8GB | 0 | 0 | None | installation | f | 1 | -1 | 30MB | 30MB | -1
(2 rows)

3) 查看session级别的内存设置。

Gauss=# show session_max_dynamic_memory;
session_max_dynamic_memory
----------------------------
-1
(1 row)

4) 查看SQL级别的内存设置。

Gauss=# show query_max_mem;
query_max_mem
---------------
0
(1 row)

3 内存参数设置案例

这个案例只做参考,在实际的业务场景要适当地调整。

   场景1:分布式3C3D部署形态

每台服务器为256G的物理内存,GaussDB数据库505.2版本,内存计划设置以下:

一台256GB内存物理机上部署了:1CN + 1主DN + 2备DN,那么:1CN+3DN 最多只能占每台物理内存的80%

1) DN的内存占大部分,峰值可设每台物理机60%

max_process_memory = 256*60% = 150GB/ 3副本 = 50GB

shared_buffers = max_process_memory/2 = 50/2 = 25GB

2) CN的内存

max_process_memory =256*20% = 50GB

说明:

上面预留的50GB给CN用,因为除了PGXC计划占用内存多点,其他占用不了什么内存。

shared_buffers = 20GB

说明:

大部分都用不到,因为大部分数据都是缓存在DN的shared_buffers中,只是CN的一些元数据缓存在它的shared_buffers中而已。

总共:50(DN)*3 + 50(CN) = 200GB / 256GB = 78%

说明:

没有超过本台物理机器内存的80%,一般不会出现OMM。

     场景2: 集中式12

每台服务器为256G的物理内存,GaussDB数据库505.2版本,内存计划设置以下:

每台256内存物理机部署组件为:

1DN+1CMS+ETCD :预留20%给系统使用:256*(1-20%) ≈200G

DN:max_process_memory=200*60%=120GB

shared_buffers = max_process_memory/2=60GB

4 简单总结

GaussDB内存主要是max_processs_memory与shared_buffers参数,需要跟据实际的业务环境合理的设置以提高资源使用的最大化使其性能得到提升。

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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