You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jira@kafka.apache.org by "Ismael Juma (Jira)" <ji...@apache.org> on 2020/03/10 11:50:00 UTC

[jira] [Commented] (KAFKA-9690) MemoryLeak in JMX Reporter

    [ https://issues.apache.org/jira/browse/KAFKA-9690?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17055856#comment-17055856 ] 

Ismael Juma commented on KAFKA-9690:
------------------------------------

Thanks for the report. This should be fixed in 2.4.1 which should be out very soon.

> MemoryLeak in JMX Reporter
> --------------------------
>
>                 Key: KAFKA-9690
>                 URL: https://issues.apache.org/jira/browse/KAFKA-9690
>             Project: Kafka
>          Issue Type: Bug
>          Components: consumer
>    Affects Versions: 2.4.0
>            Reporter: Kaare Nilsen
>            Priority: Major
>         Attachments: image-2020-03-10-12-37-49-259.png, image-2020-03-10-12-44-11-688.png
>
>
> We use kafka in a streamin http application creating a new consumer for each incoming requests. In version 2.4.0 we experience that the memory builds up for each new consumer. After debugging the issue after a memory dump revealed it was in the JMX subsystem we found that one of the JMX beans (kafka.consumer) build up one metric consumer-metrics without releasing them on closing the consumer.
> What we found is that the metricRemoval  
> {code:java}
> public void metricRemoval(KafkaMetric metric) {
>     synchronized (LOCK) {
>         MetricName metricName = metric.metricName();
>         String mBeanName = getMBeanName(prefix, metricName);
>         KafkaMbean mbean = removeAttribute(metric, mBeanName);
>         if (mbean != null) {
>             if (mbean.metrics.isEmpty()) {
>                 unregister(mbean);
>                 mbeans.remove(mBeanName);
>             } else
>                 reregister(mbean);
>         }
>     }
> }
> {code}
> The check mbean.metrics.isEmpty() for this particular metric never yielded true so the mbean was never removed. Thus building up the mbeans HashMap.
> The metrics that is not released are:
> {code:java}
> last-poll-seconds-ago
> poll-idle-ratio-avg")
> time-between-poll-avg
> time-between-poll-max
> {code}
> I have a workaround in my code now by having a modified JMXReporter in my pwn project with the following close method
> {code:java}
> public void close() {
>     synchronized (LOCK) {
>         for (KafkaMbean mbean : this.mbeans.values()) {
>             mbean.removeAttribute("last-poll-seconds-ago");
>             mbean.removeAttribute("poll-idle-ratio-avg");
>             mbean.removeAttribute("time-between-poll-avg");
>             mbean.removeAttribute("time-between-poll-max");
>             unregister(mbean);
>         }
>     }
> }
> {code}
> This will remove the attributes that are not cleaned up and prevent the memory leakage, but I have not found the root casue.
> Another workaround is to use kafka client 2.3.1
>  
> this is how it looks in the jmx console after a couple of clients have connected and disconnected. Here you can see that the one metric builds up and the old ones have the four attributes that makes the unregister fail.
>  
> !image-2020-03-10-12-37-49-259.png!
>  
> dThis Is how it looks after a while in kafka client 2.3.1
> !image-2020-03-10-12-44-11-688.png!
> As you can see no leakage here.
> I suspect this pull request to be the one that have introduced the leak: 
> [https://cwiki.apache.org/confluence/display/KAFKA/KIP-517%3A+Add+consumer+metrics+to+observe+user+poll+behavior]
> https://issues.apache.org/jira/browse/KAFKA-8874



--
This message was sent by Atlassian Jira
(v8.3.4#803005)