Я прочитал несколько статей о лучших методах установки значений {Min/Max/Initial}RAMPercentage
для Java-приложений в облачной среде. Назначение флагов Min и Max RAM Percentage мне понятно.
С другой стороны, я не могу ни понять, ни найти причину рекомендаций (1-й , 2-й и 3-й) установить для -XX:InitialRAMPercentage
и -XX:MaxRAMPercentage
одинаковые значения.
Поэтому хотелось бы понять:
InitialRAMPercentage
? Я предполагаю, что оно будет автоматически масштабироваться в течение срока службы приложения (поскольку значение по умолчанию составляет около 1,5 процента) и не вызовет никаких проблем, если его не установить.InitialRAMPercentage
то же значение, что и MaxRAMPercentage
?Здесь я нашел более общий вопрос, если кому-то интересно узнать больше причин, лежащих в основе таких рекомендаций: stackoverflow.com/questions/10423715/…
Это не жесткое правило, и следует ли вам это делать, во многом зависит от вашего приложения.
Установка одинаковых значений будет означать, что ваше приложение всегда будет использовать один и тот же размер кучи, а это означает, что использование памяти (игнорируя колебания в использовании собственной памяти) будет стабильным. Это означает, что вы, как правило, можете легко настроить квоты своего модуля (т. е. limits.memory
и requests.memory
) и, таким образом, иметь стабильные затраты, и это также снижает вероятность того, что ваше приложение будет уничтожено, если узлу необходимо сделать ресурсы доступными для другого модуля (что может произойти если вы превысите свои запросы (памяти), даже если вы все еще в пределах своих возможностей)
С другой стороны, если ваше приложение имеет различную рабочую нагрузку и, следовательно, различные потребности в памяти, их установка по-разному может снизить затраты, если вы используете сборщик мусора, который возвращает память в ОС. Например, на предыдущей работе нам удалось сэкономить немало денег на одном приложении, настроив requests.memory
и -XX:InitialRAMPercentage
на определенный минимум, а также установив limits.memory
и -XX:MaxRAMPercentage
намного выше для пакетной обработки. Обратной стороной этого было то, что это увеличивало вероятность того, что наши модули будут перенаправлены на другой узел в случае увеличения нехватки памяти, но в нашей ситуации это был приемлемый компромисс.
Чтобы внести ясность: действительно ли это экономит деньги, также зависит от вашей фактической конфигурации кластера Kubernetes и от того, будут ли узлы вращаться вверх и вниз в зависимости от общей нагрузки, однако в нашем случае мы сэкономили расходы на бюджет нашей команды, потому что нам фактически выставили счет за использование наших приложений, а также учитывая размер нашей компании и динамическое увеличение и уменьшение количества модулей и узлов, это, вероятно, также сэкономило деньги на уровне компании.
Кроме того, установка -XX:InitialRAMPercentage
и -XX:MaxRAMPercentage
может лишить эвристическую конфигурацию сборщика мусора некоторой гибкости, что может означать, что вам придется выполнить более явную настройку самостоятельно, чтобы получить наилучшую производительность.
Кроме того, -XX:InitialRAMPercentage
указывает процент памяти, которую будет занимать куча при запуске приложения, поэтому ее нельзя «масштабировать автоматически в течение срока службы приложения». Его значение по умолчанию составляет 1,562500%, что довольно мало. Если вашему приложению требуется много памяти, то установка его в соответствии с его фактическими потребностями позволяет избежать ряда полных циклов сборки мусора во время запуска, и, таким образом, правильная установка этого параметра сокращает время запуска вашего приложения.
возможно, вам следует спросить автора(ов) "нескольких статей"... не зная их причин, мы можем только догадываться