gpt4 book ai didi

java - Kafka堆外内存泄漏

转载 作者:太空宇宙 更新时间:2023-11-04 11:12:46 26 4
gpt4 key购买 nike

我很难找出导致 kafka 内存泄漏的原因。

scala_version: kafka_2.11
kafka_version: 0.10.2.1

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

我知道是 kafka 占用了 RAM,因为每当我重新启动它时,使用率就会下降。

top 的输出指向不断增加的 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 -> v0.9.5

的 librdkafka

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

更新#1:

我做了几件事:

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

它仍然在泄漏,但现在已经不是什么问题了:

enter image description here

更新#2:

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

after producer compression

我不知道该怎么办。内存泄漏似乎取决于写入存储的数据量。

可能的候选人:

[KAFKA-6529] - 客户端突然断开连接后,代理会泄漏内存和文件描述符

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

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

最佳答案

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

kafka memory 1.0.1

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

关于java - Kafka堆外内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45813477/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com