1

我正在做一个 CPU 密集型的数学计算,因此我需要使用 node.js 生成一个子进程,因为它可能会阻塞主偶数循环。它不一定是内存密集型的,但它是 CPU 密集型的。例如考虑一个斐波那契数发生器。

我唯一担心的是我可能有很多用户,成千上万的用户同时在做这项工作,这意味着我将在我的 linux 机器上运行数千个进程,因为 node.js 每次 child_process 运行时都会产生一个新进程. 我的问题是 linux 服务器可以处理多少个进程?

注意:我的服务器是具有 4gb 内存的双核 linux VM。即,没有什么花哨的。注意#2:我在这里寻找一个简单的球场图。以千计?谢谢。

4

2 回答 2

0

两点...

  1. 如果您可以根据您的场景缓存/记忆结果,请这样做。
  2. 我会考虑使用generic-pool来限制您对稀疏资源的使用。通过用节点池包装你的控制器,你可以限制自己在给定时间说 10 或 20 个活跃的工作人员。我自己做的物理 CPU 数量不会超过 2 倍,尽管您可以运行多少线程实际上取决于工作人员/系统。如果所有工作进程都相同,则更可预测。
于 2013-07-30T21:51:42.823 回答
0

没有足够公平的数字来说明child_process可以处理多少,因为理论上它应该处理尽可能多的进程。

这取决于您的 SLO(服务水平目标)。如果您希望您的应用程序在 100 毫秒内响应,您应该开始负载测试。

例如

你的主进程:

const cluster = require('cluster'); 
console.log(`master pid=${process.pid}`);
cluster.setupMaster({
  exec: __dirname+'/child-process.js' 
});
cluster.fork(); 
cluster.fork();

cluster
  .on('disconnect', (worker) => { 
    console.log('disconnect', worker.id);
  })
  .on('exit', (worker, code, signal) => {
    console.log('exit', worker.id, code, signal);
    // cluster.fork(); 
  })
  .on('listening', (worker, {address, port}) => {
    console.log('listening', worker.id, `${address}:${port}`);
  });

您的子进程:

import express from 'express';

const HOST = process.env.HOST || '127.0.0.1';
const PORT = parseInt(process.env.PORT || '4000', 10);

console.log(`worker pid=${process.pid}`);

const app = express();
app.get('sync/:limit', (req, res) => {
  res.send(fibonacci(Number(req.params.limit)));
});

app.listen(PORT, HOST, () => {
  console.log(`Running at http://${HOST}:${PORT}`);
});

function fibonacci(limit: number): string {
  let prev = 1n,
    next = 0n,
    swap: bigint;

  while (limit--) {
    swap = prev;
    prev = prev + next;
    next = swap;
  }

  return next.toString();
}

通过autocannon运行测试

$ autocannon -c 2 http://127.0.0.1:4000/100000

它将向您显示延迟,现在您可以开始计算可以处理的最大化过程

Node.js 应用程序可能会变得复杂。进程通常以数十个(如果不是数百个)模块结束,这些模块建立外部连接、消耗内存或读取配置。这些操作中的每一个都可能暴露应用程序中可能导致其崩溃的另一个弱点。出于这个原因,最好让主进程尽可能简单。

推荐人托马斯·亨特。使用 Node.js 的分布式系统

本书的推荐人实现

但是,有一些方法可以帮助您提高服务处理能力。

  1. 使用负载均衡器并扩展您的服务。
  2. 缓存过程或结果。

或者只是限制传入以保持您的 SLO。

于 2021-08-13T01:26:24.793 回答