Java进程作为非root用户运行时会占用100%的CPU,但是以root用户身份运行则正常。

4

我一直在尝试使用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用户时的功能相同(没有挂起)。但是,如果我在真实(不在容器内)服务器上运行相同的应用程序,则无论是root用户还是非root用户的CPU使用情况都很好,这暗示了与容器相关的原因。

在Docker主机上找不到任何有用信息,容器内的java转储也没有指向任何问题。

我的问题是:这可能有什么解释呢?

1个回答

4
我的问题是:这是什么原因呢?
一个可能的解释是,应用程序在以root用户身份运行JVM时可以正常工作,但在以普通用户身份运行时会失败;也就是说,这是一个设计不良的应用程序和权限问题的组合。
我建议尝试以下方法来查找发生了什么:
- 使用jstack查看哪些线程正在活动以及它们正在做什么。如果CPU占用率为100%,并且是JVM使用CPU,则应该有活动线程。 - 使用strace查看JVM正在执行哪些系统调用。 - 查看应用程序日志文件、docker和其他系统日志文件,看是否有任何提示。

干得好。你是正确的,我在JVM的pid上运行了一个strace -F -p,确实,它一直在尝试在/tmp中创建文件并被拒绝许可。我调整了权限,现在它正常工作。谢谢! - dog-skeptic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接