【问题标题】:Is This Single Node.JS App Using Multiple Cores?这个单 Node.JS 应用程序是否使用多核?
【发布时间】:2020-04-28 23:51:54
【问题描述】:

在仅运行 1 个提取数据馈送的 Node.js 脚本的 Ubuntu 18.04 系统上,htop 显示两个 CPU 内核都在使用。

运行 1 个节点脚本:

没有运行 node.js 脚本:

这个 Node.js 脚本有多个事件监听器,它们接收数据、进行一些数据处理并将它们发送到远程数据库服务器。

foo.on('msg', msg => { setImmediate(() => do_work(msg)) } );

问题:尽管 Node.js 是单线程的,但为什么看起来两个 CPU 内核似乎都被 Node 平等地利用了?观察到的 CPU 负载拆分为 60%/40% 和 50%/50%

它实际上是否同时使用了两个 CPU 内核?或者只是一直非常快速地在它们之间切换,但在任何时候只真正使用 1 个内核?换句话说,当 CPU 工作负载高于 1 个核心但小于 2 个核心时,这种情况会导致系统阻塞。

基本上,我想知道单核系统是否足以应付这种工作负载。谢谢!

【问题讨论】:

  • AFAIK 至少垃圾收集器在自己的线程中运行。
  • 有四个节点实例正在运行(第一张图片)。
  • @Xaqron 我只运行了一次 node.js 脚本。除了垃圾收集器,其他 3 个进程还能做什么?处理异步函数调用?

标签: javascript node.js ubuntu multiprocessing


【解决方案1】:

即使只有一个 JS 函数(每个环境)1 将在任何给定时间在一个内核上执行,但这并不意味着

1:您提到您只运行一个脚本,这意味着只有一个 JS 对象领域。 node.js 应用在多线程上运行的另一种可能性是生成 workers,每个线程都有自己的 JS 环境并通过事件进行通信。

【讨论】:

    【解决方案2】:

    多个节点实例正在运行(当您运行一次脚本时)这一事实意味着这既不是内部node 机制,也不是通过脚本使用worker threads 来利用CPU。

    脚本或它使用的库之一试图通过旧式分叉 (child process) 方式利用 CPU,这会导致 node 的隔离(无共享内存)实例(多个进程,如你的情况)通过IPC进行通信。

    【讨论】:

    • 我的怀疑是一样的,图书馆正在做一个 fork 或 spawn 什么的。
    • @AritraChakraborty 我正在使用带有连接池的 Sequelize.js ORM。 node.js 事件侦听器函数始终以大约 1000 个查询/秒的速度发送数据库查询。您认为 Sequelize.js 可能是导致此分叉/生成的库吗?
    猜你喜欢
    • 1970-01-01
    • 2016-12-07
    • 2014-06-01
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 2022-09-27
    • 1970-01-01
    相关资源
    最近更新 更多