我正在尝试找出为什么我的 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实例中收集的统计信息:
我很高兴有任何提示
答案 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的内存。