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:设置在维护性操作(如:vacuum、create index等)中可使用的最大的内存。
2.2 GaussDB内存资源管理
GaussDB对内存资源管理类型分为以下4种:
要设置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,可以指定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
Gauss=# SET session_max_dynamic_memory=32;
SET
当结果显示为如下信息,则表示设置成功。
2) 执行作业
须知:
如果session使用的内存超过32kB,则session会报错,中断语句执行。
2.2.4 SQL级别的内存管理
数据库管理员可以通过下列步骤实现作业级别的内存管理。
1) 设置query_max_mem为32kB。
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: 集中式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参数,需要跟据实际的业务环境合理的设置以提高资源使用的最大化使其性能得到提升。
- 点赞
- 收藏
- 关注作者
评论(0)