在docker容器中不能jcmd,jps或jstat cassandra进程

时间:2015-12-01 18:13:22

标签: linux jvm jstat

    $ 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 <​​/ em>

感谢任何帮助。

Docker容器是debian:jessie 运行java版本: openjdk版本“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成功地转储了线程的堆栈跟踪。

1 个答案:

答案 0 :(得分:7)

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

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