Rocksdb 似乎在内存中加载了完整的 Ktable 状态存储

问题描述 投票:0回答:1

在我的kafka流拓扑中,我用kstream连接一个ktable,并且由于内存的原因它不断崩溃:连接DSL为Ktable创建一个状态存储,当这个状态存储很小时,使用的内存很低,但是当ktable随着新消息的增长,记忆也会增长。在某些时候,状态存储的大小超过了为流分配的内存,因此它崩溃了。

我的问题是:使用 Ktable/Kstream 连接时,Rocksdb 是否会加载 LRUcache 中状态存储的所有内容?对我来说,这似乎是一个奇怪的行为,因为在给定点流仅使用 ktable 的一小部分,并且 Rocksdb 被刷新到磁盘,否则它与内存存储没有区别。

感谢您的帮助

P.S:我已经尝试使用配置设置器绑定rocksdb内存,但它并没有太大变化。在某些时候,它会超出配置的缓存大小,或者如果我启用严格模式,则会引发 LRUCache 限制异常。

apache-kafka out-of-memory apache-kafka-streams rocksdb
1个回答
0
投票

通过 Ktable/Kstream 连接,Rocksdb 是否会加载 LRUcache 中状态存储的所有内容

如果你指的是KafkaStream缓存层,则不是。缓存的大小通过

statestore.cache.max.bytes
绑定(在旧版本中
cache.max.bytes.buffering
)。

对于 RocksDB 离头缓存,您可以实现通过

RocksDBConfigSetter
传递的
StreamsConfig
来绑定 RocksDB 使用的内存。参见 https://docs.confluence.io/platform/current/streams/developer-guide/memory-mgmt.html#rocksdb

P.S:我已经尝试使用配置设置器绑定rocksdb内存,但它并没有太大变化。在某些时候,它会超出配置的缓存大小,或者如果我启用严格模式,则会引发 LRUCache 限制异常。

那么这确实是关于 RocksDB 的吗?对于这种情况,看来您的

RocksDBConfigSetter
需要更改。我建议检查 RocksDBs 本地
LOG
文件(一个很好的工具是 https://github.com/speedb-io/log-parser)以查看内存使用情况。它可能与固定有关(例如,
tableConfig.setCacheIndexAndFilterBlocks(true);
)——如果使用固定,它的优先级高于内存限制,并且可能会违反限制。对于这种情况,您应该禁用固定。

© www.soinside.com 2019 - 2024. All rights reserved.