Java 进程作为非 root 占用 100% CPU,但作为 root 没问题

标签 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 用户相同(它没有挂起)。但是,如果我在真实的(不在容器内的)服务器上运行相同的应用程序,CPU 使用率对于 root 用户或非 root 用户都没有问题,这暗示了与容器相关的原因。

在 Docker 主机上没有任何东西(我能找到)提供洞察力,容器内的 java 转储也没有指向任何东西。

我的问题是:对此有何解释?

最佳答案

My question is: what could be an explanation for this?

一个可能的解释是,当 JVM 以 root 身份运行时,应用程序反复重试有效,而以普通用户身份运行时失败;即它是设计不当的应用程序和权限问题的组合。

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

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

关于Java 进程作为非 root 占用 100% CPU,但作为 root 没问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35815938/

相关文章:

linux - 来自期望文件中的文本文件的源不起作用

python - 如何从主机共享 python 库到多个 docker 容器?

java - 如何使用来自外部仓库的 docker-compose 和 maven 快照依赖项

docker - Kubernetes:如何从 configmap 扩展环境变量

java - C :\ProgramData\Oracle\Java\javapath\java. exe使用哪个JRE?

Java Spring 调度器锁

java - CDI 对象不能用注入(inject)的构造函数代理

java - 在 Java 中拆分字符串的最有效方法

linux - 输入命令时更改命令提示符

linux - linux权限只有在linux运行时才起作用吗?