(线上问题系列五)Kafka BUG引起的Tomcat线程池性能问题

OneNET (国内物联网PaaS平台)线上API最近常常出现“假死”,就是很慢,但又不会宕机。根据经验这种情况通常不是内存问题,很有可能是线程阻塞。前几次我们没有分析出原因,处理的方式是运维用脚本监控时延,重启程序的方式。这一次找了到问题,下面是解决过程:

1、我们在重启之前加上了java 内存dump和线程dump,并记录下重启时间,方便查询当时机器IO/内存等现象。

2、jprofiler分析内存dump,来看大概问题点


发现最大对象堆积在kafka producer,怀疑这儿有问题,但为了确定这个问题。

3、用IBM Thread and Monitor Dump Analyze for Java,发现大多线程都在waiting on condition,这个进一步说明有阻塞。


发现都和org.apache.kafka.clients.producer.KafkaProducer.send相关


这儿显示线程池大概600多,而tomcat线程池配的500,可以排队100,所以这个已经开始处理不过来了。

4、问题来了为什么kafka这儿会卡呢?我们在排查过程中发现了当时有一堆错误日志,而且全部都是kafka producer i/o thread


这时我们去监控看当时的IO,



果然IO突然彪高,所以可以基本确定为Kafka报的这个错误,引起了IO问题,从而阻塞了Tomcat 线程池,产生性能问题。问题是找到了,但很久都没有解决方案。

后续在找修复方案时,发现这个问题是kafka这个版本的问题

https://issues.apache.org/jira/browse/KAFKA-4669


修复版本在0.11.0.1,而我们用的0.9.01,所以我们后面只有升级kafka来解决这个问题了,目前还是只有监控重启。

(线上问题系列一)百万并发的Kafka也有性能问题?

(线上问题系列二)JVM GC 自适应调节策略引起的问题

(线上问题系列三)记录一次线上Redis性能优化

(线上问题系列四)网络故障或换磁盘引起kafka客户端消费问题


发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();