原文链接:www.gbase.cn/community/p…
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。
1.1内存参数
1.1.1 insert select 申请内存大小参数
_gbase_insert_malloc_size_limit
_gbase_insert_malloc_size_limit 是控制 insert select 场景下一次申请内存的大 小。默认值为 10240,为较优配置。
如果 insert select 中涉及较长的 varchar 字段如包含多个 varchar(2000)的字段, 会导致每行或每几行数据申请一次内存,内存频繁的申请就造成了 sys cpu 占用, 影响性能。
推荐取值为最大字符串定义的 5 倍,如最大字符串定义为 varchar(2000),则该值可配置为 10000。
1.1.2 内存缓存 DC 个数配置
_gbase_dc_window_size
_gbase_dc_window_size 参数用于配置内存中缓存的 DC 个数,953 版本默认值 为 256。在join 运算场景中,如_gbase_dc_window_size 参数配置较小,当需要缓存的实际数据量超过设置的 DC 数时,就可能导致 sys 占用。可按需调整。
1.1.3 集群节点间一次数据发送和接收的数据大小
通常这三个从参数都无需调整。在扩容过程中,如发现较为严重的内存占用问题和性能问题,可以考虑调大或调小 _gbase_rep_receive_buffer_size 、_gbase_rep_pending_memory_size 参数。通过 show engine express status 的 SQL 命令可以查看_gbase_rep_receive_buffer_size 的使用情况
_gbase_rep_receive_buffer_size
集群节点间一次数据接收的数据大小。_gbase_rep_receive_buffer_size 参数表示 接收端的缓存大小,默认设置为 20G,最小可设置为 5G,无上限,单位为 MB。
_gbase_rep_pending_memory_size
集群节点间一次数据发送的数据大小。_gbase_rep_pending_memory_size 参数 代表接收端接收缓存的上限,以 MB 为单位,这个值设得越大则接收端的压力越大, 反之则发送端的压力越大,需要找到一个中间值,使发送端和接收端的压力比较均 衡,才能使效率更高。当前经验值是设为物理内存的 10%。
_gbase_rep_receive_buffer_threshold
数据接收和发送的上限。
1.1.4 一次释放 unlock 状态的 DC 数量设置
_gbase_cache_drop_unlock_cell_count
_gbase_cache_drop_unlock_cell_count 参数表示一次释放 unlock 状态的 DC 数 量,默认取值为 1000。
当 DC 堆满的时候 , 执行 unlock 状态的DC 清理释放 , 一次释放 _gbase_cache_drop_unlock_cell_count 个 ,如果完成一次释放后依然满 足 _gbase_cache_drop_unlock_cell_count 个 unlock 状态的 DC 待释放,则等待 _gbase_cache_drop_delay_time 秒后再次进行 unlock 状态 DC 释放。
可以调大_gbase_cache_drop_unlock_cell_count 参数,一次尽量多的释放 DC。
_gbase_cache_drop_delay_time
_gbase_cache_drop_delay_time 参数表示执行 DC 释放的时间间隔,默认为 0。
1.1.5 淘汰 unlock 状态的热数据 DC 参数设置
_gbase_cache_drop_hot_data
_gbase_cache_drop_hot_data 参数为开关参数,增加了一种 DC Cache 淘汰管理 策略,允许释放 unlock 状态的 DC 数据而不用考虑该数据是否属于热数据(被多 次使用的数据)。该参数默认取值为 0,建议设置为 1,即允许清除 unlock 状态的 热数据。
1.1.6 表缓存
table_definition_cache
用于保存表定义,也就是 frm 内容,是table_share 的 cache 大小。默认取值 512, 建议调整为 5120。
table_open_cache
用于保存 TABLE 的 cache 大小。
table_open_cache 用于保存 TABLE 的 cache 大小,默认取值 512,建议调整为 1280;
table_open_cache 及 table_definition_cache 这两个参数默认取值情况下,可能 会出现存储过程执行报错“Prepared statement needs to be re-prepared”。
在一些需要打开大量表的环境中,如在使用分区表的情况下,每个表分区都是一个 表对象,相比于非分区表会需要更多的 cache 空间。
_gbase_express_table_limit
用于当 express 引擎缓存的表个数大于该值时,回收表元数据所占内存
_gbase_express_table_metadata_limit
用于当 express 引擎缓存的表元数据字节大于该值时,进行回收,当设置为 0 时, 该值使用 gbase_temp_heap_size/2
_gbase_express_table_clear_rate
表示每次清理 express 缓存的表元数据时,清理的比例。(表个数或者表元数据大小)
1.1.7 内存堆
gbase_heap_data
主要设计用途是缓存数据,应分配最多的内存
gbase_heap_large
用于算子计算时使用
gbase_heap_temp
用来分配元数据和较为琐碎的和小块儿的临时内存
gbase_memory_pct_target
设置内存的可用比例,默认 0.8。当以上三个堆(heap_data 、heap_large、 heap_temp)分配的内存合计达到总内存 0.8 比例之后再申请内存则报错。
默认总内存中三个堆的比例为:
heap_data:heap_large:heap_temp 6:3:1
_gbase_memory_use_swap
表示使用 gbase_memory_pct_target 计算时,是否考虑 swap 的大小。 952.43 版本及以上和 953.26 版本及以上有该参数。
_gbase_memory_turn_to_heap
表示之前一些从系统内存分配的是否要改为从堆上分配,此功能是为了解决内存限 制不住的问题,但是必然会增加堆内存不够用的风险。
952.43 版本及以上和 953.26 版本及以上有该参数。 默认系统内存分配改为从堆上分配。综述说明
参数下限:
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 说明如下:
- 952.43 以前的版本、953.26 以前的版本,基数为物理内存+swap
- 952.43 版本及以上、953.26 版本及以上,基数默认为物理内存(不带 swap),可 以通过参数_gbase_memory_use_swap 来设置是否加上 swap。
1.1.8 算子 buffer
算子 buffer(session):从 gbase_heap_large 堆上分配。
算子 buffer 均为 session 级别,即如果设置 gbase_buffer_result=1G,且任 务数为 30,则在执行过程中,30 任务总共占用的 gbase_buffer_result 就为 1Gx 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_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 设置的很大,而后面又有 高并发测试,就很容易会出问题。
1.2 磁盘写入
1.2.1 数据写磁盘控制参数
_gbase_file_sync_level
文件同步级别,默认值为 1(ON),即每次写入都刷新磁盘,可避免断电死机等导 致数据丢失或损坏。
值 为0 时, 数据写磁盘受_gbase_dc_sync_size参数控制,数据达到_gbase_dc_sync_size 大小后进行写磁盘,可提升性能,一般用于 POC,生产环境不建议更改_gbase_file_sync_level 参数值。
_gbase_dc_sync_size
_gbase_dc_sync_size 参数用于控制写入数据时,何时进行 fsync 调用,通常在写 入数据时,不会在每次写入都调用 fsync 或者 fdatasync 进行强制写入数据到磁 盘,而是在写入_gbase_dc_sync_size 大小后进行 fsync 操作,避免 IO 过多。该参数的单位为字节。
_gbase_dc_sync_size 默认配置值较大,建议设置为 10M,即 10485760。
_gbase_dc_sync_size 是与_gbase_file_sync_level 配合使用,一般用于 POC,生 产环境不建议使用。
1.3 kafka consumer 配置参数
1.3.1 功能参数
Kafka consumer 功能是默认关闭的,如果需要使用 kafka consumer 实时同步 OLTP 的数据则需要开启和设置如下参数:
gcluster_kafka_consumer_enable=1
gcluster_lock_level=10
_gbase_transaction_disable=1
gbase_tx_log_mode=NO_USE,ONLY_SPECIFY_USE,NO_STANDARD_TRANS
同时也需要在 gnode 上配置同样的 _gbase_transaction_disable 、 gbase_tx_log_mode 参数取值。
在未设置这些参数的情况下执行 start kafka consumer consumer_name 启动命 令,报错信息如下:
ERROR 1707 (HY000): gcluster command error: param gcluster_lock_level must be 10.
ERROR 1707 (HY000): gcluster command error: gnode parameter "gbase_transaction_disable" must be 1.
ERROR 1707 (HY000): gcluster command error: gnode parameter "gbase_tx log_mode" must be NO_USE,ONLY_SPECIFY_USE,NO_STANDARD_TRANS.
1.3.2 性能参数
gcluster_kafka_consume_batch
该参数表示 consumer 一次从 kafka 中读取的消息条数。如果 kafka 中的单个消 息就比较大,则该参数应设置为一个较小取值。在部分版本中该参数默认取值为 10000,会造成 gclusterd 内存大量占用问题,推荐配置为 100 至 1000。
gcluster_kafka_batch_commit_dml_count
该参数用于控制 kafka consumer 攒批特性,配置单次提交的 DML 条数,即一般 情况下 kafka consumer 一次提交多大批量的数据,单位是dml 操作的条数,默 认配置为 100000,推荐修改为 10000~ 20000。增大该值虽然可以提高实时同步 性能,但会导致 gclusterd 的内存占用较多,尤其是 gclusterd 与 gbased共用一 个服务器的情况下,会影响集群稳定性。此参数是一个意向值,程序未必会严格按 照此参数来提交,比如如果一个事务包含大量 DML 操作,那么 consumer 必须 优先确保事务完整性从而暂时忽略此参数;再比如,如果 consumer 从 kafka 取 消息、解析消息的速度慢于 consumer 提交数据的速度,那么 consumer 会根据 另一个参数 gcluster_kafka_user_allowed_max_latency 的值择机提交,而不是一 定要等待数据量满足 gcluster_kafka_batch_commit_dml_count 参数。
如果一个 topic 涉及的表很多(几百个表以上)则建议该参数调小,表越多越应调 小,调小的目的是使得一次提交的数据命中较少的表,具体需要结合实际用户场景、 同步速度、资源占用情况具体对待。
gcluster_kafka_user_allowed_max_latency
参数用于配置数据提交的间隔,或者是消息数据允许缓存的时间,超过配置值后立 即进行提交操作,默认取值为 10000(单位毫秒,即 10 秒)。对于数据同步延迟 要求高的场景,可以调小该取值,但通常不建议低于 1000,即 1 秒。
两种调整场景:
-
强调低延迟的场景
用户对数据的可见性有严格要求,源端发生数据变化后,用户要求 Gbase8a 在 10 秒内即可查到该数据。
调优方法:首先基于建议的参数配置,开启 consumer 延迟统计功能,观察数据在 kafka consumer 环 节 的 延 迟 情 况 。 如 果 不 满 足 用 户 要 求 , 则 调 小 gcluster_kafka_user_allowed_max_latency=1000,甚至更低。如果设为 100 以 下仍不能满足用户要求,说明目前 Gbase8a 的性能满足不了。 -
强调高吞吐的场景
用户往 kafka 生产了一大批数据后,考察 kafka consumer 需要多长时间能完成同 步,这种场景下,需要调大 gcluster_kafka_user_allowed_max_latency 参数,让 consumer 能攒更大批量的数据,发挥批量的优势。一般来说,如果设为 20000 以 上仍不满足用户要求,说明目前 Gbase8a 的性能满足不了。
gcluster_kafka_local_queue_size
参数设置 consumer 缓存 dml 操作的队列的长度 , 应设置为 gcluster_kafka_batch_commit_dml_count 的二倍。调大此参数并不意味着内存 占用量提高,所以建议适当调大,推荐 40000 到 80000。
gcluster_kafka_latency_time_statistics
用于开启 consumer 延迟统计功能,观察 consumer 性能。
通过设置参数 gcluster_kafka_latency_time_statistics=1,开启 consumer 数据 的延时统计功能,开启后,可以通过查询 consumer 的 checkpoint table 得到延 迟统计数据。
Consumer 统计的延迟数据包含两个时间戳,一个是 consumer 读到某行数据的 时间戳,一个是 consumer 完成对这行数据的提交的时间戳。两个时间戳的差值即为这行数据在 kafka consumer 环节的总延时。
两个时间戳和差值都会被保存到 checkpoint table 里,所以开启这个参数后, checkpoint table 会自动增加几列。开启此参数对性能影响较小,但不能完全忽略。
由于 checkpoint table 与用户数据是一起提交的,所以 checkpoint table 里始终 缺少最后一次提交的延迟统计,需要下次提交时才补上。
kafka consumer 参数建议配置
对于大多数场景,建议使用下列配置即可满足要求。
gcluster_kafka_consume_batch=100
gcluster_kafka_batch_commit_dml_count=1000000
gcluster_kafka_local_queue_size=2010000
gcluster_kafka_user_allowed_max_latency=5000
原文链接:www.gbase.cn/community/p…
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。