背景
线上服务之间调用,偶尔会出现调用耗时突然间增大的问题,比如平常10ms的接口,一下子增加到100ms,但是去查询日志发现实际下游服务处理时间很短,面对这个问题,一度怀疑Spring Cloud相关的配置不正确,经过多次调整还是会出现这个问题。
排查
经过多次对Spring Cloud的组件的相关配置进行排查(熔断队列,线程池等),还是出现这个问题
然后小心猜测是不是网络问题,内心想k8s网络肯定没有问题,然后耐不住其它同学的一致督促,让我帮忙定位这个问题,然后还是去进行tcp dump网络抓包
经过tcp抓包发现根本不是网络的问题,建立链接很快,慢在了下游服务的
自然的就怀疑到了会不会是tomcat问题,带着心里的这个疑问,开始了对tomcat排查之旅
利用牛皮的工具Arthas,开始排查,翻阅了一些文章,有了排查入口
trace org.apache.catalina.connector.CoyoteAdapter service '#cost > 100'
2. trace org.apache.catalina.connector.CoyoteAdapter postParseRequest '#cost > 100'
一步步的排查下来,最终发现到org.apache.catalina.webresources.TomcatJarInputStream:getNextJarEntry()
这里发现trace不下去了,查阅资料发现这个方法实际上已经到达了jdk层。于是执行watch指令来观察一下getNextJarEntry
这个方法
先执行options unsafe true
watch java.util.jar.JarInputStream getNextJarEntry "{returnObj}"
发现请求需要加载静态资源才导致响应时间变长,项目中引入了swagger,发现了问题所在
解决
由于引入了swagger导致了这个问题,但是项目中都是使用这个做接口文档的,所以不可能去掉,查阅了tomcat版本,目前项目中使用的是8.5.40版本和9.0.12版本,这个两个版本都有这个问题的存在
查看了tomcat的版本,更改tomcat版本,更改为8.5.70,然后再去检验,发现该问题得到解决了
还有一种方式就是升级Spring boot版本,升级依赖更高的tomcat版本Spring Boot releases 记录