在某些客户现场,是不允许操作系统内存达到高比例使用量的,比如不允许超过90%。或者有其它应用运行在同一个主机上,则必须对GBase的内存进行控制,不允许独占。所以,遇到GBase 8a占用操作系统内存高,包括出现SWAP,需要降低占用,减少swap带来的性能影响。
1、解决问题涉及的参数:
内存参数gbase_heap_data,gbase_heap_large ,gbase_heap_temp,默认是按照物理内存的10/16=62.5%评估,比例是6:3:1, 等同于 6/16、 3/16 和 1/16。
参数降低的功能影响:
整体降低后,如出现不足,还是会从操作系统分配,但最高不能超过gbase_memory_pct_target 参数的最大值。
建议:
降低所有内存的初始值,当不降低最大值(pct),留出更多的内存,让数据库自行动态调度(从操作系统malloc的内存会尽量尽快归还的)。
_gbase_express_table_metadata_limit
针对元数据metadata。用于保存表的meta信息。默认是gbase_heap_temp的一半。 在某些场景下,会是内存占用高的原因。比如针对33亿行,几百列的表,metadata需要2G的内存,而主副本就需要4G. 如果有10个表,则需要40G。
该内存可以定时释放,但如果被释放的表处于使用状态,则会被忽略,等待下次检测。这也是测试环境,如果负载降低,内存占用也会降低的原因。
gbase_memory_pct_target
最大允许的内存占用比例,默认0.8等于80%。 内存总量=物理内存+SWAP内存。如超过,SQL会返回malloc分配内存失败错误。
降低参数影响:
会导致在更少的并发查询时,就出现内存分配超限的报错。
gbase_heap_data
热数据缓冲。将查询用到的数据,缓冲在内存里,减少磁盘读写来提高性能。 默认值是物理内存的 60%*60% = 36%
降低参数影响:影响性能。
在系统存在热数据时,比如频繁访问的表,会导致更多的磁盘IO,性能会下降;
如果不存在热数据,或者内存不足以报错所有的热数据,比如经常有大表访问导致现有热数据被换出,则影响减少。
gbase_heap_large
针对算子,比如group,join、sort等操作的专用内存。每个连接允许使用的最大值。 默认值是物理内存的 60%*30%=15%。比如128G的,默认分配46G.
降低参数影响:影响性能。
算子计算每次能在内存进行的数据量减少,循环轮次增加,性能会有下降。
gbase_heap_temp
临时堆。除了算子,包括加载等需要临时申请空间的,都是从这个堆。也包括智能索引等。默认值是物理内存的 60%*10%=6%
降低参数影响:无性能影响。
修改建议
gbase_memory_pct_target
该参数是内存比例,可以严格降低内存占用率。128G物理内存+SWAP共160G,80%是128G,70%是112G。 如果项目中,机器只有GBase在使用,考虑到gclusterd等也占用部分内存,建议修改到0.7即可。
如果系统有其它应用运行,且占用内存较高,可以考虑适当降低该参数。当然同时也要对应的降低初始评估的参数值。
gbase_heap_data
该内存默认使用最大(60%),优先建议调整。将其变相转移给__gbase_express_table_metadata_limit、gbase_heap_large、gbase_heap_temp使用。
注意:如果只修改此参数,不修改pct参数,可能出现该参数从操作系统malloc很多内存的情况,导致swap,比如当有多个大表参与查询时。所以一般建议和gbase_memory_pct_target 配合使用。
gbase_heap_large
该内存默认是物理内存的30%,如果系统并发不高,可以考虑降低默认值,留给系统自行分配(malloc)。
_gbase_memory_turn_to_heap
不再从操作系统mallco内存,而是从heap上分配,避免内存使用超限导致被OOM。在新的95版本里默认是on。 如关闭,则从操作系统malloc。
总结
降低内存参数,从理论上会降低性能(等于使用了更小内存的机器)。但内存参数高,出现SWAP,也会降低性能。其中的比例需要根据项目测试结果决定。从中选择更小的一个。
另外从其它角度看,降低业务并发数,增加机器内存,比如增加到256G,也是可以考虑的方案。