Kafka堆外内存泄漏

时间:2017-08-22 09:13:26

标签: java memory-leaks apache-kafka heap-memory

我很难搞清楚导致kafka内存泄漏的原因。

scala_version: kafka_2.11
kafka_version: 0.10.2.1

我有大约4GB的内存。以下是服务器内存超过1个月的情况: kafka memory leak

我知道卡夫卡吃掉了RAM,因为每当我重新启动它时,使用率就会下降。

从顶级输出到不断增加的java进程驻留内存:

PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
23758 kafka     20   0 7673740 1.326g   7992 S 59.5 36.7   6379:29 java
one month later:
23758 kafka     20   0 8756340 2.288g   3736 S 41.9 63.3  45498:06 java

这里是堆的样子: kafka heap memory

这里的一切看起来都不错。所以泄漏必须在堆外。

我见过这个: https://blog.heroku.com/fixing-kafka-memory-leak 但它指的是旧版本,所以这应该是长期固定的

然后我发现了这个: [KAFKA-4741] - RecordAccumulator.append中的内存泄漏 但它似乎与生产者代码有关,我看到了tigase VM上的漏洞。

以下是我如何制作讯息:

String topicName = getTopicName(packet.getElement());
kafkaProducer.send(
    new ProducerRecord<>(
        "dispatch." + topicName, 
        (int) (long) fromUser.getShardId(), // specifies the exact partition that receives the message
        fromUser.getSiteId() + ":" + fromUser.getDeviceId(),
        packet.getElement().toString()
    ),
    producerCallback
);
if (log.isLoggable(Level.FINE)) {
    log.log(Level.FINE, "Adding packet to kafka");
}

我怀疑可能某些特定配置导致了问题,但我主要使用默认值来处理所有问题。

然后消费者我看到了:

%3|1503392176.789|FAIL|rdkafka#producer-2| kafka02:9092/1: Receive failed: Disconnected
%3|1503392176.789|ERROR|rdkafka#producer-2| kafka02:9092/1: Receive failed: Disconnected
%3|1503392176.854|FAIL|rdkafka#consumer-1| kafka01:9092/0: Receive failed: Disconnected
%3|1503392176.854|ERROR|rdkafka#consumer-1| kafka01:9092/0: Receive failed: Disconnected

我将进行一些实验,以确定泄漏是由生产还是消耗引起的。还将更新我用于消费v0.9.3的librdkafka - &gt; v0.9.5

如果我能解决这个问题,我会在这里发布更新。与此同时,我希望也许有人有类似的问题,可以指出我正确的方向。

更新#1:

我做了几件事:

  • 将虚拟机上的RAM量增加一倍。
  • 升级至kafka 0.11.0.2

它仍然在泄漏,但它现在的问题要少得多:

enter image description here

更新#2:

在生成器配置中启用压缩后,内存泄漏会进一步减少。

after producer compression

我不知道该怎么做。内存泄漏似乎取决于将多少数据写入存储。

可能的候选人:

[KAFKA-6529] - 经纪人突然断开连接后,经纪人泄漏内存和文件描述符

[KAFKA-6185] - 在下转换的情况下,选择器内存泄漏,OOM的可能性很高

我将升级到1.1.0版并发布另一个更新。

1 个答案:

答案 0 :(得分:0)

此问题已在kafka_2.11-1.0.1中解决。

kafka memory 1.0.1

也不确定是否相关,但是我没有意识到生产至少需要3个kafka节点。