具有额外进程的Node.js群集

我们在多CPU处理器上使用快速应用程序进行群集。 运行良好,我们可以最大限度地利用AWS Linux服务器。

我们inheritance了一个我们正在修复的应用程序。 这是不寻常的,它有两个过程。 它有一个快速API部分,以接收传入的请求。 但是作用于这些请求的进程可以运行几分钟,所以它被构build为一个独立的后台进程,调用python和maya的节点。

最初这两者是紧密耦合的,由请求调用的python脚本上传数据。 但是这当然不是最理想的,因为它会让客户端等待响应的时间,所以它被重写为循环运行的后台进程,检查新的上传并按顺序处理它们。

所以我的问题是这样的:如果我们在后台运行这个单独的节点进程,并且运行集群为每个CPU启动一个进程,那么如何工作呢? 我们不打算让两个节点进程竞争同一个CPU。 我们有一些奇怪的行为,昨天崩溃,没有太多的错误消息,(我爱上帝),所以它有点关注。 我假设Linux只会在进程和进程之间交换进程。 但是我想知道是否会有问题,而且我也怀疑有人在长时间运行的进程运行的情况下将networking会话换出了几分钟。

明智的做法是将其重写为在两台不同的服务器上运行,但maya使用/创build的文件位于服务器的文件系统上,我们没有得到预算来重build应该的方式。 所以,我们现在坚持这个架构。

任何想法现在可能的问题,以及如何避免他们将不胜感激。

从整体架构的angular度来看,每个内核产生1个nodejs是一个很好的select。 尽pipe你有很多的依赖关系,nodejs进程正在调用可能使用multithreading的maya(记住这一点)。

与我有关的部分是你的随机崩溃和你的“循环运行的过程”。 如果这个过程只是检查文件系统,那么你可能有一个竞争状态,nodejs进程正在争夺相同的input/输出文件。

从理论上讲,每个内核1个nodejs进程将会很好,并且有助于利用所有的CPU使用。 Linux总是将进程交换出来,所以这不是问题。 你可以为每个核心启动多个nodejs,但仍然没有问题。

最后一个注意事项,一定要留意你的内存使用情况,EC2上的几个Linux发行版默认没有启用交换文件,内存不足可能是另一个无声的应用程序杀手,最好添加一个交换文件,以防万一遇到内存问题。