Java进程作为非根进程消耗100%的CPU,但作为根进程则可以

Java进程作为非根进程消耗100%的CPU,但作为根进程则可以,java,linux,docker,containers,Java,Linux,Docker,Containers,我一直在尝试用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

我一直在尝试用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的使用都是正常的,这暗示了与容器相关的原因

Docker主机上的任何东西(我可以找到)都不能提供洞察,容器中的java转储也不能向我指出任何东西

我的问题是:对此有什么解释

我的问题是:对此有什么解释

一种可能的解释是,当JVM以
root
身份运行时,应用程序会反复重试一些工作,而当tun以普通用户身份运行时,应用程序会失败;i、 这是一个设计拙劣的应用程序和许可问题的结合

我会尝试以下方法来找出发生了什么:

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

出色的工作。您是对的,我在JVM的pid上运行了一个strace-F-p,事实上,它反复尝试在/tmp中创建一个文件,但权限被拒绝。我调整了权限,它工作正常。谢谢