На современной машине с Ubuntu Server нам нужно разместить около двадцати веб-приложений. (Другие приложения будут добавлены позже.)
Каждое приложение представляет собой виртуальный хост nginx, который общается с группой идентичных долгоживущих процессов FCGI (написанных внутри компании) через Unix Domain Socket.
Процессы FCGI различны для каждого веб-приложения, но все же довольно похожи друг на друга (лишь некоторые незначительные различия в бизнес-логике).
Обычно мы выделяем одну виртуальную машину Xen для каждого веб-приложения. Но в этом случае накладные расходы на память слишком велики - процессы легковесны и обычно не влияют друг на друга и не конкурируют за ресурсы. Мы хотели бы разместить все это на одной виртуальной машине Xen.
Однако есть небольшая вероятность, что из-за какой-то непредвиденной ошибки процесс FCGI станет некорректным и съест весь процессор и / или память на машине, что повлияет на другие веб-приложения.
Мы хотели бы изолировать веб-приложения друг от друга, чтобы свести к минимуму вероятность того, что проблемы в одном веб-приложении повлияют на другие.
Ресурсы ЦП и памяти являются основными проблемами. Было бы неплохо для других элементов управления, таких как пропускная способность ввода-вывода и т. Д., Но у меня такое чувство, что если мы будем слишком педантичными в этом отношении, в любом случае лучше использовать Xen, затраты на память будут незначительны по сравнению с работой по управлению системой. расходы. На практике в нашем конкретном случае мы считаем другие проблемы, кроме нехватки ЦП и памяти, проблемами с низким уровнем риска, и если это произойдет, мы согласимся с тем, что другие веб-приложения изначально пострадают.
Возникает вопрос: как правильно ограничить потребление ЦП и памяти группой процессов в нашем случае?
Я не знаю, что такое «правильный» способ (и подозреваю, что его нет). Помимо использования виртуальной машины ....
Вы можете ограничить планирование процесса, используя (повторно) nice (порожденные процессы наследуют приоритет от своего родителя). Вы можете связать процесс (или группу процессов) с одним процессором с помощью набора задач. С помощью ulimit можно установить различные ограничения на использование памяти.
есть небольшая вероятность, что из-за какой-то непредвиденной ошибки процесс FCGI выйдет из строя и поглотит весь процессор и / или память
Может, стоит подумать о сторожевом псе?
В зависимости от объема трафика и требований к производительности, возможно, стоит использовать CGI, а не FCGI?