当我开始新的进程时,NodeJS fork进程正在减慢所有其他分叉的进程

我有一个NodeJS程序,它使用ImageMagick从我的数据库中的一些文本创build一个图像。 该程序是从我的NodeJs服务器使用

 import childProcess from 'child_process'; let args = [':imageId', '--max_old_space_size=4096']; childProcess.fork('createImage.js', args); 

创build图像的过程非常缓慢,在本地机器上可能需要5-6分钟才能处理尺寸为114x84cm的单张图像。

我将尝试解释程序生命周期中发生的事情。

所以,我有服务器上运行的进程MyServer ,当有人请求一个图像MyServer派生一个新的进程。

新的进程ImageCreator1有一个来自promise的循环,并将等到所有的解决。 每个承诺使用ImageMagick创build一个大的图像的一部分

在我的活动监视器中,我可以看到有一些正在运行的进程

 Process Name | %CPU MyServer - 0.3 ImageCreator1 - 30.0 convert - 0.1 convert - 0.1 convert - 0.2 convert - 0.1 

另外我可以看到ImageCreator1运行asynchronous4-5 ImageMagick转换进程来创build所有这些需要的小图片。

这一切将需要5分钟。 创造大的形象。

所以当我启动两个ImageCreators的时间增加到9 ImageCreators

 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 

如果我启动ImageCreator3ImageCreator4变得越来越慢。 我在想,当我开始一个新的过程,如果这个过程完成了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'); }); 

所以我正在做一些testing,以找出我的脚本有哪些部分是有问题的。 这是一个例子,当我在我的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 

所以当我在一个terminal上运行上面的脚本,我得到的时间如下:

 Terminal1 - imageCreator: 7498.438ms - 7.4984380002sec. 

但是当我在同一时间尝试两个terminal:

 Terminal1 - imageCreator: 14632.522ms - 14.632522sec. Terminal2 - imageCreator: 13734ms - 13.734sec. 

正如你所看到的,两者的时间几乎相同。

我的电脑有:

 processor:2.7 GHz Intel Core i5 memory:8 GB 1867 MHz DDR3 

所以发生了什么事情,我想这里面涉及到了内存,但是我对这个低级的东西不是很满意,所以如果有人能解释的话,那将是非常棒的。 先谢谢你。

你正在执行这个代码的计算机有多less个CPU核心? 当你用child_process创build一个新的进程时,你开始一个新的进程 – 这意味着OS调度器将尝试与你的父进程并行地运行新进程 – 但是这需要多个CPU。

如果你没有多个CPU,会发生什么情况是操作系统调度程序将在运行你的主进程和你的subprocess之间开始交换,并且在同一个CPU上给每个进程CPU时间,从而不能真正在“并行因为在任何时候只有一条指令会被执行。

另一件要小心的是ImageMagick:在多个进程中运行是否安全?

我对ImageMagick并不是很熟悉,但是根据2009年的这个老版本 (现在可能会有所不同),ImageMagick使用自己的线程:所以在多个进程中并发运行不会导致任何加速。

希望有所帮助!