更高的 vCPU 是否有利于单线程应用程序执行 Fargate 任务?

问题描述 投票:0回答:1

如果我的 ECS 任务中运行的代码严格是单线程的,并且不使用并行化或多线程,是否可以安全地假设为该任务分配超过 1 个 vCPU 不会对其性能产生影响会浪费吗?

在内存值相同的情况下,使用

1024
(1 个 vCPU)与
2048
(2 个 vCPU)运行相同的单线程容器不会利用额外的 vCPU,对吗?

在不使用集群的 Node.js 应用程序上下文中,这将如何工作?

node.js amazon-web-services amazon-ecs aws-fargate
1个回答
0
投票

TLDR:1 个 vCPU 是单线程应用程序的正确配置


如果在我的 ECS 任务中运行的代码完全是 单线程...将为任务配置一个 CPU 值,该值将分配 超过单个 1 个 vCPU 没有效果

正确。

如果您的 Node.js 容器将 task-level

cpu
参数设置为
1024
(1 个 vCPU),那么是的 - 在很大程度上。

四项使您的 Node.js 应用程序代码在多个 CPU 线程上运行:

  1. 工作线程 (
    node:worker_threads
    )
  2. 聚类 (
    node:cluster
    )
  3. 子进程 (
    node:child_process
    )
  4. C++ 插件

如果没有上述任何一项,您的 Javascript 代码 - 在 事件循环 中运行 - 仅在 单 CPU 线程 上运行。

在我的其他答案中,我详细介绍了 vCPU 作为物理 CPU 核心或线程的虚拟化抽象的定义,具体取决于实例类型和 CPU 类型。

因此,无论 1 个 vCPU 映射到一个核心还是一个线程,单线程应用程序一次只能使用一个线程并且只能从 1 个 vCPU 中受益。

但是,需要注意的是,除了事件循环之外,Node.js 还具有工作池,即线程池。

它用于(12)这些模块 API:

  1. I/O 密集型

    1. DNS

      dns.lookup()
      dns.lookupService()

    2. 文件系统:除了

      fs.FSWatcher()
      和显式同步的所有文件系统API都使用libuv的线程池。

  2. CPU 密集型

    1. 加密货币

      crypto.pbkdf2()
      crypto.scrypt()
      crypto.randomBytes()
      crypto.randomFill()
      crypto.generateKeyPair()

    2. Zlib:除了显式同步的 API 之外,所有 zlib API 都使用 libuv 的线程池。

工作池确实受益于更多线程,默认线程池大小设置为

4
。即使不使用上述 4 项,这些也会从多核系统中受益。尽管如此,好处很可能很小,具体取决于它们的使用程度。

您的应用程序是单线程的,配置超过 1 个 vCPU 将不会提供任何性能优势。


不会使用第二个vCPU

“利用” 是指从性能增益中受益或导致性能增益?没有。

“利用”的意思是实际使用且未闲置?可能是的。

单线程应用程序保证一次仅在一个线程上运行,但不能保证始终在同一线程上运行。根据操作系统的判断,它可以在任何可用的核心上运行,但不可能同时在多个核心上运行。

© www.soinside.com 2019 - 2024. All rights reserved.