内存
介绍与内存相关的参数设置。
本节涉及的参数仅在数据库服务重新启动后生效。
enable_memory_limit
参数说明:启用逻辑内存管理模块。
参数类型:POSTMASTER
取值范围:布尔型
- on表示启用逻辑内存管理模块。
- off表示不启用逻辑内存管理模块。
默认值:on
- 若max_process_memory-max_shared_memory-cstore buffers少于2G,GaussDB(DWS)强制把enable_memory_limit设置为off。
- max_shared_memory参数与shared_buffer、max_connections以及max_prepared_transactions参数强相关,如果max_shared_memory过大,可以通过调整这三个参数减小。
- 动态负载管理功能依赖内存管理功能,当关闭参数enable_memory_limit后,动态负载管理和TopSQL功能会失效。
max_process_memory
参数说明:设置一个数据库节点可用的最大物理内存。
参数类型:SIGHUP
取值范围:整型,2*1024*1024~INT_MAX/2,单位为KB。
默认值:非从备DN节点自动适配,一个机器部署多个DN情况下,公式为(物理内存大小)* 0.8 / (1+主DN个数);一个机器部署单个DN情况下,公式为(物理内存大小)* 0.6;当结果不足2GB时,默认取2GB。从备DN默认为12GB。
设置建议:
- DN上该数值需要根据系统物理内存及单节点部署主DN个数决定的。一个机器部署多个DN情况下,max_process_memory计算公式如下:(物理内存大小 – vm.min_free_kbytes)* 0.8 / (n+主DN个数);一个机器部署单个DN情况下,max_process_memory计算公式如下:(物理内存大小 – vm.min_free_kbytes)* 0.6。该参数目的是尽可能保证系统的可靠性,不会因数据库内存膨胀导致节点OOM。这个公式中提到vm.min_free_kbytes,其含义是预留操作系统内存供内核使用,通常用作操作系统内核中通信收发内存分配,至少为5%内存。即, max_process_memory=物理内存*0.8/(n+主DN个数),其中,当集群规模小于256时, n=1;当集群规模大于256且小于512时, n=2;当集群规模超过512时,n=3。
- 不推荐设置为最小阈值。
- CN上该数值内存可设置与DN数值一样。
- RAM:集群规划时分配给集群的最大使用内存。
- GaussDB(DWS)从8.2.0版本开始,为了提升内存资源利用率,增大了单机器单DN部署形态的max_process_memory初始值,但当出现集群状态不均衡的情况下,两个主DN节点会同时在一个机器上,如果仍然使用max_process_memory初始值,机器可能出现OOM报错的情况。为此,8.2.0版本开始,max_process_memory参数更改为SIGHUP类型,可以通过手动设置的方式来动态调整;同时,新增max_process_memory_auto_adjust参数,当出现集群状态不均衡的情况下,CM会根据集群状态来动态调整max_process_memory,调整max_process_memory的计算公式为:(物理内存大小 – vm.min_free_kbytes)* 0.8 / 主DN个数。
- GaussDB(DWS)从8.2.1版本开始,扩大了max_process_memory动态内存调整的适用范围,由原先仅支持一个机器部署单个DN的集群形态,变更为支持所有部署形态。
- max_process_memory_auto_adjust为on时,max_process_memory将会在上限和下限两值之间动态调整;其中,max_process_memory下限值的计算公示为:(物理内存大小)* 0.8 / (1+主DN个数);max_process_memory上限值由GUC参数max_process_memory_balanced设置(max_process_memory_balanced参数设置请联系技术支持工程师)。
- 集群在均衡模式下,max_process_memory将使用上限值,提高节点整体的内存资源利用率,相对之前版本,内存利用率会提升。
- 集群在非均衡模式下,max_process_memory将使用下限值,节点整体的内存资源利用率和8.2.1集群之前的版本一致。
- 升级场景下,该参数为保持前向兼容,系统不会设置max_process_memory_balanced,max_process_memory默认使用升级前设置的值。
max_process_memory_auto_adjust
参数说明:设置是否开启max_process_memory参数的自动调整功能(该参数仅8.2.0及以上集群版本支持)。对于单机器单DN部署形态的集群,开启情况下,CM会在主备切换情况下,动态调整对应DN节点上的max_process_memory参数值。
参数类型:SIGHUP
取值范围:布尔型
默认值:on
设置建议:建议设置为on,对于单机器单DN部署形态的集群,为提高内存资源利用率,max_process_memory参数的初始值在8.2.0集群版本开始进行了提升,但在主备切换场景下,两个主DN节点会同时在一个机器上,如果仍然使用max_process_memory初始值,机器可能出现OOM报错的情况,因此,需要CM介入来动态调整max_process_memory。
shared_buffers
参数说明:设置GaussDB(DWS)使用的共享内存大小。增加此参数的值会使GaussDB(DWS)比系统默认设置需要更多的System V共享内存。
参数类型:POSTMASTER
取值范围:整型,128~INT_MAX,单位为8KB。
改变BLCKSZ的值会改变最小值。
默认值:CN节点为DN节点值的1/2,DN节点取公式计算:POWER(2,ROUND(LOG(2,max_process_memory/18),0))。如果操作系统支持的共享内存小于32MB,则在初始化数据存储区时会自动调整为操作系统支持的最大值。
设置建议:
由于GaussDB(DWS)大部分查询下推,建议DN中此参数设置比CN大。
建议设置shared_buffers值为内存的40%以内。行存列存分开对待。行存设大,列存设小。列存:(单服务器内存/单服务器DN个数)*0.4*0.25。
如果设置较大的shared_buffers需要同时增加checkpoint_segments的值,因为写入大量新增、修改数据需要消耗更多的时间周期。
bulk_write_ring_size
参数说明:数据并行导入使用的环形缓冲区大小。
参数类型:USERSET
取值范围:整型,16384~INT_MAX,单位为KB。
默认值:2GB
设置建议:建议导入压力大的场景中增加DN中此参数配置。
buffer_ring_ratio
参数说明:设置并行导出时使用环形缓冲区的阈值大小。
参数类型:USERSET
取值范围:整型,1~1000
默认值:250
- 默认值表示阈值为shared_buffers的250/1000即1/4。
- 最小为shared_buffers的1/1000。
- 最大为shared_buffers的大小。
设置建议:导出时出现缓存命中率不符合预期的场景建议在DN中设置此参数。
enable_cstore_ring_buffer
参数说明:设置列存RingBuffer的开关,该参数仅8.2.0及以上集群版本支持。
参数类型:USERSET
取值范围:布尔型
默认值:off
设置建议:建议在业务运行一段时间,当CStoreBuffer内已存入大量高频查询的数据后,进行低频大表查询前打开,查询完大表后关闭。
temp_buffers
参数说明:设置每个数据库会话使用的LOCAL临时缓冲区的大小。
参数类型:USERSET
取值范围:整型,800~INT_MAX/2,单位为8KB。
默认值:8MB
- 在每个会话的第一次使用临时表之前可以改变temp_buffers的值,之后的设置将是无效的。
- 一个会话将按照temp_buffers给出的限制,根据需要分配临时缓冲区。如果在一个并不需要大量临时缓冲区的会话里设置一个大的数值,其开销只是一个缓冲区描述符的大小。当缓冲区被使用,就会额外消耗8192字节。
max_prepared_transactions
参数说明:设置可以同时处于"预备"状态的事务的最大数目。增加此参数的值会使GaussDB(DWS)比系统默认设置需要更多的System V共享内存。
当GaussDB(DWS)部署为主备双机时,在备机上此参数的设置必须要高于或等于主机上的,否则无法在备机上进行查询操作。
参数类型:POSTMASTER
取值范围:整型,0~536870911,其中CN取值为0表示关闭预备事务的特性。
默认值:CN节点为800, DN节点为800
为避免在准备步骤失败,此参数的值不能小于max_connections。
work_mem
参数说明:设置内部排序操作和Hash表在开始写入临时磁盘文件之前使用的内存大小。ORDER BY,DISTINCT和merge joins都要用到排序操作。Hash表在散列连接、散列为基础的聚集、散列为基础的IN子查询处理中都要用到。
对于复杂的查询,可能会同时并发运行好几个排序或者散列操作,每个都可以使用此参数所声明的内存量,不足时会使用临时文件。同样,好几个正在运行的会话可能会同时进行排序操作。因此使用的总内存可能是work_mem的好几倍。
参数类型:USERSET
取值范围:整型,64~INT_MAX,单位为KB。
默认值:小规格内存为512MB, 大规格内存为2GB(max_process_memory大于等于30GB为大规格内存,否则为小规格内存)。
设置建议:
依据查询特点和并发来确定,一旦work_mem限定的物理内存不够,算子运算数据将写入临时表空间,带来5-10倍的性能下降,查询响应时间从秒级下降到分钟级。
- 对于串行无并发的复杂查询场景,平均每个查询有5-10关联操作,建议work_mem=50%内存/10。
- 对于串行无并发的简单查询场景,平均每个查询有2-5个关联操作,建议work_mem=50%内存/5。
- 对于并发场景,建议work_mem=串行下的work_mem/物理并发数。
开启内存自适应后,收集统计信息后不再需要使用work_mem进行算子内存使用调优,由系统根据当前负载情况,为每个语句生成计划,并估算每个算子的内存使用量和整个语句的内存使用量。系统根据负载情况和整个语句内存使用量进行队列调度,所以多并发场景会出现语句排队的情况。
query_mem
参数说明:设置执行作业所使用的内存。如果设置的query_mem值大于0,在生成执行计划时,优化器会将作业的估算内存调整为该值。
参数类型:USERSET
取值范围:整型,0,或大于32MB的整型,默认单位为KB。如果设置值小于32MB,系统会自动将该参数设置为默认值0,此时优化器不会根据该值调整作业的估算内存。
默认值:0
query_max_mem
参数说明:设置执行作业所能够使用的最大内存。如果设置的query_max_mem值大于0,在生成执行计划时,优化器会根据该值来设置算子的可用内存。当作业执行时所使用内存超过该值时,将报错退出。
参数类型:USERSET
取值范围:整型,0,或大于32MB的整型,单位为KB。如果设置值为小于32MB,系统会自动将该参数设置为默认值0,此时优化器不会根据该值限制作业的内存使用。
默认值:0
agg_max_mem
参数说明:设置执行作业中的Agg算子的聚集列超过5列时,该Agg算子所能够使用的最大内存。当agg_max_mem大于0时生效。(该参数仅8.1.3.200及以上集群版本支持)
参数类型:USERSET
取值范围:整型,0,或大于32MB的整型,单位为KB。如果设置值小于32MB,系统会自动将该参数设置为默认值0,此时不会根据该值限制Agg算子的内存使用。
默认值:
- 若当前集群为低版本升级到8.1.3及以上版本,继承升级前参数,默认值为INT_MAX。
- 若当前集群为新装的8.1.3及以上版本,默认值为2GB。
enable_rowagg_memory_control
参数说明:控制行存agg算子内存使用上限。
参数类型:USERSET
取值范围:布尔型
- on表示开启控制行存agg算子内存使用限制。设置为on可避免行存agg内存过度使用导致系统内存不可用,但可能导致agg性能劣化。
- off表示关闭控制行存agg算子内存使用限制。设置为off可能导致系统内存不可用。
默认值:on
maintenance_work_mem
参数说明:设置在维护性操作(比如VACUUM、CREATE INDEX、ALTER TABLE ADD FOREIGN KEY等)中可使用的最大的内存。该参数的设置会影响VACUUM、VACUUM FULL、CLUSTER、CREATE INDEX的执行效率。
参数类型:USERSET
取值范围:整型,1024~INT_MAX,单位为KB。
默认值:小规格内存为512MB, 大规格内存为2GB(max_process_memory大于等于30GB为大规格内存,否则为小规格内存)。
设置建议:
- 建议设置此参数的值等于work_mem,可以改进清理和恢复数据库转储的速度。因为在一个数据库会话里,任意时刻只有一个维护性操作可以执行,并且在执行维护性操作时不会有太多的会话。
- 当自动清理进程运行时,autovacuum_max_workers倍数的内存将会被分配,所以此时设置maintenance_work_mem的值应该不小于work_mem。
- 如果进行大数据量的cluster等,可以在session中调大该值。
psort_work_mem
参数说明:设置列存表在进行局部排序中在开始写入临时磁盘文件之前使用的内存大小。带partial cluster key的表、带索引的表插入,创建表索引,删除表和更新表都会用到。
参数类型:USERSET
多个正在运行的会话可能会同时进行表的局部排序操作,因此使用的总内存可能是psort_work_mem的好几倍。
取值范围:整型,64~INT_MAX,单位为KB。
默认值:512MB
max_loaded_cudesc
参数说明:设置列存表在做扫描时,每列缓存cudesc信息的个数。增大设置会提高查询性能,但也会增加内存占用,特别是当列存表的列非常多时。
参数类型:USERSET
取值范围:整型,100~INT_MAX/2
默认值:1024
max_loaded_cudesc设置过高时,有可能引起内存分配不足。
max_stack_depth
参数说明:设置GaussDB(DWS)执行堆栈的最大安全深度。需要这个安全界限是因为在服务器里,并非所有程序都检查了堆栈深度,只是在可能递规的过程,比如表达式计算这样的过程里面才进行检查。
参数类型:SUSET
设置原则:
- 此参数的最佳设置是等于操作系统内核允许的最大值(就是ulimit -s的设置)。
- 如果设置此参数的值大于实际的内核限制,则一个正在运行的递归函数可能会导致一个独立的服务器进程崩溃。在GaussDB(DWS)能够检测内核限制的操作系统上(SLES上),将自动限制设置为一个不安全的值。
- 因为并非所有的操作都能够检测,所以建议用户在此设置一个明确的值。
取值范围:整型,100~INT_MAX,单位为KB。
默认值:2MB
默认值2MB,这个值相对比较小,不容易导致系统崩溃。但是可能会因为该值较小,导致无法执行复杂的函数。
cstore_buffers
参数说明:设置列存和OBS、HDFS外表列存格式(orc、parquet、carbondata)所使用的共享缓冲区的大小。
参数类型:POSTMASTER
取值范围:整型,16384~INT_MAX,单位为KB。
默认值:CN为32MB,DN取公式计算:POWER(2,ROUND(LOG(2,max_process_memory/18),0))
设置建议:
列存表使用cstore_buffers设置的共享缓冲区,几乎不用shared_buffers。因此在列存表为主的场景中,应减少shared_buffers,增加cstore_buffers。
OBS、HDFS外表使用cstore_buffers设置ORC、Parquet、Carbondata的元数据和数据的缓存,元数据缓存大小为cstore_buffers的1/4,最大不超过2GB,其余缓存空间为列存数据和外表列存格式数据共享使用。
enable_orc_cache
参数说明:设置是否允许在初始化cstore_buffers时,将1/4的cstore_buffers空间预留,用于缓存orc元数据。
参数类型:POSTMASTER
取值范围:布尔型
默认值:
- on表示开启缓存orc元数据,可提升hdfs表的查询性能,但是会占用列存buffer资源,导致列存性能下降。
- off表示关闭缓存orc元数据。
dfs_max_memory
参数说明:设置orc导出时能占用的最大内存。如果导出大宽表时出现内存不足问题,可以调大此参数后重试。该参数仅8.3.0及以上集群版本支持。
参数类型:USERSET
取值范围:整型,131072 ~ 10485760,单位为KB
默认值:262144KB(256MB)
schedule_splits_threshold
参数说明:设置HDFS外表schedule阶段能够在内存中存储的最大文件个数,超过该限制时,将把文件列表下盘处理。
参数类型:USERSET
取值范围:整型,1~INT_MAX
默认值:60000
bulk_read_ring_size
参数说明:并行导出,使用的环形缓冲区大小。
参数类型:USERSET
取值范围:整型,256~INT_MAX,单位为KB。
默认值:16MB
check_cu_size_threshold
参数说明:列存表插入数据时,如果一个CU中已插入的数据量大于该参数时,开始进行行级大小校验,避免生成非压缩态大于1G的CU。
参数类型:USERSET
取值范围:整型,0~1048576,单位为KB。
默认值:1GB
在进行行级大小校验时,如果多次校验不通过,建议先会话级设置该参数为0进行规避。
max_volatile_memory
参数说明:指定所有session中volatile临时表相关context占用的最大使用总内存。在每个创建临时表的query执行时检查内存大小,所占内存不得超过该参数设置的最大内存,若超过限制则报错。该参数仅8.2.0及以上集群版本支持。
参数类型:SIGHUP
取值范围:整型,1024~INT_MAX,单位为KB。
默认值:1GB
async_io_acc_max_memory
参数说明:设置单个任务线程中异步读/写加速特性可使用的最大内存。该参数仅9.0.0及以上集群版本支持。
参数类型:USERSET
取值范围:整型,4096KB~INT_MAX/2 KB,单位为KB。
默认值:128MB