算子buffer(session): 从gbase_heap_large 堆上分配。
算子buffer 均为session 级别,即如果设置gbase_buffer_result=1G,且任
务数为30,则在执行过程中,30 任务总共占用的gbase_buffer_result 就为1G x
30 = 30G,对于一般机器来说已经算很大了,这还不算其他的算子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 8a MPP Cluster 最佳实践
4 参数调优
文档版本(2022-02-11)
南大通用数据技术股份有限公司
43
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 的特点”,即并发数x 总算子buffer 大小不超过
gbase_heap_large 为宜,但最大也不能超过系统总内存大小。
修改算子buffer 的其它场景:
在进行poc 时,如果某条sql 由于某个算子执行过慢(瓶颈点可参考单机trace),
可以适当调大与之对应算子buffer。如根据trace 发现join 较慢,可以适当调大
gbase_buffer_hj 的值。
但是需要注意,
调整该值时必须不能影响其他sql 的执行,
且必须是现场允许修改系统参数时才可以。如整个测试只允许在开始时设置参数,
开始测试后就不允许再修改,如果开始时就把算子buffer 设置的很大,而后面又
有高并发测试,就很容易会出问题。
GBase 8a MPP Cluster 最佳实践
4 参数调优
文档版本(2022-02-11)
南大通用数据技术股份有限公司
44