kafka broker端不断的报OutOfMemory:Direct buffer memory,什么原因导致的呢?主题和分区数较多?

发表于: 2022-07-13   最后更新时间: 2022-07-13 20:42:43   1,444 游览

kafka broker端不断的报OutOfMemory:Direct buffer memory,如下图:
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端处理写入和消费请求不一样所致。

发表于 2022-07-13
添加评论

继续增加直接内存的大小,或者减少你调整的broker参数,如:

  • socket.request.max.bytes
  • message.max.bytes

首先,默认配置的情况下,kafka broker是不会oom的,如果量大,会变慢或者报超时异常,而不是oom。

但当你调整了类似以上的配置,也需要加大JVM。

你的答案

查看kafka相关的其他问题或提一个您自己的问题