我有多个Java应用程序在不同的Docker容器中运行。我正在尝试使用jstat、jstack、jmap等工具从容器内运行的Java进程中收集监控数据,如GC日志、线程转储、堆转储。是否可以从主机(容器外部)捕获此信息?
我是容器化世界的新手。我知道主机和容器的PID命名空间是不同的。当我从主机执行jstack <PID> > thread_dump.txt
时,它显示错误消息:无法打开套接字文件/proc/root/tmp/.java_pid:目标进程在10500毫秒内未响应或HotSpot VM未加载
其中,PID是主机PID命名空间中的进程ID。
当我在容器(docker exec -it <container_id_or_name>
)内执行jstack
时,它能够捕获线程转储。
其中,PID是容器PID命名空间中的进程ID。
如何解决这个问题有什么提示吗?
2条答案
按热度按时间u7up0aaq1#
jattach工具正是为这个目的服务的。该项目是免费和开源的。
示例:
jattach <pid> threaddump
(工作方式类似于jstack)jattach <pid> inspectheap
(工作方式类似于jmap -histo)jattach <pid> jcmd GC.class_stats
其中,
<pid>
是主机名称空间中的Java进程ID。另外,即使container运行JRE而没有安装JDK工具(jstack、jcmd等),
jattach
也能正常工作。k97glaaz2#
您应该使用的命令是:
该命令将在容器内执行,但它会将其输出(通过
-i
)报告给调用方控制台。