【问题标题】:Get GC log data from the Docker container using jstat使用 jstat 从 Docker 容器中获取 GC 日志数据
【发布时间】:2021-12-29 10:46:07
【问题描述】:

我有一个使用 OpenJDK11 在 docker 容器中运行的 java 应用程序。我想使用jstat 工具(在容器内可用)从此应用程序获取 GC 数据。知道如何从主机或在同一主机上运行的另一个容器实现这一点吗?

谢谢你:)

【问题讨论】:

  • 所以你不能进去?
  • 没有sh可以吗?
  • docker run --entrypoint,我猜。但是如果你真的关心 gc stats/logs,可以在 docker 中挂载一个文件夹并在那里输出 GC 日志
  • 其实我有一个go脚本。我将 process_id 传递给这个 go 脚本。该脚本将从给定的 process_id 收集数据。假设我想从 go 脚本中执行 sh,那么首先我想我需要找出给定进程正在运行的 container_id。我说的对吗?
  • 如果你有一个脚本,它必须在 docker 容器中,而不是在它之外。 process_id 只有宿主知道,外部不知道

标签: java docker garbage-collection jvm jstat


【解决方案1】:

进程在主机上可见,因此如果您知道主机看到的 pid,jstat -gcstat <pid> 在主机上工作。

您可以通过 docker inspect -f '{{.State.Pid}}' <container name> 获取容器 pid-1 的主机 pid,然后遍历进程树(例如通过 /proc 或封装该逻辑的一些库)以找到 java 子进程,然后调用 jstat .

另一种选择是(部分)通过nsenterdocker exec 加入容器的命名空间,然后在容器内执行jpsjstat。但如果您不信任容器,这可能是一个安全问题。

【讨论】:

  • 谢谢,@the8472。我在主机上没有jstat (JDK)。它在目标 java 进程正在运行的容器中可用。所以我认为我需要从主机以某种方式识别容器并执行docker exec。正如你所建议的,我可以尝试docker inspect,但我需要弄清楚如何动态获取<container-name>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-26
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 2017-10-23
相关资源
最近更新 更多