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

smk*_*081 5 amazon-web-services amazon-ecs node.js aws-fargate

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

1024在内存值相同的情况下,使用(1 个 vCPU)与(2 个 vCPU)运行相同的单线程容器2048不会利用额外的 vCPU,对吗?

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

Erm*_*ary 3

TLDR:1 个 vCPU 是单线程应用程序的合适配置。


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

正确的。

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

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

配置超过 1 个 vCPU 将不会带来任何性能优势。


在内存值相同的情况下,使用 1024(1 个 vCPU)与 2048(2 个 vCPU)运行相同的单线程容器不会利用额外的 vCPU,对吧?

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

“利用”的意思是实际使用而不是闲置?最有可能的是,是的。

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


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

答案保持不变——但有一点需要注意。

有四个项目可以使 Node.js 应用程序代码在多个 CPU 线程上运行:

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

如果没有上述任何一项,您的 Javascript 代码(在事件循环中运行)只能在单个 CPU 线程上运行,并且只能从 1 个 vCPU 中受益。

需要注意的是,除了事件循环之外,Node.js 还具有工作池,即线程池,它确实可以从更多线程中受益。

线程池在这些模块 API 的内部使用 ( 1 , 2 ):

  1. I/O密集型

    1. 域名解析dns.lookup(), dns.lookupService().

    2. 文件系统:除了fs.FSWatcher()那些显式同步的文件系统 API 之外,所有文件系统 API 都使用 libuv 的线程池。

  2. CPU密集型

    1. 加密货币crypto.pbkdf2()、、、、、。crypto.scrypt()crypto.randomBytes()crypto.randomFill()crypto.generateKeyPair()

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

这些将受益于多核系统。尽管如此,好处很可能是微乎其微的,具体取决于它们的使用程度。

如果大量使用它们,最好使用 1 个 vCPU 和 4 个 vCPU(与默认线程池大小一致4)单独对应用程序进行基准测试。