我试图找出为什么我的卡夫卡流应用程序会耗尽内存。我已经发现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的内存使用。

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

我很高兴有任何暗示
发布于 2019-07-09 10:51:29
我发现是什么导致了这一切。
我认为我的kafka应用程序只有一个rockDB实例。但是,每个流分区都有一个实例。所以这个配置:
blockCacheSize=1350 * 1024 * 1024并不一定意味着rocksDB内存被限制在1350 to。如果应用程序具有例如8个流分区,那么它也有8个blockCaches,因此最多可以占用1350 *8=~11 to内存。
发布于 2019-06-19 14:50:59
你看到内存使用量在快速增长还是在更长的一段时间内增长?
我们发现并修复了一些可能导致内存泄漏的RocksDB资源泄漏:
有一些迹象表明,可能还有其他的(https://issues.apache.org/jira/browse/KAFKA-8367),无论是在我们对RocksDB的使用中还是在RocksDB本身中。
哦,另一个想法是,如果您使用来自状态存储的迭代器,无论是在您的处理器中还是在Interactive中,您都必须关闭它们。
除了寻找漏洞之外,我恐怕对诊断RocksDB的内存使用没有太多的洞察力。您也可以限制Memtable的大小,但我认为我们在默认情况下不会将其设置得很大。
希望这能帮上忙
-John
https://stackoverflow.com/questions/56663008
复制相似问题