kafka broker端不断的报OutOfMemory:Direct buffer memory,如下图:
同时dump出broker端的堆内存,通过MAT发现有内存泄漏,主要是KafkaChannel下的类NetworkReceive类下的其中一个HeapByteBuffer类占用了1.2G,具体如下图:
我的理解既然报了direct内存溢出,直接原因就是direct内存不够导致的,我设置了MaxDirectMemorySize:8GB,但是为什么不够呢?大致看了下源码,这块堆外内存感觉主要用于broker端生产者的批量消息请求缓存,那为什么又会有一块堆内的heapbytebuffer占用如此大的内存呢?堆内上内存占用是干啥的呢?堆外的又是干啥的呢?感觉目前自己理解的不清楚,请教各位专家。
描述你的版本、环境、场景等上下文信息:
- jdk1.8
- kafka2.2.1
容器化部署limit总内存16G,堆内存设置了一半8G,感觉设置的不够合理。
150+主题topic,每个topic大约3个分区,主要用于接收采集过来的原始消息数据,后续由流处理消费处理。
我们是个私有化部署的系统产品,该kafka报内存溢出具有一定的偶然性,有的环境会报该问题,有的环境业务数据量大反而没报该问题。
我目前的猜测:一是由于内存配置的不合理导致,二是由于每个系统环境开启的任务数(采集任务、流任务)不一样然后kafka broker端处理写入和消费请求不一样所致。
继续增加直接内存的大小,或者减少你调整的broker参数,如:
首先,默认配置的情况下,kafka broker是不会oom的,如果量大,会变慢或者报超时异常,而不是oom。
但当你调整了类似以上的配置,也需要加大JVM。
你的答案