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

NodeJS - forked processes (1 VM, multiple processors) VS multiple VMs, 1 process

我正在 NodeJS 中开发一项服务,该服务将使用用于 tesseract OCR 引擎的节点包装器从图像创建文本文件。我希望它成为一个持续 运行ning 服务,由 upstart 启动和重新启动(在崩溃时)。

我可以选择让服务器(虚拟机运行)成为具有大 RAM 和磁盘的多核机器 space 或者我可以选择创建 4 或 5每个具有一个内核、1 GB RAM 和相对较小的磁盘大小的小型 VM。

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

每种方法还有其他我没有想到的优点和缺点吗?

我会避免对 VM 进行分区,因为这意味着您最终可能会浪费 RAM,并且 CPU -- 您很可能会发现一个 VM 使用 100% 的资源而另一个闲置. 运行 5 个操作系统而不是一个操作系统也涉及不小的开销。

您为什么考虑分叉多个进程?如果你使用正确的库,这将是不必要的。

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

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

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