Java进程作为非根进程消耗100%的CPU,但作为根进程则可以
我一直在尝试用Docker将Java应用程序容器化。当我让容器以root以外的用户身份运行此进程时,CPU使用率将达到100%并保持不变。然而,对于root来说,它的表现要好得多,大约占2%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 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、 这是一个设计拙劣的应用程序和许可问题的结合
我会尝试以下方法来找出发生了什么:
- 使用
查看哪些线程处于活动状态以及它们在做什么。如果CPU是100%,并且是使用CPU的JVM,那么应该有活动线程jstack
- 使用
查看JVM正在执行的系统调用strace
- 查看应用程序日志文件、docker和其他系统日志文件,看看是否有任何线索