无法在 docker 容器内处理 jcmd、jps 或 jstat cassandra

Can't jcmd, jps or jstat cassandra process within the docker container

    $ jcmd -l 
    418 sun.tools.jcmd.JCmd -l

    $ jstat -gcutil -t 10 250ms 1
    10 not found

我知道 jdk 中的 bug 与将 jstat 作为 root 附加到进程 运行 作为不同的用户有关。

这里,这个docker容器有一个用户root,从下面的ps命令可以看出,cassandra在root下运行。

 $ whoami
 root

我已尝试执行以下操作: $ sudo -u root jcmd -l

感谢任何帮助。

Docker 容器是 debian:jessie 运行 java 版本: 打开jdk版本“1.8.0_66-internal”

这是 ps -ef:

的输出
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 17:40 ?        00:00:00 /bin/bash /run.sh
root        10     1 11 17:40 ?        00:02:25 java -ea -javaagent:/usr/share/c
root       375     0  0 17:49 ?        00:00:00 bash
root       451   375  0 18:00 ?        00:00:00 ps -ef

旁白:jstack 成功地模拟ps 了线程的堆栈跟踪。

我至少知道发生这种情况的两个可能原因。

  1. Java 是带有 -XX:+PerfDisableSharedMem 选项的 运行。此选项有时有助于减少 JVM 安全点暂停,但它也会使 JVM 对 jpsjstat 不可见。这是一个很有可能的情况,因为你是 运行ning Cassandra,最近的 Cassandra 有这个选项 ON by default.
  2. Java 进程具有不同的挂载命名空间,因此 Java 进程的 /tmp 与 shell 进程的 /tmp 在物理上不是同一个目录.目录 /tmp/hsperfdata_root 必须可访问才能使用 jpsjstat。这也是一个合理的原因,因为您正在使用 docker 个容器。