【GaussDB】GaussDB 重要内存参数设置

【摘要】 GaussDB 内存参数设置是否合理,也要根据实际的业务场景,其目的使服务器资源的最大化利用,设置的合理可以提升性能。

1 引言

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

2 技术背景

2.1 GaussDB内存模型

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

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

  • 逻辑内存管理参数为max_process_memory:用于控制数据库上可用内存的最大峰值。
  • cstore_buffers:设置列存表所使用的共享缓冲区的大小。
  • shared_buffers:设置数据库使用的共享内存大小,用于缓存事务交易中的数据。
  • work_mem:设置内部排序操作和Hash表在开始写入临时磁盘文件之前使用的内存大小,一量work_mem限定的物理内存不够,算子运算数据将写入临时表空间,带来5~10倍的性能下降。
  • Maintrnance_work_mem:设置在维护性操作(如:vacuum、create 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. 查看逻辑内存管理功能的启用状态。
sql 复制代码
Gaussdb#SHOW enable_memory_limit;
  • 若结果为on,则开启逻辑内存管理。
  • 若结果为off,则关闭逻辑内存管理。
  1. 启用逻辑内存管理模块
sql 复制代码
gs_guc set -Z datanode -N all -I all -c "enable_memory_limit=on"
  • -N all:表示集群所有主机。
  • -I all:表示实例主机中所有的实例。
  • enable_memory_limit:为逻辑内存管理模块的开关。
  • datanode:表示执行该配置的实例类型为DN实例。
  1. 设置数据库DN实例的最大可用内存
sql 复制代码
gs_guc set -Z datanode -N all -I all -c "max_process_memory=32GB"
  • max_process_memory为实例的最大可用内存。
  • datanode表示执行该配置的实例类型为DN实例。
  1. 重启集群
sql 复制代码
gs_om -t stop && gs_om -t start

须知:

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

2.2.2 资源池级别的内存管理

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

sql 复制代码
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,可以指定kB、MB、GB为单位,未指定时默认为kB。表示设置资源池使用的动态内存大小,-1表示不限制。查询作业将使用给定的内存来运行。

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

2.2.3 session级别的内存管理

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

1) 设置session_max_dynamic_memory为32kB

sql 复制代码
Gauss=# SET session_max_dynamic_memory=32;
SET

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

2) 执行作业

须知:

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

2.2.4 SQL级别的内存管理

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

1) 设置query_max_mem为32kB。

sql 复制代码
Gauss=# SET query_max_mem=32;
SET

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

2) 执行作业。

须知:

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

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

  1. 查询实例级别的内存设置。
sql 复制代码
Gauss=# show max_process_memory;
max_process_memory
--------------------
32GB
(1 row)
  1. 查看资源池级别的内存设置。
sql 复制代码
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级别的内存设置。

sql 复制代码
Gauss=# show session_max_dynamic_memory;
session_max_dynamic_memory
----------------------------
-1
(1 row)

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

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

  1. 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: 集中式1主2从

每台服务器为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参数,需要跟据实际的业务环境合理的设置以提高资源使用的最大化使其性能得到提升。

转载:华为云论坛

相关推荐
码云数智-园园1 小时前
坚如磐石:数据库事务ACID特性的实现奥秘
数据库·oracle
十月南城1 小时前
文档化与知识库方法——ADR、Runbook与故障手册的结构与维护节奏
大数据·数据库
qq_417695051 小时前
实战:用Python开发一个简单的区块链
jvm·数据库·python
悲伤小伞2 小时前
9-MySQL_索引
linux·数据库·c++·mysql·centos
霖霖总总2 小时前
[Redis小技巧24]Redis主从复制深度解剖:不只是SLAVEOF,Redis主从复制背后的RunID、Backlog
数据库·redis
不吃香菜学java2 小时前
苍穹外卖-菜品分页查询
数据库·spring boot·tomcat·log4j·maven·mybatis
狼与自由2 小时前
Redis 分布式锁
数据库·redis·分布式
skiy2 小时前
redis 使用
数据库·redis·缓存
mygljx2 小时前
Redis 下载与安装 教程 windows版
数据库·windows·redis
奕成则成2 小时前
Redis 大 Key 问题排查与治理:原因、危害、实战方案
数据库·redis·缓存