Утечка памяти в кафке - PullRequest
0 голосов
/ 23 октября 2019

Мы создали конвейер приема данных с использованием Kafka. У нас есть потребитель, который читает тему кафки и постоянно пишет в базу данных. Эти потребительские модули испытывают проблемы с событиями OOM. Мы запускаем kafka поверх k8s.

Теперь мы видим, что потребительские модули перезапускаются каждые 4-5 дней из-за ошибки OOM. Мы используем Kafka 2.2 версию java-библиотек kafka.

группа компиляции: 'org.apache.kafka', имя: 'kafka_2.12', версия: '2.2.0', группа компиляции: 'org.apache.kafka', имя: 'kafka-clients', версия: '2.2.0'

Вот статистика из jvm внутри модуля:

  15:          6075         145800  org.apache.kafka.common.requests.ApiVersionsResponse$ApiVersion
  16:          4030         128960  org.apache.kafka.common.MetricName
  17:          4030         128960  org.apache.kafka.common.metrics.KafkaMetric
  22:          1672          80256  org.apache.kafka.common.metrics.stats.SampledStat$Sample
  24:          1174          75136  org.apache.kafka.common.metrics.Sensor
  27:          1261          40352  org.apache.kafka.common.metrics.stats.Meter
  29:          1291          30984  org.apache.kafka.common.metrics.stats.Total
  30:          1261          30264  org.apache.kafka.common.metrics.stats.Rate
  32:           849          27168  org.apache.kafka.common.MetricNameTemplate
  35:           975          23400  org.apache.kafka.common.protocol.types.BoundField



/ # jcmd {app}.jar GC.class_histogram | head

 num     #instances         #bytes  class name
----------------------------------------------
   1:          1828        5264368  [B
   2:         33683        2949528  [C
   3:          7422         832008  java.lang.Class
   4:         33674         808176  java.lang.String
   5:         10990         764272  [Ljava.lang.Object;
   6:         23875         764000  java.util.HashMap$Node

Когда я начал анализировать дампы кучи, я подумал, что проблема связана с KafkaAdminClientтемы, которые открыты в сотнях на jvms и никогда не закрываются. Я закрыл их правильно и попытался посмотреть кучу после этого. Я все еще вижу, что проблема сохраняется.

Могу ли я узнать, какая операция в kafka производит вышеупомянутые классы? Это потребитель.poll () или проверка состояния фона или что-то еще.

Любой указатель в правильном направлении был бы очень полезен. Я застрял с этим больше недели. Я перепробовал много разных анализаторов дампа кучи. Все они указывают на классы JMX и NIO.

Вот одно сообщение о подозрении на утечку от Eclipse MAT:

One instance of "com.sun.jmx.mbeanserver.JmxMBeanServer" loaded by "<system class loader>" occupies 61,571,856 (36.76%) bytes. The instance is referenced by org.apache.commons.dbcp2.PoolableConnection @ 0xf0647668 , loaded by "sun.misc.Launcher$AppClassLoader @ 0xf09a3bd8". The memory is accumulated in one instance of "java.util.HashMap$Node[]" loaded by "<system class loader>".

и

sun.nio.ch.EPollArrayWrapper```
...