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 来分析内存使用情况 (like described here) 和
结果很明显是 rocksDB 负责,但我不知道如何进一步限制 rocksDB 的内存使用。
我不知道它是否有帮助,但为了完整起见,这里是从 运行 rocksdb 实例收集的统计数据:
我很高兴得到任何提示
您是否看到内存使用量快速增长或增长时间更长?
我们发现并修复了一些会导致内存泄漏的 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 的大小,但我认为我们默认情况下不会将其设置得很大。
希望这对您有所帮助,
-约翰
我找到了造成这种情况的原因。
我以为我的 kafka 流应用程序只有一个 rockDB 实例。
但是每个流分区 有一个实例。所以这个配置:
blockCacheSize=1350 * 1024 * 1024
并不一定意味着 rocksDB 内存限制为 1350MB。如果应用程序有例如分配给它的 8 个流分区也有 8 个块缓存,因此最多可以占用 1350 * 8 = ~11GB 内存。
我试图找出为什么我的 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 实例收集的统计数据:
我很高兴得到任何提示
您是否看到内存使用量快速增长或增长时间更长?
我们发现并修复了一些会导致内存泄漏的 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 的大小,但我认为我们默认情况下不会将其设置得很大。
希望这对您有所帮助,
-约翰
我找到了造成这种情况的原因。
我以为我的 kafka 流应用程序只有一个 rockDB 实例。 但是每个流分区 有一个实例。所以这个配置:
blockCacheSize=1350 * 1024 * 1024
并不一定意味着 rocksDB 内存限制为 1350MB。如果应用程序有例如分配给它的 8 个流分区也有 8 个块缓存,因此最多可以占用 1350 * 8 = ~11GB 内存。