【问题标题】:Will a single Node process program gain any performance running on multi-core container?单个 Node 进程程序是否会在多核容器上运行时获得任何性能?
【发布时间】:2021-07-18 03:28:07
【问题描述】:

我了解 Node.js 应用程序在单线程上运行,但主要会将异步操作(例如 I/O)移交给可以在多个线程中运行的操作系统。

我的问题是这些多线程操作也可以在多核上运行吗?如果是这样,这是否意味着我仍然可以通过在多核容器上运行单个节点进程来获得性能?在多核容器上运行单节点应用程序有什么好处吗?

【问题讨论】:

  • I/O 取决于 CPU 的 I/O 通道数量,在现代台式机和服务器 CPU 中,这意味着 PCI 通道。 I/O 不依赖于 CPU 的内核数量,因为 I/O 不在线程上运行 - 它们由硬件处理。只有当硬件完全繁忙时,操作系统才会使用 PCI 通道轮流进行 I/O,就像操作系统使用内核轮流使用线程一样。对于网络 I/O,这取决于您拥有多少网卡(中继)。否则网络 I/O 将被序列化为单个比特流,因为那是线路可以承载的
  • 请注意,CPU 拥有的 PCI 通道数通常与内核数有关。这就是英特尔和 AMD 制造 CPU 的方式。因此,如果您想要最大的 node.js 性能,即使您只使用 1 个核心,获得 64 核 Threadripper 仍然是有意义的,因为您希望 PCI 通道用于 RAID 阵列中的高速磁盘 I/O

标签: node.js


【解决方案1】:

我的问题是这些多线程操作也可以在多核上运行吗?

Nodejs 确实有一些可以从多核中受益的本机线程,尤其是对于像加密操作这样的事情。

网络 I/O 本身都是异步的,因此并没有真正的好处。

磁盘 I/O 使用线程池,但是一旦磁盘操作开始,线程大多会被阻塞等待系统 I/O,因此可能会有一点好处,但不会很大。线程池主要是为了给同步的OS操作一个异步接口,保留nodejs的异步I/O模型。

如果是这样,这是否意味着我仍然可以通过在多核容器上运行单节点进程来获得性能?在多核容器上运行单节点应用程序有什么好处吗?

这实际上取决于您的应用在做什么。如果性能主要受到您自己的 CPU 密集型 Javascript 执行或网络 I/O 的限制,那么由于 Javascript 执行的单线程性和本机异步网络 I/O,您不会真正从其他 CPU 内核中受益。另一方面,如果您正在执行一系列由 nodejs 推送到线程的加密操作,那么您可能会受益匪浅。

如果您的容器包含其他进程(例如数据库),那么这可能会受益于其他内核。

从一般意义上讲,您可能会从 nodejs 使用本机线程的几件事中获得一点好处,这可能会带来一些好处,但我不认为它会产生很大的影响。


最后,对于您的具体应用,这个问题的真正答案只能通过测试来回答。在您的服务器上创建一个可重现的特定负载,该负载代表您的应用执行的操作类型,然后使用单核容器与多核容器进行测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多