计算OushuDB并发(不含VCI版本)
作业跑批由于涉及到复杂的 SQL 关联操作,所需资源较多。在保证性能的前提下
作业跑批并发数量 = 单个虚拟子集群支持的并发数量 * 虚拟子集群数量
虚拟子集群数量没有限制
单个虚拟子集内 SQL 并发数量
= 总配置内存 / SQL 所需内存
= (hawq_rm_memory_limit_perseg * 机器数量) / (vsegresourcequota * hash_table_bucket_number)
= hawq_rm_memory_limit_perseg * 机器数量) / (vsegresourcequota * 机器数量 *
单机 vsegment 数量)
= hawq_rm_memory_limit_perseg / vsegresourcequota / 单机 vsegment 数量
hawq_rm_memory_limit_perseg 为单机配置内存,存在超配现象,若是存在其他消耗内存进程的存在例如(datanode/spark 等,需要去掉其内存后调整配置,一般 datanode 默认为 16GB,但实际可能更高),配置计算规则如下:
以单机内存 128GB 内存举例,overcommit_ratio 配置为 90
CHAWQ 可以用内存至多=128GB * 90% - 16GB = 99.2 GB
单机 vsegment 数量,为单机 SQL 在单机启动 vsegment 的数量,计算方式如下:
- random 表会根据数据量动态调整,至多为 max_nvseg_perquery_perseg,默认为 8
- hash 表单机为 hash_table_bucket_number/节点数
3)无论什么表,单机最大数量受限于 max_nvseg_perquery/节点数
当资源队列 quota 配置为 256MB,单机 vsegment 数量设置为 4 时,SQL 并发理论上数量为
= 99.2 * 1024 / 256 / 4 = 99
参数获取办法:
hawq_rm_memory_limit_perseg = show hawq_rm_memory_limit_perseg;
max_nvseg_perquery_perseg = select * from pg_vcluster ; -- 默认为 8
hash_table_bucket_number = select * from pg_vcluster ; -- 默认为 8*节点数
max_nvseg_perquery = select * from pg_vcluster; -- 默认为 512
vsegresourcequota = select rsqname,vsegresourcequota from pg_resqueue;
由此得出提高并发的影响因素有:
1)单机内存可配置的上限
2)集群参数 hash_table_bucket_number 和 vsegresourcequota 的配置
3)虚拟子集群的数量