java - rocksdb 内存不足

标签 java apache-kafka-streams rocksdb

我试图找出为什么我的 kafka-streams 应用程序内存不足。 我已经发现 rocksDB 正在消耗大量 native 内存,我尝试使用以下配置来限制它:

# 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

我很高兴得到任何提示

最佳答案

我找出了造成这种情况的原因。

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

blockCacheSize=1350 * 1024 * 1024

并不一定意味着 rocksDB 内存限制为 1350MB。如果应用程序有例如分配给它的 8 个流分区也有 8 个 block 缓存,因此最多可以占用 1350 * 8 = ~11GB 内存。

关于java - rocksdb 内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56663008/

相关文章:

apache-kafka - kafka new api 0.10 不提供每个主题的流和消费者对象的列表

database - 处理rocksdb中的重复项

java - 访问存储在 ArrayList 中的对象的最佳方式?

java - 线程与创建它的对象进行通信的首选方式是什么?

scala - 如何将 Scala API for Kafka Streams 定义为 build.sbt 中的依赖项?

apache-kafka - Kafka Streams - 处理器 API - 转发到不同的主题

cassandra - 分层压缩中层数的影响是什么?

digital-ocean - 在 DigitalOcean block 存储上使用嵌入式数据库(RocksDB、BoltDB、BadgerDB)是否安全?

java - Python - 我如何读入和读出以便其他读者可以阅读它以进一步追求?

java - 在 Java 中哪个更快,而使用递归方法?