Node.js: 如何运行 多个不同的应用程序在同一台服务器上并优化CPU 使用?

Node.js: How to run multiple different apps on a the same server and optimize CPU usage?

假设

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

问题

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

问题

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

一台机器上的 200 个 nodejs 实例 far 太多了。每个实例都需要相当多的 RAM 以及 CPU.

它们需要的虚拟内存可能比您的机器的物理内存多得多。您的 OS 试图通过 抖动 来应对这种过载,方法是将进程 RAM 交换到硬盘驱动器或从硬盘驱动器交换。抖动会使机器变慢。

您可以减少每个 nodejs 进程使用的内存量 运行ning nodejs with

--max-old-space-size=256 

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

也有可能是 pm2 消耗了大量 CPU 周期试图管理 200 个实例。

怎么办?

  • 花钱购买更多内存和内核更多的服务器。

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

  • 返工那些 200 个节点程序,因此其中许多可以 运行 在同一个 nodejs 实例中一起使用。这是处理大量 low-load Javascript 程序的好方法。 Javascript 的回调和事件驱动模型使得在一个实例中 运行 大量不相关的东西成为可能(只要这些东西避免全局内存。