【问题标题】:JVM Runtime.getRuntime().availableProcessors() returns 1 on AWS ECS FargateJVM Runtime.getRuntime().availableProcessors() 在 AWS ECS Fargate 上返回 1
【发布时间】:2022-01-30 04:57:16
【问题描述】:
public class Example {
   public static void main(String[] args) {
      // print statement at the start of the program
      System.out.println("Start...");
      System.out.print("Number of available processors are: ");
      System.out.println( Runtime.getRuntime().availableProcessors());
   }
}

参考:https://www.tutorialspoint.com/get-number-of-available-processors-in-java

当我在 AWS ECS Fargate 上编译和运行此代码时,即使我在任务 def 中指定了超过 1 个 cpu(4 个 vCPU 为 4098),也会得到“1”作为输出。

经过测试的 Java 版本:

  • Corretto-17.0.0.35.1
  • Corretto-8.275.01.1

但是,当我在 docker 内部的 AWS EC2 上通过使用 --cpus 为“docker run”分配 CPU 来执行相同操作时,我得到了传递给 --cpus 的确切数字。 AWS EC2 与 Containerd 的结果相同。

还在 EKS 1.18 中通过设置 CPU 限制对此进行了测试。它返回 CPU 限制中指定的 CPU 数量。

所以,想知道为什么“1”只在 AWS ECS 中。

【问题讨论】:

  • 您的 Fargate 任务的 CPU 设置是什么?
  • 超过1,更新了我的问题。

标签: java jvm amazon-ecs jvm-arguments amazon-fargate


【解决方案1】:

我将假设您使用控制台来创建任务定义,因为我看到了相同的行为(并且没有预料到)。 The documentation 说:

虽然您也可以在容器级别为 Fargate 任务指定 CPU 和内存,但这是可选的。仅在任务级别指定这些资源即可满足大多数用例

我首先创建了一个在任务级别指定 CPU/内存的任务定义。当我运行它时,我看到了和你一样的输出,这就是任务定义的样子(省略了无关信息):

    "taskDefinition": {
        "containerDefinitions": [
            {
                "name": "example",
                "image": ".../example:latest",
                "cpu": 0,
            }
        ],
        "cpu": "4096",
        "memory": "8192",
    }

注意容器CPU为0。

然后我在 container 定义中编辑了 CPU,并在运行任务时看到了预期的可用处理器数量。当我检索任务定义时,它看起来像这样:

    "taskDefinition": {
        "containerDefinitions": [
            {
                "name": "example",
                "image": ".../example:latest",
                "cpu": 4096,
            }
        ],
        "cpu": "4096",
        "memory": "8192",
    }

我没有尝试使用 CloudFormation 或 Terraform 创建任务定义来查看它是否有任何不同。我在 ECS 控制台上发送反馈。

【讨论】:

  • 谢谢你。事实上,容器 CPU 0 是失败的。我通过 Jenkins 创建了任务定义,但没有设置容器 CPU。当容器 CPU 为 0 时,容器获得 2 个 CPU 份额,即 1 个 vCPU 的 0.1953125%。我相信,因为该值介于 0 到 1 之间,availableProcessors() 返回 1。
猜你喜欢
  • 2019-08-30
  • 2019-11-22
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 2018-10-03
  • 1970-01-01
相关资源
最近更新 更多