内存
介绍与内存相关的参数设置。
这些参数只能在数据库服务重新启动后生效。
memorypool_enable
参数说明:设置是否允许使用内存池。
该参数属于POSTMASTER类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:布尔型
- on表示允许使用内存池。
- off表示不允许使用内存池。
默认值:off
memorypool_size
参数说明:设置内存池大小。
该参数属于POSTMASTER类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:整型,128*1024~INT_MAX/2,单位为KB。
默认值:524288KB(512MB)
memory_trace_level
参数说明:动态内存使用超过最大动态内存的90%后,记录内存申请信息的管控等级。该参数仅在use_workload_manager和enable_memory_limit打开时生效。
该参数属于SIGHUP类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:枚举型
- none:表示不记录内存申请信息。
level1:动态内存使用超过最大动态内存的90%后,会记录以下信息。
- 全局内存概况。
- instance,session,thread三种类型的所有内存上下文中内存占用前20的内存上下文的内存使用情况。
- 每个内存上下文的totalsize、freesize字段。
level2:动态内存使用超过最大动态内存的90%后,会记录以下信息。
- 全局内存概况。
- instance,session,thread三种类型的所有内存上下文中内存占用前20的内存上下文的内存使用情况。
- 每个内存上下文的totalsize,freesize字段。
- 每个内存上下文上所有内存申请的详细信息,包含申请内存所在的文件,行号和大小。
默认值:level1
- 该参数设置为level2后,会记录每个内存上下文的内存申请详情(file,line,size字段),会对性能影响较大,需慎重设置。
- 记录的内存快照信息可以通过系统函数gs_get_history_memory_detail(cstring)查询。
- 记录的内存上下文是经过将同一类型所有重名的内存上下文进行汇总之后得到的。
enable_memory_limit
参数说明: 启用逻辑内存管理模块。
该参数属于POSTMASTER类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:布尔型
- on表示启用逻辑内存管理模块。
- off表示不启用逻辑内存管理模块。
默认值: on
若
max_process_memory-shared_buffers-cstore_buffers-元数据
少于2G,Vastbase强制把enable_memory_limit设置为off。其中元数据是Vastbase内部使用的内存和部分并发参数,如max_connections、thread_pool_attr、max_prepared_transactions等参数相关。当该值为off时,不对数据库使用的内存做限制,在大并发或者复杂查询时,使用内存过多,可能导致操作系统OOM问题。
max_process_memory
参数说明: 设置一个数据库节点可用的最大物理内存。
该参数属于POSTMASTER类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:整型,2*1024*1024~INT_MAX,单位为KB。
默认值: 12582912KB(12GB)
设置建议:
数据库节点上该数值需要根据系统物理内存决定。建议计算公式如下:
(物理内存大小 - vm.min_free_kbytes) * 0.7
。该系数的目的是尽可能保证系统的可靠性,不会因数据库内存膨胀导致节点OOM。这个公式中提到的vm.min_free_kbytes,其含义是预留操作系统内存供内核使用,通常用作操作系统内核中通信收发内存分配,至少为的内存的5%。即max_process_memory = 物理内存 * 0.665
。
- 当该值设置不合理,即大于服务器物理内存,可能导致操作系统OOM问题。
- 若一台机器上部署多个数据库实例时,需要缩小相关配置。
enable_memory_context_control
参数说明: 启用检查内存上下文是否超过给定限制的功能。仅适用于DEBUG版本。
该参数属于SIGHUP类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:布尔型
- on表示启用最大内存上下文限制检查功能。
- off表示关闭最大内存上下文限制检查功能。
默认值: off
uncontrolled_memory_context
参数说明: 启用检查内存上下文是否超过给定限制的功能时,设置不受此功能约束。仅适用于DEBUG版本。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
查询时会在参数值的最前面添加标题含义字符串“MemoryContext white list:”。
取值范围:字符串
默认值: 空
shared_buffers
参数说明: 设置Vastbase使用的共享内存大小。增加此参数的值会使Vastbase比系统默认设置需要更多的System V共享内存。
该参数属于POSTMASTER类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 整型,16 ~ 1073741823,单位为8KB。
shared_buffers需要设置为BLCKSZ的整数倍,BLCKSZ目前设置为8KB,即shared_buffers需要设置为8KB整数倍。改变BLCKSZ的值会改变最小值。
默认值: 8MB
设置建议:
1、建议设置shared_buffers值为内存的40%以内。行存列存分开对待。行存设大,列存设小。列存:(单服务器内存/单服务器数据库节点个数)*0.4*0.25。
2、如果设置较大的shared_buffers需要同时增加checkpoint_segments的值,因为写入大量新增、修改数据需要消耗更多的时间周期。
3、如果调整shared_buffers参数之后,导致进程重启失败,请参考启动失败的报错信息,采用以下解决方案之一:
- 对应调整操作系统kernel.shmall、kernel.shmmax、kernel.shmmin参数。
- 执行
free -g
观察操作系统可用内存和swap空间是否足够,如果内存明显不足,请手动停止其他比较占用内存的用户程序。- 避免设置明显不合理(过大或过小)的shared_buffers值。
4、在资源池化模式下,如果主备机同时运行业务,应适当增大本参数,避免该参数设置过小导致主备机页面频繁交互,增大网络负载,严重情况下,可能出现数据库响应较慢甚至卡住的情况。
segment_buffers
参数说明: 设置Vastbase段页式元数据页的内存大小。
该参数属于POSTMASTER类型参数,请参考重设参数表1中对应设置方法进行设置。
取值说明: 整型,16 ~ 1073741823,单位为8KB。
segment_buffers需要设置为BLCKSZ的整数倍,BLCKSZ目前设置为8KB,即segment_buffers需要设置为8KB整数倍。改变BLCKSZ的值会改变最小值。
默认值: 8MB
设置建议:
segment_buffers 用来缓存段页式段头的内容,属于关键元数据信息,为了提高性能建议常用的表的段头都能缓存在buffer中,不被置换出去。建议按照此公式来设置:
表的个数(包括索引和toast表)* 分区数 * 3 + 128
。乘以3是因为每个表(分区)会有一些额外的元数据段,一般一个表有3个段。最后加上128因为段页式表空间管理需要一定数量的buffer。bulk_write_ring_size
参数说明: 大批量数据写入触发时(例如copy动作),该操作使用的环形缓冲区大小。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 整型,16384 ~ 2147483647,单位为KB。
默认值: 2GB(16384KB)
设置建议: 建议导入压力大的场景中增加数据库节点中此参数配置。
standby_shared_buffers_fraction
参数说明: 备实例所在服务器使用shared_buffers内存缓冲区大小的比例。
该参数属于SIGHUP类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 双精度浮点型,0.1~1.0
默认值: 0.3
temp_buffers
参数说明: 设置每个数据库会话使用的LOCAL临时缓冲区的大小。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
在每个会话的第一次使用临时表之前可以改变temp_buffers的值,之后的设置将是无效的。
一个会话将按照temp_buffers给出的限制,根据需要分配临时缓冲区。如果在一个并不需要大量临时缓冲区的会话里设置一个大的数值,其开销只是一个缓冲区描述符的大小。当缓冲区被使用,就会额外消耗8192字节。
取值范围: 整型,100~1073741823,单位为8KB。
默认值: 1MB
max_prepared_transactions
参数说明: 设置可以同时处于“预备”状态的事务的最大数目。增加此参数的值会使Vastbase比系统默认设置需要更多的System V共享内存。
当Vastbase部署为主备双机时,在备机上此参数的设置必须要高于或等于主机上的,否则无法在备机上进行查询操作。
该参数属于POSTMASTER类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 整型,0~262143。
默认值: 10
一般不需要对事务显式进行PREPARE操作,如果业务对事务进行显示PREPARE操作,为避免在准备步骤失败,需要调大该值,大于需要进行PREPARE业务的并发数。
work_mem
参数说明: 设置内部排序操作和Hash表在开始写入临时磁盘文件之前使用的内存大小。ORDER BY、DISTINCT和merge joins都要用到排序操作。Hash表在散列连接、散列为基础的聚集、散列为基础的IN子查询处理中都要用到。
对于复杂的查询,可能会同时并发运行好几个排序或者散列操作,每个都可以使用此参数所声明的内存量,不足时会使用临时文件。同样,好几个正在运行的会话可能会同时进行排序操作。因此使用的总内存可能是work_mem的好几倍。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 整型,64~2147483647,单位为KB。
默认值: 65536KB
设置建议:
依据查询特点和并发来确定,一旦work_mem限定的物理内存不够,算子运算数据将写入临时表空间,带来5-10倍的性能下降,查询响应时间从秒级下降到分钟级。
- 对于串行无并发的复杂查询场景,平均每个查询有5-10关联操作,建议work_mem=50%内存/10。
- 对于串行无并发的简单查询场景,平均每个查询有2-5个关联操作,建议work_mem=50%内存/5。
- 对于并发场景,建议work_mem=串行下的work_mem/物理并发数。
- 对于BitmapScan的哈希表也会受到work_mem的限制,但不会被严格管控下盘。完全Lossify的情况下,哈希表每占用1MB的内存,对应一次BitmapHeapScan的16GB的页面(Ustore为32GB),达到work_mem上限后,会按此比例随数据访问量线性增长。
query_mem
参数说明: 设置执行作业所使用的内存。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 0,或大于32M的整型,默认单位为KB。
默认值: 0
如果设置的query_mem值大于0,在生成执行计划时,优化器会将作业的估算内存调整为该值。
如果设置值为负数或小于32MB,将设置为默认值0,此时优化器不会根据该值调整作业的估算内存。
query_max_mem
参数说明: 设置执行作业所能够使用的最大内存。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 0,或大于32M的整型,默认单位为KB。
默认值: 0
如果设置的query_max_mem值大于0,当作业执行时所使用内存超过该值时,将报错退出。
如果设置值为负数或小于32M,将设置为默认值0,此时不会根据该值限制作业的内存使用。
maintenance_work_mem
参数说明: 设置在维护性操作(比如VACUUM、CREATE INDEX、ALTER TABLE ADD FOREIGN KEY等)中可使用的最大的内存。该参数的设置会影响VACUUM、VACUUM FULL、CLUSTER、CREATE INDEX的执行效率。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 整型,1024~INT_MAX,单位为KB。
默认值: 16MB(16384KB)
设置建议:
- 建议设置此参数的值大于work_mem可以改进清理和恢复数据库转储的速度。因为在一个数据库会话里,任意时刻只有一个维护性操作可以执行,并且在执行维护性操作时不会有太多的会话。
- 当自动清理线程运行时,autovacuum_max_workers倍数的内存将会被分配,所以此时设置maintenance_work_mem的值应该不小于work_mem。
- 如果进行大数据量的cluster等,可以在session中调大该值。
psort_work_mem
参数说明: 设置列存表在进行局部排序中,在开始写入临时磁盘文件之前使用的内存大小。带partial cluster key的表、带索引的表插入、创建表索引、删除表和更新表都会用到。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
同样,多个正在运行的会话可能会同时进行表的局部排序操作。因此,使用的总内存可能是psort_work_mem的几倍。
取值范围: 整型64~2147483647,单位为KB。
默认值: 512MB(524288KB)
max_loaded_cudesc
参数说明: 设置列存表在做扫描时,每列缓存cudesc信息的个数。增大设置会提高查询性能,但也会增加内存占用,特别是当列存表的列非常多时。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
max_loaded_cudesc设置过高时,有可能引起内存分配不足。
取值范围: 100~INT_MAX/2048。
默认值: 1024
max_stack_depth
参数说明: 设置Vastbase执行堆栈的最大安全深度。需要这个安全界限是因为在服务器里,并非所有程序都检查了堆栈深度,只是在可能递规的过程,比如表达式计算这样的过程里面才进行检查。
该参数属于SUSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 整型,100~INT_MAX,单位为KB。
默认值: 2MB
设置原则:
数据库需要预留640KB堆栈深度,因此,此参数的最佳设置为操作系统内核允许的最大值(就是
ulimit -s
的设置)减去 640KB。如果设置此参数的值大于实际的内核限制,则一个正在运行的递归函数可能会导致一个独立的服务器线程崩溃。在Vastbase能够检测内核限制的操作系统上,将自动限制设置为一个不安全的值。
因为并非所有的操作都能够检测,所以建议用户在此设置一个明确的值。
这个值设置的相对比较小时不容易导致系统崩溃。
cstore_buffers
参数说明: 设置列存所使用的共享缓冲区的大小。
该参数属于POSTMASTER类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 整型,16384~1073741823,单位为KB。
默认值: 128MB
设置建议:
列存表使用cstore_buffers设置的共享缓冲区,几乎不用shared_buffers。因此在列存表为主的场景中,应减少shared_buffers,增加cstore_buffers。
bulk_read_ring_size
参数说明: 大批量数据查询时(例如大表扫描),该操作使用的环形缓冲区大小。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 整型,256~2147483647,单位为KB。
默认值: 16MB(16384KB)
enable_early_free
参数说明:控制是否可以实现算子内存的提前释放。
该参数属于USERSET类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围:布尔型
- on表示支持算子内存提前释放。
- off表示不支持算子内存提前释放。
默认值:on
local_syscache_threshold
参数说明:系统表cache在单个session缓存的大小。
该参数属于SIGHUP类型参数,请参考重设参数表1中对应设置方法进行设置。
如果enable_global_plancache已打开,为保证GPC生效,local_syscache_threshold设置值小于16MB时不会生效,最小为16MB。
如果enable_global_plancache和enable_thread_pool打开,该参数描述的是当前线程和绑定到当前线程上的session缓存的总大小。
取值范围:整型,1*1024 ~ 512*1024,单位KB。
默认值:256MB
resilience_memory_reject_percent
参数说明: 用于控制内存过载逃生的动态内存占用百分比。该参数仅在GUC参数use_workload_manager和enable_memory_limit打开时生效。
该参数属于SIGHUP类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 字符串,长度大于0
该参数分为recover_memory_percent,overload_memory_percent 两部分,这两个部分的具体含义如下:
- recover_memory_percent:内存从过载状态恢复正常状态的动态内存使用占最大动态内存的百分比,当动态内存使用小于最大动态内存乘以该值对应的百分比后,停止过载逃生并放开新连接接入,取值为0~100,设置为多少表示百分之多少。
- overload_memory_percent:内存过载时动态内存使用占最大动态内存的百分比,当动态内存使用大于最大动态内存乘以该值对应的百分比后,表示当前内存已经过载,触发过载逃生kill会话并禁止新连接接入,取值为0~100,设置为多少表示百分之多少。
默认值: '0,0',表示关闭内存过载逃生功能。
示例:
resilience_memory_reject_percent = '70,90'
上述设置表示内存使用超过最大内存上限的90%后禁止新连接接入并kill堆积的会话,kill会话过程中内存恢复到最大内存的70%以下时停止kill会话并允许新连接接入。
- 最大动态内存和已使用的动态内存可以通过gs_total_memory_detail视图查询获得,最大动态内存:max_dynamic_memory,已使用的动态内存:dynamic_used_memory。
- 该参数如果设置的百分比过小,则会频繁触发内存过载逃生流程,会使正在执行的会话被强制退出,新连接短时间接入失败,需要根据实际内存使用情况慎重设置。
pca_shared_buffers
参数说明: 类似于shared_buffers,用于设置页面压缩块地址映射管理buffer的大小。
该参数属于POSTMASTER类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 8 ~ 1073741823,单位:KB
默认值: 8KB
comm_sender_buffer_size
参数说明: 设置CN使用得发送缓冲区大小,单位为KB。
该参数属于POSTMASTER类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: 8 ~ 128 单位:KB
默认值: 8
enable_memory_context_check_debug
参数说明: 在调试模式下检查内存上下文信息
该参数属于POSTMASTER类型参数,请参考重设参数表1中对应设置方法进行设置。
取值范围: TRUE,FALSE
默认值: FALSE