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



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

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

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

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

我将避免对VM进行分区,因为这意味着您可能最终会浪费RAM和CPU——您很可能会发现一个VM使用了100%的资源,而另一个则处于空闲状态。运行5个而不是1个操作系统也会带来不小的开销。

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

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

相反,您需要一个在单独的线程上完成OCR工作的库。Tesseract_native就是一个例子。它的设计是正确的:它使用libuv在工作线程上调用tesseract。

libuv维护一个工作线程池,所以你可以有尽可能多的并发OCR操作,所有这些操作都在一个进程中。

最新更新