Как я могу установить лимит процессора и памяти для процесса на Java?

#java #tomcat

#java #tomcat

Вопрос:

Привет, я хочу создать веб-сайт, используя Java и сервер tomcat. Веб-сайт установит ограничение процессора и памяти для каждого пользователя для всех их процессов на сервере. Например, для каждого пользователя%3 лимита процессора и 100 МБ памяти.

Как я могу это сделать? Спасибо

Комментарии:

1. Вы можете предоставить каждому пользователю ограничение по памяти, предоставив им их собственный процесс tomcat, но это не ограничит использование ЦП.

2. Обычно ограничение процессора — это настройки ОС, которые соответствуют приложениям. Я думаю, что программное обеспечение в ОС просто всегда использует столько вычислительной мощности, сколько может. Я никогда не слышал о том, чтобы Java могла ограничивать собственное использование. Посмотрите на настройки вашего tomcat или настройки ОС, это было бы моим первым предположением.

3. Я искал это почти 2 года. Я пока не нашел хорошего решения. Я даже спрашивал, как реализовать JVM внутри JVM, но проекты для этого были заброшены. Итак, я сделаю ваш вопрос любимым 🙂

Ответ №1:

Это невозможно с одним процессом Tomcat. Вам нужно создать несколько дочерних процессов, каждый со своей собственной (-Xmx100m ИЛИ квота памяти, зависящая от ОС) И специфичными для ОС настройками для управления квотой процессора.

В зависимости от того, насколько вредоносными могут стать ваши пользователи, вы также можете ограничить количество доступных файловых дескрипторов, диапазоны портов, дисковую квоту и т.д. В конце, возможно, стоит поместить процесс каждого пользователя в виртуальную машину и / или тюрьму.

Ответ №2:

В Java нет механизма, доступного для обеспечения соблюдения ограничений на использование ресурсов потоков. Единственный способ, которым вы можете это сделать, — заставить базовую операционную систему выполнять это, что, скорее всего, потребует от вас создания отдельной JVM для каждого ограничения, и это не будет переносимо на разные платформы.

Обратите внимание, что вы можете установить ограничение по времени ожидания для вызова функции (используя Executor) и прервать большинство операций. Для вас этого может быть достаточно. Если вам нужно больше, вам снова потребуется вмешательство операционной системы.