Java 作为非 root 的进程消耗 100% CPU,但作为 root 没问题

Java process as non-root consumes 100% CPU, but as root is fine

我一直在尝试用 Docker 容器化 Java 应用程序。当我以 root 以外的用户身份拥有容器 运行 这个进程时,CPU 使用率达到 100% 并保持在那里。然而,对于 root,它的表现要好得多,大约为 2%。

# docker run -d -p 8006:8006 -u root --name root app:latest
# docker run -d -p 8007:8006 -u nonroot --name nonroot app:latest                    
# ps aux | grep java
root     26537  9.2  4.1 174800 115636 ?       Sl   10:14   0:02 /opt/app/jvm16/bin/java -Xmx128M -Xms128M […]
nonroot  26808 94.8  6.2 202744 175368 ?       Sl   10:15   0:08 /opt/app/jvm16/bin/java -Xmx128M -Xms128M […]

应用程序的功能与 root 或非 root 用户相同(未挂起)。但是,如果我 运行 在真实的(不在容器内的)服务器上使用相同的应用程序,则 CPU 用法对于 root 用户或非 root 用户都很好,暗示与容器相关的原因。

Docker 主机上的任何东西(我能找到的)都无法提供洞察力,并且 java 容器内的转储不会指向任何东西。

我的问题是:对此有何解释?

My question is: what could be an explanation for this?

一个可能的解释是,应用程序重复重试在 JVM 为 运行 作为 root 时有效的操作,而在作为普通用户 tun 时失败;即它是设计不当的应用程序和权限问题的组合。

我会尝试以下方法来弄清楚发生了什么:

  • 使用jstack 查看哪些线程处于活动状态以及它们在做什么。如果 CPU 是 100% 并且是使用 CPU 的 JVM,那么应该有活动线程。
  • 使用 strace 查看 JVM 正在执行的系统调用。
  • 查看应用程序日志文件以及 docker 和其他系统日志文件,看看是否有任何线索。