RocksDB内存不足
Posted
技术标签:
【中文标题】RocksDB内存不足【英文标题】:rocksdb out of memory 【发布时间】:2019-11-01 22:02:29 【问题描述】:我试图找出我的 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 实例收集的统计信息:
我很高兴有任何提示
【问题讨论】:
【参考方案1】:您是否看到内存使用量快速增长或在较长时间内增长?
我们已经发现并修复了一些会导致内存泄漏的 RocksDB 资源泄漏:
BloomFilters 可能泄漏 (https://issues.apache.org/jira/browse/KAFKA-8323) 这已在 2.2.1 和(待定 2.3.0)中修复 自定义 RocksDB 配置注定会造成泄漏 (https://issues.apache.org/jira/browse/KAFKA-8324) 这将在 2.3.0 中修复有一些迹象表明可能还有其他人 (https://issues.apache.org/jira/browse/KAFKA-8367),无论是在我们对 RocksDB 的使用中还是在 RocksDB 本身中。
哦,另一个想法是,如果您在处理器或交互式查询中使用状态存储中的迭代器,则必须关闭它们。
除了寻找泄漏之外,恐怕我对诊断 RocksDB 的内存使用情况没有太多的洞察力。您也可以限制 Memtable 的大小,但我认为我们默认不会将其设置得很大。
希望对你有帮助,
-约翰
【讨论】:
感谢您的想法。就我而言,这根本不是内存泄漏。看我的回答 哦!是的,这是对的。很高兴你知道了。【参考方案2】:我找到了造成这种情况的原因。
我以为我的 kafka 流应用程序只有一个 rockDB 实例。 但是每个流分区只有一个实例。所以这个配置:
blockCacheSize=1350 * 1024 * 1024
并不一定意味着rocksDB内存限制为1350MB。如果应用程序具有例如分配给它的 8 个流分区也有 8 个块缓存,因此最多可以占用 1350 * 8 = ~11GB 的内存。
【讨论】:
我以为我在某处读到增加块缓存大小会减少索引数量,从而减少内存占用?请问您是否知道如何调整仅在写入的rocksDB?我需要良好的写入性能,但我根本不阅读。以上是关于RocksDB内存不足的主要内容,如果未能解决你的问题,请参考以下文章