kafka堆外内存泄漏

nbnkbykc  于 2021-06-08  发布在  Kafka
关注(0)|答案(1)|浏览(1435)

我很难找出Kafka记忆泄露的原因。

scala_version: kafka_2.11
kafka_version: 0.10.2.1

我有大约4gb的内存。以下是服务器内存在1个月内的情况:

我知道这是Kafka在蚕食内存,因为每当我重新启动它时,它的使用率就会下降。
以及从顶部到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

堆的外观如下:

这里一切看起来都很好。所以泄漏一定是堆积起来的。
我看到了:https://blog.heroku.com/fixing-kafka-memory-leak 但它是指旧版本,所以这应该是长期固定的
然后我在recordacculator.append中发现了这个:[kafka-4741]-内存泄漏,但它似乎与生产者代码有关,我在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->v0.9.5的librdkafka
如果我能弄明白,我会在这里发布最新消息。同时我也希望有人也有类似的问题,能给我指出正确的方向。

更新#1:

我做了几件事:
虚拟机上的ram数量增加了一倍。
升级至Kafka0.11.0.2
它还在泄漏,但现在问题小得多了:

更新#2:

在producer config中启用压缩后,内存泄漏进一步减少。

我不知道该怎么办。内存泄漏似乎取决于写入存储器的数据量。
可能的候选人:
[kafka-6529]-在客户端突然断开连接后,代理泄漏内存和文件描述符
[kafka-6185]-选择器内存泄漏,在下转换时很可能发生oom
我将升级到1.1.0版本并发布另一个更新。

bjp0bcyl

bjp0bcyl1#

Kafka2.11-1.0.1已经解决了这个问题。

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

相关问题