Мы создали конвейер приема данных с использованием 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```