在现代Ubuntu服务器上,我们需要托pipe大约二十个Web应用程序。 (更多应用程序将在稍后添加。)
每个应用程序都是一个nginx虚拟主机,它通过Unix域套接字与一组相同的长生命期FCGI进程(内部编写)进行对话。
每个Web应用程序的FCGI进程都不同,但仍然非常相似(只是一些小的业务逻辑差异)。
通常,我们将为每个Web应用程序分配一个Xen虚拟机。 但在这种情况下,内存开销太大 – 进程是轻量级的,通常不会互相影响或争夺资源。 我们希望将所有这些东西托pipe在一个Xen虚拟机中。
但是,由于某些无法预料的错误,FCGI进程可能会stream氓并且吃掉机器上的所有CPU和/或内存,从而影响其他Web应用程序。
我们希望隔离彼此的networking应用程序,以尽量减less一个networking应用程序中的问题会影响到其他人的机会。
CPU和内存资源是主要关注的问题。 这对于IO吞吐量等其他控制事物是很好的,但是我有一种感觉,如果我们觉得这太过于迂腐,最好还是使用Xen,与系统pipe理工作相比,内存成本可以忽略不计成本。 在实践中,在我们的具体情况下,我们认为除CPU和内存不足之外的其他事情是低风险的问题,如果发生这种情况,我们会接受其他Web应用程序最初将遭受损失。
问题是:在我们的例子中,为一组进程限制CPU和内存消耗的正确方法是什么?
我不知道“正确”的方式是什么(我猜想没有一个)。 除了使用虚拟机….
您可以使用(重新)nice(生成的进程inheritance父级的优先级)来限制进程的调度。 您可以使用taskset将进程(或进程组)环绕到单个CPU。 并且可以使用ulimit设置各种内存使用限制。
有一个小的机会,由于一些无法预料的错误,一个FCGI进程会stream氓,吃掉所有的CPU和/或内存
也许你应该考虑看门狗?
根据交通量和性能要求,也许使用CGI而不是FCGI可能是一个想法?