NodeJS - 分叉进程(1个VM,多个处理器)VS多个VM,1个进程

时间:2016-09-02 17:26:18

标签: node.js multicore child-process

我正在NodeJS中开发一项服务,该服务将使用tesseract OCR引擎的节点包装器从映像创建文本文件。我希望它是一个不断运行的服务,由upstart启动并重启(崩溃)。

我可以选择使用具有大RAM和磁盘空间的多台核心机器来生成服务器(运行它的虚拟机),或者我可以选择创建4个或5个小型VM,每个VM有一个核心,1 GB RAM和相对较小的磁盘大小。

使用第一种方法,我将不得不分叉各种子进程以利用所有内核,这增加了代码的复杂性。另一方面,我只需要担心一个VM。 使用第二种方法,我不必担心分支子进程,但我必须创建和配置多个VM。

我还没有考虑过每种方法的其他优点和缺点吗?

1 个答案:

答案 0 :(得分:2)

我会避免对虚拟机进行分区,因为这意味着你可能最终会浪费内存和CPU - 你不会发现一个虚拟机使用100%的资源而另一个空闲。运行5个操作系统而不是一个操作系统也涉及非平凡的开销。

您为什么要考虑分许多个流程?如果您使用正确的库,则不需要这样做。

npm上的许多tesseract库编写得很糟糕。它们是对tesseract C代码的超简单绑定。在JS中,您调用addon的recognize()函数,该函数只调用tesseract的Recognize(),它以阻塞方式执行CPU密集型工作。这意味着你正在主V8线程上进行识别,我们知道这是一个禁忌。我假设这就是你考虑分叉进程的原因,因为每个进程只能同时进行一次阻塞OCR操作。

相反,您希望在单独的线程上执行OCR的库。 tesseract_native就是一个例子。它设计得恰当:它使用libuv调用工作线程上的tesseract。

libuv维护一个工作线程池,因此您可以在一个进程中拥有与核心一样多的并发OCR操作。