1
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 中。

4

1 回答 1

1

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

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

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

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

请注意,容器 CPU 为 0。

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

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

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

于 2022-01-29T20:50:50.057 回答