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客户端消费问题
| 留言与评论(共有 0 条评论) |