最近遇到一个问题,偶现了两三次了,想要定位却无从下手!
为什么呢?主要是因为我们使用的openjdk基础镜像真的是太精简了,自带的jstack这些工具都没有!
本人也是这方面经验的小白,之前没有定位过这类多线程产生的问题。唯一的方向就是使用jstack工具,最初以为这个工具可以通过yum方式安装,百度后发现jstack是jdk自带的工具,这下子想基于现有openjdk镜像搞个带jstack的新镜像就没有那么简单了。(虽然可以下载个最新的openjdk镜像使用,肯定带jstack,但是由于有四百多兆,肯定不会让用的。)
我就问了下隔壁组的同事,在这种艰难的条件下,平时他们是怎么定位jvm问题的,他就提了一嘴Arthas。我就研究了下。发现这个工具是可以下载了拷贝到pod里面来使用的。Arthas官方下载链接
唯一庆幸的是,公司的基础镜像里面还保留着unzip工具,至少可以在pod里面将Arthas工具包解压了。
接下来进入正文。
工具准备:
arthas-packaging-3.4.8-bin.zip (官方下载的Arthas工具包)
tools.jar (linux安装的java目录lib下的jar包)
步骤:
1、拷贝arthas工具包到pod里面。
【命令】kubectl get pod |grep xx (查看pod)
【命令】kubectl cp arthas-packaging-3.4.8-bin.zip xxx:/mnt(pod名称:pod内目录)
2、进入pod的/mnt目录,解压arthas工具包。
【命令】kubectl exec -it xxx(pod名) sh
【命令】unzip arthas-packaging-3.4.8-bin.zip
3、启动arthas。
【命令】java -jar arthas-boot.jar
提示:
Can not find java process.
Try to pass in command line.Please select an available pid.
也就是说,工具自己没有找到java进程,需要自己输一个要看的java进程。
所以就需要通过top命令查看pid。
4、查看java进程,找到pid
【命令】top
5、指定pid启动arthas,增加个pid参数就行了。这个pid不能是LinuxTheads manager thread.
【命令】java -jar arthas-boot.jar 6 (6是一个pid)
异常:
Can not find tools.jar under java home: /usr/lib/jvm/java-1.8-openjdk/jre
这就是过于精简的jdk的坏处了,缺东西呀!需要找个linux下java的tools.jar拷贝到pod里java的lib目录下(lib目录可以根据异常提示里面的那个路径在pod里找)。拷贝命令还是kubectl cp。
6、tools.jar拷贝进pod的/usr/lib/jvm/java-1.8-openjdk/jre/lib后,再次指定pid启动arthas。
哒哒,成功了。
可以通过【命令】thread --all 查看所有进程,比不带参的thead命令查看的更多,线程池的线程都是带–all之后才查到的。
具体的使用可以参考官方文档。