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

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

我可以select使服务器(运行这个服务器的虚拟机)具有大内存和磁盘空间的多个核心机器,或者我可以select创build4个或5个小型虚拟机,每个虚拟机1个内核,1 GB内存,相对较小磁盘大小。

采用第一种方法,我必须分叉各种subprocess以利用所有内核,这增加了代码的复杂性。 另一方面,我只有一个虚拟机担心。 第二种方法,我不必担心分叉subprocess,但我将不得不创build和configuration多个虚拟机。

每种方法还有没有其他的利弊呢?

我会避免划分虚拟机,因为这意味着你最终可能会浪费内存和CPU – 使用100%的资源而另一个虚拟机闲置时,你不可能find一个虚拟机。 运行5个操作系统,而不是一个操作系统,也有不小的开销。

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

npm上的很多tesseract库都写得不好。 它们是tesseract C代码的极简单的绑定。 在JS中,你可以调用addon的recognize()函数,它只是调用tesseract的Recognize() ,它以阻塞的方式进行CPU密集型工作。 这意味着你正在对主要的V8线程进行识别,我们知道这是一个“否”。 我假设这就是为什么你正在考虑分叉进程,因为每个分支只能一次执行一个阻塞OCR操作。

相反,你需要一个在独立线程上运行OCR的库。 tesseract_native就是一个例子。 它的devise正确:它使用libuv调用工作线程上的tesseract。

libuv维护着一个工作者线程池,所以你可以拥有和核心一样多的并发OCR操作,全部在一个进程中。