主键索引持久化内存使用率未明显下降

版本:3.1.2
新建了两张表,表结构一致,一张表开启主键索引持久化,一张表未开启,导入 1367862 行数据,通过监控指标,两次导入行为占用的主键内存无明显差别,开启索引持久化时占用内存:76M,未开启索引持久化时占用内存:94M,参考官方文档,如果开启了持久化,主键索引占用内存应该是未开启持久化时的1/10

CREATE TABLE users (
user_id bigint(20) NOT NULL COMMENT “”,
name varchar(65533) NOT NULL COMMENT “”,
email varchar(65533) NULL COMMENT “”,
address varchar(65533) NULL COMMENT “”,
age tinyint(4) NULL COMMENT “”,
sex tinyint(4) NULL COMMENT “”,
last_active datetime NULL COMMENT “”,
property0 tinyint(4) NOT NULL COMMENT “”,
property1 tinyint(4) NOT NULL COMMENT “”,
property2 tinyint(4) NOT NULL COMMENT “”,
property3 tinyint(4) NOT NULL COMMENT “”
) ENGINE=OLAP
PRIMARY KEY(user_id)
DISTRIBUTED BY HASH(user_id)
ORDER BY(address, last_active)
PROPERTIES (
“replication_num” = “3”,
“enable_persistent_index” = “true”
);

数据量太小了,持久化索引会把索引dump到磁盘上,dump到磁盘上会消耗更多的IO。为了节省一些IO,仍然会在内存中缓存部分的索引。当内存使用量偏高时,会主动触发dump的逻辑把索引dump到磁盘上来控制内存的使用。对于你上面的这种测试,数据量太少,开启持久化索引可能也把整个索引缓存在内存里了,所以看不到太多内存的变化。

内存使用率偏高时,这个阈值是多少,有计算公式吗?如果be内存是16g,主键内存达到多少时会触发dump逻辑

具体的dump逻辑比较复杂。并不是说简单到某一个阈值才会触发dump,每个tablet以及BE全局的都有内存控制逻辑都可能触发内存的dump。BE上update全局内存使用比例的配置是update_memory_limit_percent。

假如有50个stream load任务同时执行,如果50个任务涉及的主键索引内存超过系统配置的主键索引阈值,此时底层会做排队吗?如果不做排队,后续如果还有导入任务,是不是会导致任务执行失败

有做排队,因为底层同时更新索引的并发是有限制的,所以同时并行的任务很多的时候同时apply的任务也是有上限的