Fargate 中的 vCPU 究竟意味着什么?

What vCPUs in Fargate really mean?

我试图获得关于我的问题 here and here 的答案,但我知道我需要具体了解 vCPU 的 Fargate 实现。所以我的问题是:

  1. 如果我为我的任务分配了 4 个 vCPU,这是否意味着我的 单线程应用程序运行在此任务中的容器上将能够充分利用所有这些vCPU,因为它们本质上只是一个 我可以使用处理器内核的部分时间?
  2. 比方说,我为我的任务分配了 4 个 vCPU,但在技术层面上我 将 4 个 vCPU 分配给一个可以自由处理一个的物理内核 线程(或什至更多的超线程)。我的逻辑是否正确 Fargate 案?

p.s。这是一个 node.js 应用程序,它运行多个玩家相互交互的会话,所以我确实想提供一个 单个 node.js 具有最大容量的进程。

Fargate 在后台使用 ECS(弹性容器服务)来编排 Fargate 容器。 ECS 又依赖于 EC2 提供的计算资源来托管容器。根据 AWS Fargate FAQ's:

Amazon Elastic Container Service (ECS) is a highly scalable, high performance container management service that supports Docker containers and allows you to easily run applications on a managed cluster of Amazon EC2 instances ...

ECS uses containers provisioned by Fargate to automatically scale, load balance, and manage scheduling of your containers

这意味着 vCPU 本质上与 EC2 实例 vCPU 相同。来自 docs:

Amazon EC2 instances support Intel Hyper-Threading Technology, which enables multiple threads to run concurrently on a single Intel Xeon CPU core. Each vCPU is a hyperthread of an Intel Xeon CPU core, except for T2 instances.

所以回答你的问题:

  1. 如果您将 4 个 vCPU 分配给一个单线程应用程序 - 它只会使用一个 vCPU,因为 vCPU 只是一个单核超线程。

  2. 当您 select 4 vCPUs 时,您实质上是将 4 个超线程分配给单个物理核心。所以你的单线程应用程序仍然只使用一个核心。

如果您想要更细粒度地控制 CPU 资源 - 例如分配多个内核(可由单线程应用程序使用) - 您可能必须使用 EC2 启动类型(并管理您自己的服务器)而不是使用 Fargate。


编辑 2021:评论中指出,大多数 EC2 实例实际上每个 CPU 核心有 2 个超线程。一些专用实例(例如 c6g 和 m6g)每个内核有 1 个线程,但大多数 EC2 实例有 2 个 threads/core。因此,ECS/Fargate 使用的实例很可能每个核心也有 2 个线程。有关详细信息,请参阅 doco

您可以通过检查 /proc/cpuinfo for model name 字段来检查 CPU 您的 ECS 运行在什么物理上。您可以在 ENTRYPOINT / CMD 脚本中 cat 这个文件,或者使用 ECS Exec 打开容器的终端会话。

我最近确实这样做了,因为我们一直在观察我们的某些 ECS 服务出现一些奇怪的性能下降。在我们 运行 的 84 个 ECS 任务中,这是分布:

Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz      (10 tasks)
Intel(R) Xeon(R) Platinum 8124M CPU @ 3.00GHz  (22 tasks)
Intel(R) Xeon(R) Platinum 8175M CPU @ 2.50GHz  (10 tasks)
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz (25 tasks)
Intel(R) Xeon(R) Platinum 8275CL CPU @ 3.00GHz (17 tasks)

有趣的是,现在是 2022 年,而 AWS 从 2016 年开始仍然是 运行 CPU(E5-2686 v4)。所有这些任务都是 fully-paid On-Demand ECS Fargate。 运行 在 SPOT 上做一些任务时,我什至得到了一个 E5-2666 v3,我想是 2015 年。

虽然为我们的 ECS 任务分配 运行dom CPUs 在某种程度上是意料之中的,但它们之间的差异是如此显着,以至于我观察到我的一项服务报告了 25% 或 45% CPU 空闲时的利用率,取决于它在“ECS 实例类型抽签”中命中的CPU。