[英]Kafka off-heap memory leak
我很难弄清是什么原因导致kafka内存泄漏。
scala_version: kafka_2.11
kafka_version: 0.10.2.1
我知道这是卡夫卡吞噬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
这里的一切看起来都很好。 因此,泄漏必须不在堆上。
我已经看到了: https : //blog.heroku.com/fixing-kafka-memory-leak,但是它是指旧版本,因此应该长期解决
然后我发现了这一点:[KAFKA-4741]-RecordAccumulator.append中的内存泄漏,但似乎与Producer代码有关,并且我在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
如果可以解决问题,我将在此处发布更新。 同时,我希望也许有人遇到类似的问题,并且可以指出正确的方向。
我做了几件事:
它仍然在泄漏,但是现在已经不再是一个问题了:
在生产者配置中启用压缩后,可以进一步减少内存泄漏。
我不知道该怎么做。 内存泄漏似乎取决于要写入存储的数据量。
可能的候选人:
[KAFKA-6529]-客户端突然断开连接后,代理会泄漏内存和文件描述符
[KAFKA-6185]-在向下转换的情况下,发生OOM的选择器内存泄漏的可能性很高
我将升级到版本1.1.0,然后发布另一个更新。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.