我们在多CPU盒上使用我们的快速应用程序进行群集。效果很好,我们可以最大限度地利用AWS linux服务器。
我们继承了我们正在修复的应用。这是不寻常的,因为它有两个过程。它有一个Express API部分,用于接收传入的请求。但是对这些请求起作用的进程可以运行几分钟,所以它是作为一个单独的后台进程构建的,节点调用python和maya。
最初两者紧密耦合,请求上传数据的python脚本。但这当然不是最理想的,因为它会让客户端等待运行时间的响应,因此它被重写为循环运行的后台进程,检查新的上传,并按顺序处理它们。 / p>
所以我的问题是:如果我们在后台运行这个单独的节点进程,并且我们运行集群为每个CPU启动一个进程,那么它将如何工作?我们不会让两个节点进程竞争同一个CPU。昨天我们得到了一些奇怪的行为和崩溃,没有很多错误消息,(上帝我喜欢节点),所以有点担心。我假设Linux只是在使用它们时将进程交换进出。但是我想知道它是否会有问题,而且我也想知道有人在长时间运行的过程中将他们的网络会话换掉几分钟。
聪明的做法是将其重写为在两台不同的服务器上运行,但可能使用/创建的文件位于服务器的文件系统上,我们没有给出预算来重建我们应该的方式。所以,我们现在仍然坚持使用这种架构。
任何想法现在可能出现的问题以及如何避免这些问题都将受到赞赏。
答案 0 :(得分:1)
从整体架构的角度来看,每个核心产生1个nodejs是一个很好的方法。但是你有很多相互依赖关系,nodejs进程正在调用可能使用多个线程的maya(记住这一点)。
与我有关的部分是你的随机崩溃和你在循环中运行的过程"。如果该进程只是检查文件系统,则可能存在竞争条件,其中nodejs进程正在竞争处理相同的输入/输出文件。
理论上,每个核心1个nodejs进程将运行良好,应该有助于利用所有CPU使用率。 Linux总是将进程交换进出,这不是问题。你可以为每个核心启动多个nodejs,但仍然没有问题。
最后一点注意,一定要留意你的内存使用情况,EC2上的几个linux发行版默认没有启用交换文件,内存不足可能是另一个无声的app杀手,最好添加一个交换文件万一你遇到内存问题。