Node.js 进程在 AWS Fargate 中的行为如何?

Posted

技术标签:

【中文标题】Node.js 进程在 AWS Fargate 中的行为如何?【英文标题】:How does a Node.js process behave in AWS Fargate? 【发布时间】:2020-11-16 08:00:27 【问题描述】:

我在 AWS Fargate 上部署了一个节点应用程序,使用 1 个 vCPU/2GB 内存任务配置。我一直想知道 Node.js 在此设置上运行时与可用的 vCPU 相关的行为是什么。

根据 AWS 文档,vCPU 只是英特尔至强 CPU 内核上的一个超线程:What vCPUs in Fargate really mean?。那么,如果整个程序只在一个本身已经是超线程的 vCPU 上运行,那么 libuv 如何运行线程池(默认情况下运行 4 个线程)?此外,Node 程序在运行在具有 0.256 vCPU 的较低配置上的配置上表现如何?

此外,Fargate 通过运行配置中指定的任务数量自动处理扩展;但是,如果我决定使用 PM2 之类的东西在每个任务中运行多个 Node 进程会发生什么?由于我在 1 个 vCPU 上运行,这真的不起作用吗?

【问题讨论】:

【参考方案1】:

与线程一直运行相同:在单个 CPU 上。

线程(软件)是在多核机器流行之前发明的。所有原始的多线程 Unix 机器,如 Sun、HP9000、Digital VAX 和 Alphas 以及 Silicon Graphics IRIS 都是单 CPU 机器,只有一个内核,没有超线程。

当时线程(软件)的工作方式与今天相同:线程轮流在 CPU 上执行。这是由操作系统使用 CPU 的硬件特性来安排的:定时器中断。

操作系统会设置一个定时器来触发中断,然后将 CPU 传递给线程。当计时器到期时,它将中断 CPU,导致 CPU 停止执行线程中的代码,而是执行操作系统中的代码。正是在此中断期间,操作系统决定下一个执行哪个线程并再次设置定时器中断。多核 CPU 的唯一区别是操作系统有更多的 CPU 内核来调度线程。与超线程的唯一区别是操作系统可以为每个 CPU 内核调度两个线程。

这就是为什么您通常在典型的家庭用户桌面 Linux 机器(甚至不是服务器)上运行大约 300 个线程的原因,即使它在物理上只有 4 个内核能够同时只运行 8 个线程。

【讨论】:

您可能会注意到,我对操作系统如何在单核上运行线程的描述听起来与 javascript 事件循环的工作方式非常相似。实际上它们非常密切相关,实际上在单核机器上,多线程软件和事件驱动软件在理论上没有区别。在实践中,事件驱动软件通常更快,除非您在单个内核上使用固定(非增长)线程池。使用多个内核,多线程软件可以并行运行更多的东西。

以上是关于Node.js 进程在 AWS Fargate 中的行为如何?的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 进程在 aws 实例上被杀死

在 AWS Fargate 中链接容器

AWS Fargate 启动时间

AWS Fargate 容器中的持久性

如何将 AWS-Fargate 用作 Python 脚本

AWS ECS Fargate 和端口映射