【问题标题】:JVM in Docker uses 100% CPU accross multiple coresDocker 中的 JVM 跨多核使用 100% CPU
【发布时间】:2023-02-17 22:53:26
【问题描述】:

我有一个在 Docker 中运行的 Spring Boot 应用程序,它的处理似乎很困难,我需要修复它。
无论如何,为了了解瓶颈在哪里,我做了一个简单的top,我看到我的 Java 进程在 4 核机器上使用 100% 的 CPU。够好了,我想我需要并行化一些昂贵的操作,以便分布在多个内核上。

问题是,即使我的主要 Java 进程似乎最大化了大约 100%,在机器方面我看到所有 4 个内核都使用了大约 25%。
我显然不是 Docker 或 JVM 方面的专家,但我必须为此做点什么:/
在我看来,我的 JVM 似乎只看到 1 个核心,但 docker 设法将工作分散到所有核心。

关于可能发生的事情的任何想法?
哦,关于版本,它运行的是 Docker 17.05、JDK 7。我可能会更新 Docker 但不会更新 Java :(

【问题讨论】:

  • 你在这里所说的还不是问题的迹象。您试图解决的最初问题是什么?
  • 基本上,该应用程序使用 AMQ 消息并使用它们执行各种 Mongo 操作。以前跑的还不错,现在因为数据输入大了,就积累了延迟。我看到 java 进程卡在 98~102% CPU 使用率左右,就好像它在使用单核一样。但在机器方面,所有核心都在 25% 左右。我的 Java 进程没有使用 150% 的 CPU 可能是有原因的,这可能与 Docker 有关。 + 我觉得奇怪的是,这个过程似乎只使用一个核心,尽管它的“工作量”分布在所有 4 个核心上。
  • 好的,这些信息应该首先出现在问题中(请相应地编辑帖子)。这个问题根本与 Docker 无关。如果应用程序与 Mongo 通信,它可能会等待 Mongo 响应,因此无法在一个线程中使用 100% 的 CPU。您的应用程序中有多少工作线程?你试过分析吗?

标签: java docker jvm cpu cpu-usage


【解决方案1】:

我在具有 64 个内核的 AWS EC2 上的 Docker 上遇到了这样的问题。问题是在没有选项的情况下调用 Java 时只有一个核心是可见的。如果我使用 -XX:ActiveProcessorCount-XX:-UseContainerSupport 选项,所有内核都是可见的。但在后一种情况下,每个核心的使用率不到 2-3%,总和约为 100%。经过长时间的搜索,我发现像 htop 这样的工具可以看到容器中的所有物理内核,但可能存在限制可用 CPU 容量数量的限制。例如,选项--cpu-shares。可以使用 cat /sys/fs/cgroup/cpu/cpu.shares 从容器中检查它的值。 1024个点对应1个核心。例如,可以设置 --cpu-shares 716,容器中只有 70% 的核心可用。这是我的情况。在您的情况下,物理处理器的数量是 4,cpu.shares 可能有 1024 个点。因此,您加载了每个内核的 25%。

有用的参考链接:
JVM in container calculates processors wrongly?
https://bugs.openjdk.org/browse/JDK-8146115
https://docs.docker.com/config/containers/resource_constraints/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 2019-10-20
    相关资源
    最近更新 更多