如何避免 Nest.Js / Node.Js 进程占用 100% 的 CPU?

Dmi*_*kin 2 javascript performance foreach node.js nestjs

我有一个在 Nest.Js / Node.Js 上运行的应用程序,它执行文本处理,因此它有一个.map(或.forEach) 迭代,需要大量资源(标记一个句子,然后删除停用词等 \xe2\x80\ x94的每句话可能有几万个)。

\n

为了重现性,我提供了下面使用的代码,没有文本处理详细信息 \xe2\x80\x94 只是一个长而繁重的循环来模拟我的问题:

\n
  const before = Date.now() \n  const statements = [...Array(100)]\n  let l = 0\n  let p = 0\n  const processed = \n     statements.map((value, index) => {\n      \n         // a set of consecutive functions that take a long time to execute\n         for (let i = 0; i < 100000; i++) {\n              l = l + i * Math.random()\n         }\n         // console.log(index + \' \' + l + \' \' + (Date.now() - before))\n             p = index\n       \n    \n        return l\n     })\n  \n  console.log(processed)\n\n  const after = Date.now()\n  console.log(p + \' results in \' + (after - before) + \' ms\')\n
Run Code Online (Sandbox Code Playgroud)\n

对于非常大的文件,该进程会占用 100% 的 CPU,因此应用程序会变得无响应。

\n

我想知道您是否知道任何解决方案可以防止应用程序占用所有可用的 CPU。就像有没有办法将任何单个进程设置为占用 80%,并始终为其他用户留下 20%?

\n

PS 我从 Amazon 的 ECS 运行它,所以我当然可以创建集群并使用 PM2 进行集群化,但我想知道如何避免 Javascript / Node.Js 应用程序本身内的单个进程的 100% 负载。我提到 Nest.Js 框架是因为也许那里也有一个解决方案。

\n

小智 7

在限制单个线程使用 100% CPU 方面,在服务器级别有一些架构方法可以做到这一点,但我认为这并不是您真正想要的结果。CPU 使用 100% 不是问题(CPU 通常会在很短的时间内飙升至 100% CPU 以尽快处理事务),更重要的是长时间使用 100% CPU 并防止其他应用程序无法获取 CPU 周期。

从我在示例代码中看到的,在 NestJS 中使用队列可能是更好的解决方案。可以在此处查看使用 Bull 的文档。通过这种方式,您可以利用正在处理的作业的速率限制并在那里进行调整,并且其他应用程序将不会等待整个过程的完成。

例如,如果您有 100,000 个文件要处理,您可能希望创建一个作业来一次处理其中 1,000 个文件,并创建 100 个作业放入队列中。对于需要大量计算时间的进程来说,这是一个相当典型的过程。

我知道这并不是您正在寻找的答案,但希望它会有所帮助并提供一个不特定于您的架构的解决方案。