我一直在尝试使用 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
身份运行时,应用程序反复重试有效,而以普通用户身份运行时失败;即它是设计不当的应用程序和权限问题的组合。
我会尝试以下操作来弄清楚发生了什么:
- 使用
jstack
查看哪些线程处于 Activity 状态以及它们在做什么。如果 CPU 是 100%,并且是使用 CPU 的 JVM,那么应该有 Activity 线程。 - 使用
strace
查看 JVM 正在执行哪些系统调用。 - 查看应用程序日志文件以及 docker 和其他系统日志文件,看看是否有任何线索。
关于Java 进程作为非 root 占用 100% CPU,但作为 root 没问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35815938/