前文给大家介绍了GCluster参数优化,今天介绍下GNode参数优化,前文参考:https://www.gbase.cn/community/post/4427

1.1GNode的内存参数

1.Heap参数(global) 

gbase_heap_data 主要设计用途是缓存数据(DC),应分配最多的内存。
gbase_heap_large 用于管理不频繁申请、释放的内存。
gbase_heap_temp 用来分配较为琐碎的和小块儿的临时内存,较少使用。
gbase_memory_pct_target 设置内存的可用比例,默认0.8。

  • 参数下限:

gbase_heap_data  >= 512MB
gbase_heap_large  >= 256MB
gbase_heap_temp  >= 256MB

  • 参数上限:

(gbase_heap_data + gbase_heap_large + gbase_heap_temp ) <= total memory * gbase_memory_pct_target

注意:

默认:total memory = physical memory 
_gbase_memory_use_swap设置为1时:total memory = physical memory + swap

2.算子buffer(session) 

算子buffer均为session级别,即如果设置gbase_buffer_result=1G,且并发数为30,则在执行并发的过程中,30并发总共占用的gbase_buffer_result就为1G*30 = 30G,而且是在不计算其他的算子buffer的情况下。

所以如果在高并发环境中将某一个算子buffer设置很大的话,很有可能就会出现内存不足无法分配的情况。

常用的buffer如下:

•gbase_buffer_distgrby:用于保存distinct操作的中间结果;

•gbase_buffer_hgrby:用于保存hash group by操作的中间结果;

•gbase_buffer_hj:用于保存hash join操作的中间结果;

•gbase_buffer_insert:用于保存insert values的中间结果;

•gbase_buffer_result:用于保存物化的中间结果;

•gbase_buffer_rowset:用于保存join计算的中间结果集;

•gbase_buffer_sj:用于保存sort merge join的中间结果,当join条件是a>=b或者a<=b时,可能会使用sort merge join;

•gbase_buffer_sort:用于保存sort操作的中间结果。

算子buffer的设置原则:

一般情况下(非高并发场景),根据系统内存大小,算子buffer可以按照如下方法设置:
•gbase_buffer_hgrby和gbase_buffer_hj最大不超过4G;
•gbase_buffer_result最大不超过2G;
•gbase_buffer_rowset最大不超过1G;
•其他算子使用系统估算即可。
•如果在高并发场景下,则不需要设置过大的算子buffer,一般以系统自动评估为准。但如果并发数过大,不排除需要人为将算子buffer设置更小的情况。即并发数乘以总算子buffer大小不超过gbase_heap_large为宜,但最大也不能超过系统总内存大小。

  • 修改算子buffer的其它场景:

如果某条sql由于某个算子执行过慢(瓶颈点可参考单机trace),可以适当调大与之对应算子buffer。例如根据trace发现join较慢,可以适当调大gbase_buffer_hj的值。但是需要注意,调整该值时必须不能影响其他SQL的执行。

1.2 Gnode的并发控制参数 

1.gbase_parallel_execution 

用于设置是否启用并行开关。 
0关闭,默认为关闭。 
1 开启。

  • 适用场景: 

当发现CPU利用率低时,可开启并行。 
并行原理是将数据切分成多块,多块并行处理,最后合并结果集 
适合并发量不大的复杂SQL场景。

2.gbase_parallel_max_thread_in_pool 

用于配置并行执行器线程池中的最大线程个数,默认为系统CPU核数的2倍。 
取值范围:0~4096,在每个服务器上部署1个gnode节点的情况下推荐该配置为CPU核数的4~8倍。
说明 
线程池中的线程为数据库服务启动时创建,执行SQL时从线程池租用,用后归还,可有效避免线程频繁创建和销毁的代价。  

3.gbase_parallel_degree 

  • 控制每个SQL的最大并行度

取值范围:0~ gbase_parallel_max_thread_in_pool,最大取值范围不超过线程池最大可用线程数。
1表示不启动并行,即单线程执行。
0表示默认并行度为线程池gbase_parallel_max_thread_in_pool的1/2(gbase_parallel_max_thread_in_pool为奇数会只取整数部分)。

以上就是今天的内容,感谢阅读!