docker容器中进行Threaddump查看jvm状态
前言
在执行性能测试时需要导出Threaddump,程序运行在Docker容器中,在容器外不能直接使用jcmd 命令和jstack命令进行dump操作,会提示没有该命令,执行yum安装也不行。
解决办法:
查看正在运行的容器id
执行命令:docker ps
查到的docker容器id如下
使用docker exec进入Docker容器,命令如下:
docker exec -it 29198c060396 /bin/sh
运行jps,已经能看到刚才启动的spring boot应用了
这时就可以使用jstat,jmap等根据进程id查看程序状态了,以下是我运行jstack查看的堆栈信息
导出jmap dump的文件,进一步分析,copy docker中的文件到宿主机,命令如下
docker cp 29198c060396:/logs/d.20170726.txt .
d.20170726.txt 是我刚才用jmap -dump生成的文件
29198c060396是docker 容器id
在Docker中执行jstack时提示No such process,如下图:
原因分析:
docker中不能直接使用宿主机上的进程ID
解决方法:
docker container内进程信息,与宿主机上进程信息的映射关系,可以使用docker top查看宿主机与Docker中进程的对应关系,具体操作如下:
1. 找到容器的id
docker ps
2. 找到容器在宿主机上映射后的进程信息
docker top 9b40a74ceb82(容器id)
就会得到类似下面的信息,其中PID是容器内进程在宿主机上的pid,ppid是容器内进程在宿主机上的父进程pid
UID PID PPID C STIME TTY TIME CMD
root 9849 1611 0 Mar07 ? 00:00:00 bash /usr/bin/start
找到对应的容器内PID后就可以使用JStack进行Thread dump操作
参考资料:
https://blog.csdn.net/longxing_123/article/details/76163980
https://blog.csdn.net/micklf/article/details/79563869