Почему нам следует устанавливать для -XX:InitialRAMPercentage и -XX:MaxRAMPercentage одно и то же значение для облачной среды?

Я прочитал несколько статей о лучших методах установки значений {Min/Max/Initial}RAMPercentage для Java-приложений в облачной среде. Назначение флагов Min и Max RAM Percentage мне понятно.

С другой стороны, я не могу ни понять, ни найти причину рекомендаций (1-й , 2-й и 3-й) установить для -XX:InitialRAMPercentage и -XX:MaxRAMPercentage одинаковые значения.

Поэтому хотелось бы понять:

  1. зачем мне вообще ставить InitialRAMPercentage? Я предполагаю, что оно будет автоматически масштабироваться в течение срока службы приложения (поскольку значение по умолчанию составляет около 1,5 процента) и не вызовет никаких проблем, если его не установить.
  2. почему я должен устанавливать для InitialRAMPercentage то же значение, что и MaxRAMPercentage?

возможно, вам следует спросить автора(ов) "нескольких статей"... не зная их причин, мы можем только догадываться

user85421 21.06.2024 19:29

Здесь я нашел более общий вопрос, если кому-то интересно узнать больше причин, лежащих в основе таких рекомендаций: stackoverflow.com/questions/10423715/…

ilja 25.06.2024 23:04
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это не жесткое правило, и следует ли вам это делать, во многом зависит от вашего приложения.

Установка одинаковых значений будет означать, что ваше приложение всегда будет использовать один и тот же размер кучи, а это означает, что использование памяти (игнорируя колебания в использовании собственной памяти) будет стабильным. Это означает, что вы, как правило, можете легко настроить квоты своего модуля (т. е. limits.memory и requests.memory) и, таким образом, иметь стабильные затраты, и это также снижает вероятность того, что ваше приложение будет уничтожено, если узлу необходимо сделать ресурсы доступными для другого модуля (что может произойти если вы превысите свои запросы (памяти), даже если вы все еще в пределах своих возможностей)

С другой стороны, если ваше приложение имеет различную рабочую нагрузку и, следовательно, различные потребности в памяти, их установка по-разному может снизить затраты, если вы используете сборщик мусора, который возвращает память в ОС. Например, на предыдущей работе нам удалось сэкономить немало денег на одном приложении, настроив requests.memory и -XX:InitialRAMPercentage на определенный минимум, а также установив limits.memory и -XX:MaxRAMPercentage намного выше для пакетной обработки. Обратной стороной этого было то, что это увеличивало вероятность того, что наши модули будут перенаправлены на другой узел в случае увеличения нехватки памяти, но в нашей ситуации это был приемлемый компромисс.

Чтобы внести ясность: действительно ли это экономит деньги, также зависит от вашей фактической конфигурации кластера Kubernetes и от того, будут ли узлы вращаться вверх и вниз в зависимости от общей нагрузки, однако в нашем случае мы сэкономили расходы на бюджет нашей команды, потому что нам фактически выставили счет за использование наших приложений, а также учитывая размер нашей компании и динамическое увеличение и уменьшение количества модулей и узлов, это, вероятно, также сэкономило деньги на уровне компании.

Кроме того, установка -XX:InitialRAMPercentage и -XX:MaxRAMPercentage может лишить эвристическую конфигурацию сборщика мусора некоторой гибкости, что может означать, что вам придется выполнить более явную настройку самостоятельно, чтобы получить наилучшую производительность.

Кроме того, -XX:InitialRAMPercentage указывает процент памяти, которую будет занимать куча при запуске приложения, поэтому ее нельзя «масштабировать автоматически в течение срока службы приложения». Его значение по умолчанию составляет 1,562500%, что довольно мало. Если вашему приложению требуется много памяти, то установка его в соответствии с его фактическими потребностями позволяет избежать ряда полных циклов сборки мусора во время запуска, и, таким образом, правильная установка этого параметра сокращает время запуска вашего приложения.

Другие вопросы по теме