![Linux:限制一组进程的CPU和内存消耗](https://linux22.com/image/562824/Linux%EF%BC%9A%E9%99%90%E5%88%B6%E4%B8%80%E7%BB%84%E8%BF%9B%E7%A8%8B%E7%9A%84CPU%E5%92%8C%E5%86%85%E5%AD%98%E6%B6%88%E8%80%97.png)
在现代的 Ubuntu Server 机器上,我们需要托管大约 20 个 Web 应用程序。(稍后会添加更多应用程序。)
每个应用程序都是一个 nginx 虚拟主机,它通过 Unix Domain Socket 与一组相同的长寿命 FCGI 进程(内部编写)进行通信。
每个 Web 应用程序的 FCGI 流程都不同,但彼此仍然非常相似(只是一些细微的业务逻辑差异)。
通常,我们会为每个 Web 应用程序分配一个 Xen 虚拟机。但在这种情况下,内存开销太大了 — 这些进程很轻量,通常不会相互影响或争用资源。我们希望将所有这些东西托管在一个 Xen VM 中。
然而,仍有可能由于某些不可预见的错误,FCGI 进程变得异常活跃,消耗机器上的所有 CPU 和/或内存,从而影响其他 Web 应用程序。
我们希望将 Web 应用程序彼此隔离,以尽量减少一个 Web 应用程序的问题影响其他应用程序的可能性。
CPU 和内存资源是主要问题。如果能控制 IO 吞吐量等其他方面就更好了,但我觉得如果我们对此过于拘泥,那么最好还是使用 Xen,与系统管理工作成本相比,内存成本可以忽略不计。实际上,在我们的具体案例中,我们认为除了 CPU 和内存不足之外的其他问题都是低风险问题,如果发生这种情况,我们会接受其他 Web 应用程序最初会受到影响。
问题是:在我们的案例中,限制一组进程的 CPU 和内存消耗的正确方法是什么?
答案1
我不知道什么是“正确”的方法(我怀疑根本没有)。除了使用虚拟机……
您可以使用 (re)nice(生成的进程从其父进程继承优先级)来限制进程的调度。您可以使用 tasket 将进程(或进程组)隔离到单个 CPU。并且可以使用 ulimit 设置各种内存使用限制。
有可能由于某些不可预见的错误,FCGI 进程会变得异常,并消耗所有 CPU 和/或内存
也许你应该考虑一下看门狗?
根据流量和性能要求,使用 CGI 而不是 FCGI 也许是一个好主意?