我们有一个kstreams
应用程序进行kstream-kstable
内部连接。这两个主题都是高容量的,每个主题有 256 个分区。kstreams
应用程序现在部署在 8 个节点上,每个节点有 8 GB 堆。我们看到堆内存不断增长,最终发生OOM。我无法获得堆转储,因为它在容器中运行,当这种情况发生时会被杀死。但是,我尝试了一些方法来获得信心,它与状态存储/ktable 相关的东西有关。没有下面RocksDBConfigSetter
的内存会很快用完,但是下面的内存会在一定程度上减慢。需要一些指导以进一步进行,谢谢
我添加了以下3个属性,
properties.put(StreamsConfig.CACHE_MAX_BYTES_BUFFERING_CONFIG, 1 * 1024L);
properties.put(StreamsConfig.ROCKSDB_CONFIG_SETTER_CLASS_CONFIG, CustomRocksDBConfig.class);
properties.put(StreamsConfig.TOPOLOGY_OPTIMIZATION, StreamsConfig.OPTIMIZE);
public static class CustomRocksDBConfig implements RocksDBConfigSetter {
private org.rocksdb.Cache cache = new org.rocksdb.LRUCache(1 * 1024L * 1024L);
@Override
public void setConfig(final String storeName, final Options options, final Map<String, Object> configs) {
log.info("In CustomRocksDBConfig");
BlockBasedTableConfig tableConfig = (BlockBasedTableConfig) options.tableFormatConfig();
tableConfig.setBlockCache(cache);
tableConfig.setBlockSize(1 * 1024L);
tableConfig.setCacheIndexAndFilterBlocks(true);
options.setTableFormatConfig(tableConfig);
options.setMaxWriteBufferNumber(2);
}
@Override
public void close(final String storeName, final Options options) {
cache.close();
}