【问题标题】:Node.js: How to run multiple different apps on a the same server and optimize CPU usage?Node.js:如何在同一台服务器上运行多个不同的应用程序并优化 CPU 使用率?
【发布时间】:2021-02-10 20:05:49
【问题描述】:

假设

  1. 有 200 个不同的 NodeJs ExpressJs 应用程序,它们必须同时运行。
  2. 考虑到这些应用中有 190 个几乎没有做任何事情,但仍然使用大量服务器资源。
  3. 我们使用pm2 运行这些应用程序。
  4. 服务器配置:Windows Server 2008、8 核 CPU、32GB RAM 和 2TB HDD。

问题

CPU 使用率将立即达到 100%,并且会降低服务器速度,即使某些应用确实处于空闲状态。

问题

  1. 如何优化这个问题?甚至可以在同一台服务器上运行 200 个不同的应用程序吗?
  2. 如何限制应用使用一定数量的资源?

【问题讨论】:

  • 当您运行 nodejs 服务器实例时,即使当前没有任何任务在此实例上运行,也会分配资源。当您运行 200 个实例时,您的机器将需要分配这些资源。你可能需要重构你的实例然后变成最小的实例,将许多可能的资源加入到最小的实例中
  • 200 个应用似乎很多。必须有办法让它变小。我会先尝试这样做,然后看看如何添加更多服务器。\
  • 您实际上正在运行 201 个应用程序:pm2 本身就是一个应用程序。而且,201 个 nodejs 实例对于一台机器来说是一个非常大的数字。使用命令行htop 实用程序检查您的机器中发生的情况,或者如果您无法获得,请使用top 实用程序。你能确定一个特定的 nodejs 实例占用你的 CPU 吗?也许是pm2?即使您的 CPU 使用率很高,您的应用程序是否响应合理? Edit您的问题请告诉我们更多信息。
  • 8 核 Intel 芯片实际上是 4 核。他们有所谓的超线程来帮助进程之间的上下文切换,以及健康的营销语言。
  • 这些应用程序中的大多数 (190) 需要不到 5% 的 CPU 使用率,但我们仍然需要单独运行它们。

标签: node.js server cpu-usage windows-server


【解决方案1】:

一台机器上的 200 个 nodejs 实例远远太多了。每个实例都需要大量 RAM 和 CPU。

它们需要的虚拟内存可能比您机器的物理内存多得多。您的操作系统尝试通过在硬盘驱动器之间交换进程 RAM 来通过 thrashing 来应对这种过载。抖动会使机器缓慢爬行。

你可以通过运行nodejs来减少每个nodejs进程使用的内存量

--max-old-space-size=256 

为每个进程分配 256MiB。 (我相信,默认值是 1.5GiB)。但是您可以很容易地看到,这将很快用完您机器的 32GiB RAM。而且,nodejs 强制执行该限制的方式是更频繁地进行垃圾收集。垃圾收集是一个 CPU 密集型过程。

也有可能 pm2 正在消耗大量 CPU 周期来尝试管理 200 个实例。

怎么办?

  • 花钱购买更多具有更多 RAM 和内核的服务器。

  • 使用较小的机器并将每台机器专用于少数实例。如果您的程序确实间歇性运行,AWS 微型 VM 实例(cpu-limited)应该可以正常运行。

  • 重做这 200 个节点程序,使它们中的许多程序可以一起在同一个 nodejs 实例中运行。这是处理大量低负载 Javascript 程序的好方法。 Javascript 的回调和事件驱动模型使得在一个实例中运行许多不相关的东西成为可能(只要这些东西避免全局内存。

【讨论】:

    猜你喜欢
    • 2021-03-02
    • 2019-01-26
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 2021-03-02
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多