最近碰到了一个比较“有趣”的问题,jenkins 跑automation case的时候经常遇到hang的问题,直到jenkins预设的timeout时间,整个job挂掉。我们的master和slave是一拖三,比较了最近一段时间出现的频次,基本上排除了是因为代码问题引起。
一开始寻求使用java自带的监测工具:jstack,jconsole,能够看到hang住的thread(jvm里的),没有死锁,但是并不知道是哪里导致的,无法找到root cause。打印出来的结果类似于下图,只知道在读文件的地方卡住了:
后来又采用yourkit工具,图表挺丰富的,但是需要在代码中侵入一段后门:-agentpath,以便把应用的相关数据传到youkit server中去。这样起jvm的时候就相当于开了个后门,但是实际效果除了比jconsole更加细腻化,能够看到具体的class,但是还是看不到导致case hang住的具体问题。
网上搜了下,发现stack overflow有一哥们2年前也提到了同样的问题,但是没有reply。
链接如下:https://stackoverflow.com/questions/30511411/chromedriver-hang-when-create-multiple-instances-of-it
但是我们还是有点进步的,基本上可以定位到surefire这个maven插件导致的。
后来又去看了这个插件,发现它跑case的时候是会在自己内部再起一个jvm,如果同时跑好几个case,就会起对应的jvm,那么把-agentpath加入到该插件的配置中(pom文件中插件的位置加上下面这段),如下
果不其然, 在youkit中很轻松的抓到了具体casehang住的问题所在,selenium中有个录屏功能,并发情况下,卡住了!!
网友评论