我很难搞清楚导致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中的内存泄漏 但它似乎与生产者代码有关,我看到了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
如果我能解决这个问题,我会在这里发布更新。与此同时,我希望也许有人有类似的问题,可以指出我正确的方向。
我做了几件事:
它仍然在泄漏,但它现在的问题要少得多:
在生成器配置中启用压缩后,内存泄漏会进一步减少。
我不知道该怎么做。内存泄漏似乎取决于将多少数据写入存储。
可能的候选人:
[KAFKA-6529] - 经纪人突然断开连接后,经纪人泄漏内存和文件描述符
[KAFKA-6185] - 在下转换的情况下,选择器内存泄漏,OOM的可能性很高
我将升级到1.1.0版并发布另一个更新。