Назад | Перейти на главную страницу

Пошаговый запуск процесса java linux для предотвращения OOM

Я запускаю несколько java-процессов на одной машине Linux. С точки зрения памяти и вычислений все в порядке, когда вещи статичны.

Однако периодически мы используем пакет управления конфигурацией для обновления файлов jar или war и перезапуска процесса java.

Проблема в том, что они все перезапускаются относительно быстро, и поэтому мы получаем 10 или около того перезапускаемых виртуальных машин Java одновременно (мы используем daemontools для остановки / запуска службы), что наносит ущерб машине с точки зрения OOM. или просто очень медленно. Это потому, что одновременно с этим порождается JVM 10x.

Есть ли более разумный способ справиться с этим, кроме попыток поразить стартапы? Может быть, параметры производительности настройки sysctl или параметр JVM?

Еще один подход состоит в том, чтобы отредактировать файлы запуска для различных java-демонов и поставить произвольный случайный сон до того, как Damon будет запущен. Это может быть не то, что вам нужно при ручном перезапуске в других обстоятельствах, но это может помочь снизить нагрузку, когда все запускаются в гремящем стаде.

sleep $[ $RANDOM % 300 ]

Есть ли какой-нибудь сценарий, который вы могли бы вызвать вместо этого, который запустит процессы Java и будет отслеживать их с помощью таймеров или мониторинга использования ресурсов перед вызовом следующего приложения Java? Это похоже на следующий шаг, который стоит попробовать, если мне придется к нему приблизиться.

Другое решение - добавить ему больше памяти. Я знаю, что это нормально, когда все уладится, но если он так сильно ломается при перезапуске процессов (и когда запускается сервер), бросание оборудования может быть наиболее экономичным по времени способом решения проблемы. Я смутно припоминаю из подкастов, что это была философия Этвуда при загрузке сайтов StackOverflow / ServerFault / Superuser; оборудование было дешевым, поэтому, если ресурсов не хватает, добавляйте больше. Хотя, возможно, я неправильно это запомнил. Просто мысль.

Я думаю, что концепция cfengine используется отлично подходит для вас. Я бы не стал беспокоиться о настройке sysctl - в конце концов, это может повредить реальной производительности во время выполнения! - но придерживайтесь того же подхода, что и cfengine.

Так что он делает? cfengine имеет увеличивать время - если у вас есть 1000 клиентских узлов, настроенных для подключения к главному серверу с вопросом, есть ли что-то новое, каждый из клиентских узлов подключится к серверу в настроенное время + время отображения. Итак, вы можете настроить свои узлы для подключения к серверу в 00:00, 01:00, 02:00 ... но некоторые из них будут подключаться к серверу в 00:00:00, некоторые из них - в 00:00:30. , некоторые в 00:01:00 ... независимо от того, какой диапазон отображения вы настроите.

Я не предлагаю вам на самом деле использовать cfengine, я только что упомянул время отображения. Идите вперед и подражайте его поведению. :-)

На вашем месте я бы не пытался запускать 10 виртуальных машин Java одновременно, это звучит как серьезная пытка сервера.