Node.js - 以 CPU 核心为目标

Posted

技术标签:

【中文标题】Node.js - 以 CPU 核心为目标【英文标题】:Node.js - targeting a cpu core 【发布时间】:2012-09-08 02:04:22 【问题描述】:

如何启动节点进程,针对特定的 CPU 内核?

我见过节点集群,但我有兴趣在不同的内核上启动两个不同的进程。

我假设从命令行启动节点时有一种方法可以做到这一点,即:

节点 myapp.js

如果有区别,我很想知道如何在 windows 和 linux 中执行此操作。

【问题讨论】:

使用 PM2 你可以做到这一点:github.com/Unitech/pm2 @Unitech 可以用一些代码添加答案吗?您如何针对特定的 CPU 内核? 【参考方案1】:

一般来说,调度程序会在没有任何帮助的情况下完成这项工作。在野外,我只见过一种情况很重要....

我们在 8 核机器上部署了一个节点服务,在负载测试期间,我们发现了最奇怪的现象……该服务实际上在 7 个 worker 时的表现比在 8 个 worker 时更好。稍后进行一些调试,我们发现所有网络中断由核心 0 处理。我使用了 15 个工作人员,因此与其他核心相比,核心 0 将分担 1/2 的负载。最终,我认为我们最终选择了 7 名工人,因为它更简单、更可预测,而且复杂性不值得获得约 7% 的理论吞吐量。

话虽如此,在 linux 上设置 CPU 亲和性:

$ taskset -pc 3089
pid 3089's current affinity list: 0,1

$ taskset -p 3089
pid 3089's current affinity mask: 3 # core 0 = 0x1, core 1 = 0x2


$ taskset -pc 1,2,3 3089 
pid 3089's current affinity list: 0,1
pid 3089's new affinity list: 1

【讨论】:

一般来说,调度程序会在没有任何帮助的情况下完成这项工作我明白了。我想我太想手动强制亲和力了。你知道调度程序的行为记录在哪里吗?例如。如果你在 4 核机器上启动 4 个节点服务,每个服务会在不同的核上执行,就像那样? 实际上有多个内核调度程序,取决于操作系统版本和 Linux,您可以交换一些针对各种情况进行优化的替代方案。一般来说,如果你有 N 个要运行的东西,并且有 N 个内核,那么调度程序的工作就很容易了。这不是万无一失的,但我发现让性能变得更糟和让它更好地处理核心亲和力一样容易。需要进行大量仔细的分析才能了解实际发生的情况并证明您通过向系统添加约束使事情变得更好。 "如果你在 4 核机器上启动 4 个节点服务,每个服务会在不同的核上执行吗?" ——一句话,是的。尽管探索和测量事物(去过那里,做过)很有趣,但您不太可能对系统自动执行的操作有很大的推动作用。在您尝试修复未损坏的东西之前,我会等到您遇到明显的问题。此外,如果它们正在服务请求,您不应该将这些盒子推到接近 100% 的负载(队列工作人员是另一回事)。即使是 50% 的负载也非常激进,会导致大量额外的请求延迟。 感谢您提供的额外信息。不过,在一定程度上我没有太多选择,我们正在以相当高的并发性和频率进行 websocket 消息传递,这变成了 N+1 类型的问题:/ 问题是节点创建了多个进程并且它不会与任何子进程一起工作【参考方案2】:

在 linux 上,您可以使用taskset 来运行具有给定 CPU 亲和力的节点。有关在 Windows 中使用 start 命令执行相同操作的信息,请参阅 this post。

【讨论】:

以上是关于Node.js - 以 CPU 核心为目标的主要内容,如果未能解决你的问题,请参考以下文章

node.js哲学与核心原理

如何用 Node.js 和 Elasticsearch 构建搜索引擎

Node.js 集群

node.js的异步编程

VSCode Node.js 调试配置 (npm 脚本启动)

如何防止 Node.js API REST 应用程序对高 CPU/RAM 使用率无响应?