繁体   English   中英

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来分析内存使用情况( 如此处所述 ),结果清楚地表明rocksDB是负责任的,但我不知道如何进一步限制rocksDB的内存使用情况。

jemalloc分析

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

RocksDB统计

我很高兴有任何提示

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

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

blockCacheSize=1350 * 1024 * 1024

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

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

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

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

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

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

希望这可以帮助,

-约翰

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM