Rocksdb内存不足

时间:2019-06-19 08:13:08

标签: java apache-kafka-streams rocksdb

我正在尝试找出为什么我的 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的内存使用。

jemalloc profiling

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

rocksDB statistics

我很高兴有任何提示

2 个答案:

答案 0 :(得分:1)

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

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

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

哦,另一个想法是,如果要使用状态存储中的迭代器(在处理器或Interactive Query中),则必须将其关闭。

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

希望这会有所帮助,

-约翰

答案 1 :(得分:0)

我发现是什么原因造成的。

我认为我的kafka流应用程序将只有一个rockDB实例。 但是,只有一个实例每个流分区。因此,此配置:

blockCacheSize=1350 * 1024 * 1024

不一定意味着rocksDB内存限制为1350MB。如果应用程序有分配的8个流分区还具有8个blockCache,因此最多可占用1350 * 8 =〜11GB的内存。