当我开始新的分支进程时,NodeJS分叉进程正在减慢所有其他分支进程
我有一个NodeJS
程序,它使用ImageMagick
从我的分区中的一些文本创建图像。该方案是从我的NodeJs
服务器使用当我开始新的分支进程时,NodeJS分叉进程正在减慢所有其他分支进程
import childProcess from 'child_process'; let args = [':imageId', '--max_old_space_size=4096'];
childProcess.fork('createImage.js', args);
创建图像的过程中午饭是它可能需要5-6min我的本地机器上的单张图像大小为114x84cm相当缓慢。
我会尝试解释程序生命周期中发生了什么。
因此,我有服务器运行在进程MyServer
,当有人请求图像MyServer
叉出一个新的进程。
新进程ImageCreator1
有一个来自promise的循环,并且会一直等到全部解决。每个承诺创建使用ImageMagick
在我的活动监视器大图像的一部分,我可以看到,有一些正在运行的进程
Process Name | %CPU MyServer - 0.3
ImageCreator1 - 30.0
convert - 0.1
convert - 0.1
convert - 0.2
convert - 0.1
我也可以看到,ImageCreator1
运行异步4-5 ImageMagick
转换进程创建所有这些需要的小图像。
这一切都需要5分钟。创造大的形象。
所以当我开始两个ImageCreators
的时间增加到9分钟。
Process Name | %CPU MyServer - 0.3
ImageCreator1 - 30.0
ImageCreator2 - 40.0
convert - 0.1
convert - 0.1
convert - 0.2
convert - 0.1
convert - 0.1
convert - 0.1
convert - 0.2
convert - 0.1
,如果我开始ImageCreator3
或ImageCreator4
是越来越慢。我在想,当我开始一个新的过程,并且如果这个过程完成了5分钟的工作。然后,如果我同时启动五个流程,则每个流程都必须完成5分钟。但似乎每个新的ImageCreator
的时间都增加了。
我还在学习阶段NodeJs
和这个OS
的东西,所以如果有人能解释发生了什么将是伟大的。
!!!更新IMAGECREATOR代码!!!
console.time('imageCreator'); process.title = 'imageCreator'+process.argv[2];
const fs = require('fs');
const gm = require('gm').subClass({imageMagick:true});
const Promise = require('bluebird');
var images = [], rows = [];
for(var i = 1; i<=100;i++){
images.push(i);
}
for(var i = 1; i<=10;i++){
rows.push(Promise.reduce(images, function(total, image){
return new Promise(function(resolve, reject) {
gm('xc:rgb('+(image*2)+','+image+','+(image*2)+')')
.in('-units', 'PixelsPerInch')
.in('-size', '100x100')
.in('-density', 300)
.in('-page', '+'+(image-100)*100+'+0')
.toBuffer('miff', function(err, stream){
fs.appendFile(__dirname+'/test'+process.argv[2]+'.miff', stream, function(err){
if(err) reject(err);
else resolve(image);
});
});
});
}));
}
Promise.all(rows).then(function() {
console.timeEnd('imageCreator');
});
所以我正在做一些测试,以找出我的脚本的哪些部分是有问题的。这里是一个例子,当我在我的Mac上运行这个时发生了什么。顺便说一句我也重新编译的ImageMagick所以现在我有:
Version: ImageMagick 6.9.7-2 Q16 x86_64 2017-01-03 http://www.imagemagick.org Copyright: © 1999-2017 ImageMagick Studio LLC
License: http://www.imagemagick.org/script/license.php
Features: Cipher DPC Modules
Delegates (built-in): bzlib freetype jng jpeg ltdl lzma png tiff xml zlib
所以,当我一个终端上运行上面的脚本中,我得到这样的时候:
Terminal1 - imageCreator: 7498.438ms - 7.4984380002sec.
但是当我尝试在两个接线端子同一时间:
Terminal1 - imageCreator: 14632.522ms - 14.632522sec. Terminal2 - imageCreator: 13734ms - 13.734sec.
正如你所看到的,两者的时间差不多加倍。
我的电脑有:
processor:2.7 GHz Intel Core i5 memory:8 GB 1867 MHz DDR3
所以这是怎么回事,我猜RAM这里所涉及的,但我不是非常好,这种低层次的东西,所以如果有人可以解释将是巨大的。先谢谢你。
回答:
您执行此代码的计算机有多少个CPU核心?当你用child_process
创建一个新进程时,你正在开始一个新进程 - 这意味着OS调度程序将试图与你的父进程并行地运行新进程 - 但是这个需要多个CPU的。
如果您没有多个CPU,将会发生什么情况是操作系统调度程序将在运行主进程和子进程之间开始交换,并在同一CPU上给每个CPU时间,从而不会真正运行他们在'并行',因为在任何给定的时间只有一个指令将被执行。
另一件需要注意的事情是ImageMagick:在多个进程中运行安全吗?
我对ImageMagick并不是很熟悉,但是根据2009年的this old thread(现在可能会有所不同),ImageMagick使用自己的线程:所以在多个进程中同时运行它不会导致任何加速。
希望有帮助!
以上是 当我开始新的分支进程时,NodeJS分叉进程正在减慢所有其他分支进程 的全部内容, 来源链接: utcz.com/qa/263440.html