我正在使用Node.js产生100个以上的子进程,可能甚至是1000.我关心的是父进程可能会成为某种瓶颈如果所有的子进程的stdout/stderr必须通过父进程才能在某处登录。从父进程派生/产生许多node.js进程的最高性能方式
所以我的假设是,为了达到最高的性能/吞吐量,我们应在父进程忽略标准输出/标准错误,就像这样:
const cp = require('child_process');
items.forEach(function(exec){
const n = cp.spawn('node', [exec], {
stdio: ['ignore','ignore','ignore','ipc']
});
});
我的问题是,如何在性能损失的钱它以这种方式使用管道:
// (100+ items to iterate over)
items.forEach(function(exec){
const n = cp.spawn('node', [exec], {
stdio: ['ignore','pipe','pipe','ipc']
});
});
这样,stdout和stderr被传送到父进程?我假设的性能损失可能是激烈的,特别是如果我们处理标准输出/标准错误在父进程中,像这样:
// (100+ items to iterate over)
items.forEach(function(exec){
const n = cp.spawn('node', [exec], {
stdio: ['ignore','pipe','pipe','ipc']
});
n.stdout.setEncoding('utf8');
n.stderr.setEncoding('utf8');
n.stdout.on('data', function(d){
// do something with the data
});
n.stderr.on('data', function(d){
// do something with the data
});
});
我假设
- 我认为,如果我们用“忽略”的标准输出和在父进程中stderr, 这比管道标准输出/标准错误到父进程更高性能。
我认为,如果我们选择一个文件流的标准输出/标准错误喜欢这样
stdio: ['ignore', fs.openSync('/some/file.log'), fs.openSync('/some/file.log'),'ipc']
,这几乎是用“忽略”的标准输出/标准错误(应该送作为高性能stdout/stderr到/ dev/null)
这些假设是否正确?关于stdout/stderr,如果我想将stdout/stderr记录到某处(而不是/ dev/null),如何实现最高性能?
注:这是一个库,所以stdout/stderr的数量可能会有很大的不同。此外,最有可能很少分叉更多的进程比核心,最多同时运行约15个进程。
如果源代码出现问题,部分答案在这里:https://github.com/nodejs/node/blob/master/lib/child_process.js –
并在这里:https://github.com/ nodejs/node/blob/master/lib/internal/child_process.js –
你的程序库需要分叉多少子进程? – robertklep