rocksdb 内存不足

rocksdb out of memory

我试图找出为什么我的 kafka-streams 应用程序内存不足。 我已经发现 rocksDB 正在消耗大量本机内存,我尝试使用以下配置来限制它:

# put index and filter blocks in blockCache to avoid letting them grow unbounded (https://github.com/facebook/rocksdb/wiki/Block-Cache#caching-index-and-filter-blocks)
cache_index_and_filter_blocks = true;

# avoid evicting L0 cache of filter and index blocks to reduce performance impact of putting them in the blockCache (https://github.com/facebook/rocksdb/wiki/Block-Cache#caching-index-and-filter-blocks)
pinL0FilterAndIndexBlocksInCache=true

# blockCacheSize should be 1/3 of total memory available (https://github.com/facebook/rocksdb/wiki/Setup-Options-and-Basic-Tuning#block-cache-size)
blockCacheSize=1350 * 1024 * 1024

# use larger blockSize to reduce index block size (https://github.com/facebook/rocksdb/wiki/RocksDB-Tuning-Guide#difference-of-spinning-disk)
blockSize=256 * 1024

但内存使用似乎仍然无限增长,我的容器最终被 OOMKilled。

我使用 jemalloc 来分析内存使用情况 (like described here) 和 结果很明显是 rocksDB 负责,但我不知道如何进一步限制 rocksDB 的内存使用。

我不知道它是否有帮助,但为了完整起见,这里是从 运行 rocksdb 实例收集的统计数据:

我很高兴得到任何提示

您是否看到内存使用量快速增长或增长时间更长?

我们发现并修复了一些会导致内存泄漏的 RocksDB 资源泄漏:

有一些迹象表明可能还有其他 (https://issues.apache.org/jira/browse/KAFKA-8367),无论是在我们对 RocksDB 的使用中还是在 RocksDB 本身中。

哦,另一个想法是,如果您在处理器或交互式查询中使用状态存储中的迭代器,则必须关闭它们。

除了寻找泄漏,恐怕我对诊断 RocksDB 的内存使用情况没有太多了解。您也可以限制 Memtable 的大小,但我认为我们默认情况下不会将其设置得很大。

希望这对您有所帮助,

-约翰

我找到了造成这种情况的原因。

我以为我的 kafka 流应用程序只有一个 rockDB 实例。 但是每个流分区 有一个实例。所以这个配置:

blockCacheSize=1350 * 1024 * 1024

并不一定意味着 rocksDB 内存限制为 1350MB。如果应用程序有例如分配给它的 8 个流分区也有 8 个块缓存,因此最多可以占用 1350 * 8 = ~11GB 内存。