我很难找出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版本并发布另一个更新。
1条答案
按热度按时间bjp0bcyl1#
Kafka2.11-1.0.1已经解决了这个问题。
也不确定是否相关,但我没有意识到生产至少需要3个Kafka节点。