我们已经使用Kafka建立了数据提取管道。我们有一个消费者,它从kafka主题中读取并连续写入数据库。这些消费者吊舱遇到OOM事件的问题。我们在k8s上运行kafka。
我们现在看到,由于OOM错误,消费者吊舱每4-5天重新启动一次。我们正在使用kafka java库的Kafka 2.2版本。
编译组:“ org.apache.kafka”,名称:“ kafka_2.12”,版本:“ 2.2.0” 编译组:“ org.apache.kafka”,名称:“ kafka-clients”,版本:“ 2.2.0”
以下是pod内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线程上,这些线程在jvm上以100的速度打开,但从未关闭过。我正确地关闭了它们,然后尝试查看堆。我仍然看到问题仍然存在。
我可以知道kafka中的哪种操作会产生上述类吗?是Consumer.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```