我一直试图用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转储并没有指向任何东西。
我的问题是:对此可能有什么解释?
答案 0 :(得分:4)
我的问题是:对此可能有什么解释?
一种可能的解释是,应用程序反复重试在JVM作为root
运行时有效的内容,并在作为普通用户运行时失败;即它是设计不良的应用程序和权限问题的组合。
我会尝试以下方法来弄清楚发生了什么:
jstack
查看哪些线程处于活动状态以及它们正在执行的操作。如果CPU是100%并且是使用CPU的JVM,则应该有活动线程。strace
查看JVM正在进行的系统调用。