jvm 如何从Docker容器中捕获应用程序监视信息

ux6nzvsh  于 2022-11-07  发布在  Docker
关注(0)|答案(2)|浏览(125)

我有多个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。
如何解决这个问题有什么提示吗?

u7up0aaq

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也能正常工作。

k97glaaz

k97glaaz2#

您应该使用的命令是:

docker exec -i <container_id_or_name> <your_monitoring_command>

该命令将在容器内执行,但它会将其输出(通过-i)报告给调用方控制台。

相关问题