[Docker][Java] 在 Java 进程的容器中无法使用 jstat

关于使用Docker容器运行的Java进程中的jstat监控的讨论。

试着按照以下方式执行一下… …)

$ docker exec -t --user 1000 {container-id} jstat -gc 1

发生了这样的错误。

sun.jvmstat.monitor.MonitorException: 1 not found
        at jdk.internal.jvmstat/sun.jvmstat.perfdata.monitor.protocol.local.PerfDataBuffer.<init>(PerfDataBuffer.java:84)
        at jdk.internal.jvmstat/sun.jvmstat.perfdata.monitor.protocol.local.LocalMonitoredVm.<init>(LocalMonitoredVm.java:68)
        at jdk.internal.jvmstat/sun.jvmstat.perfdata.monitor.protocol.local.MonitoredHostProvider.getMonitoredVm(MonitoredHostProvider.java:77)
        at jdk.jcmd/sun.tools.jstat.Jstat.logSamples(Jstat.java:107)
        at jdk.jcmd/sun.tools.jstat.Jstat.main(Jstat.java:70)
Caused by: java.lang.IllegalArgumentException: Could not map vmid to user Name
        at java.base/jdk.internal.perf.Perf.attach(Native Method)
        at java.base/jdk.internal.perf.Perf.attachImpl(Perf.java:272)
        at java.base/jdk.internal.perf.Perf.attach(Perf.java:202)
        at jdk.internal.jvmstat/sun.jvmstat.perfdata.monitor.protocol.local.PerfDataBuffer.<init>(PerfDataBuffer.java:64)

只要有一个选项就好。PID 1 不存在,但 Java 进程确实在 PID=1 上运行吗?

在错误信息中搜索后,找到了以下类似的文章。

在jdk6u23中,jps/jstat无法正常工作的一些常见问题。

jps 和 jstat 查找 /tmp/hsperfdata_{用户名} 目录来获取目标进程的信息,因此如果 /tmp 的部分被修改为其他属性,它们将无法正常工作。

当我试着使用Java调试命令时,jps和jstat确实无法正常运行。

    • × jps

× jstat -gc 1

〇 jstack 1

〇 jmap -histo:live 1

〇 jcmd 1 GC.heap_info

然而,与文章所述一样,/tmp 的部分未被修改。

尽管在Java进程启动时应该创建hsperfdata目录,但该目录尚未创建。

看起来,如果没有与执行用户的UID关联的用户,目标目录将无法创建,就像hsperfdata_{用户名}一样。

在运行docker时只指定执行用户的UID来切换用户是不行的。

$ docker exec -t --user 1000 {container-id} id
uid=1000 gid=0(root) groups=0(root)  ★UIDに対するユーザがいない

所以,在Java容器的启动脚本(entrypoint.sh)中,我试图为UID创建用户。

UID=${UID:-1000}
useradd -m -u ${UID} myuser

可以设置执行用户。

$ docker exec -t --user 1000 {container-id} id
uid=1000(myuser) gid=0(root) groups=0(root)

现在也创建了hsperfdata目录。

$ docker exec -t --user 1000 {container-id} ls -1 /tmp
hsperfdata_myuser
  :

现在,可以顺利获取 jstat 了。

$ docker exec -t --user 1000 {container-id} jstat -gc 1
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT    CGC    CGCT     GCT
 0.0   5120.0  0.0   5120.0 74752.0  10240.0   431104.0   65111.7   75264.0 72714.0 10240.0 9118.1     35    3.934   0      0.000   8      0.397    4.331

// 结束文件

广告
将在 10 秒后关闭
bannerAds