作为非root用户的Java进程消耗100%的CPU,但是root用户很好

时间:2016-03-05 15:30:05

标签: 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 | 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 个答案:

答案 0 :(得分:4)

  

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

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

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

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