Ivan Istomin
Ivan Istomin
24 y.o. Software Engineer from Moscow.
Читать 1 минуту

Настройка JVM — G1GC флагов сборщика мусора для Minecraft

Image for post
Типа, в конечном итоге тебе все равно перезапускать сервер.
Ниже, представлен мой перевод на статью о правильной настройке сборщика мусора для сервера Minecraft, и не забудем про источник

Введение

После многих недель изучения JVM, флагов и вариаций различного тестирования, я придумал тщательно настроенный набор флагов сборщика мусора для Minecraft. Я протестировал их на своем сервере, и они используются уже много лет. Затем я объявил о своих исследованиях публично, и по сей день многие серверы используют мои флаги в течение многих лет и сообщают о значительных улучшениях в работе сборщиков мусора.

Подбор данных флагов является результатом тонны усилий, и результатом их использования в производстве на серверах различного: размера, списках плагинов и типа серверов. Они зарекомендовали себя неоднократно.

Я настоятельно рекомендую использовать данные флаги для своего сервера. Они помогут сохранить сервер ПОСЛЕДОВАТЕЛЬНО работающим без больших скачков при сборе мусора. Процессор может быть немного мощней, но в целом ваш сервер будет с более надежным и стабильным TPS [Пр.И.: Ticks Per Second].

Флаги для использования при запуске JVM

Используйте эти флаги точно, меняя только Xmx и Xms. Эти флаги работают и масштабируются в соответствии с любым размером памяти, даже 500MB).

~$ java -Xms6G -Xmx6G -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -XX:MaxGCPauseMillis=100 -XX:+DisableExplicitGC -XX:TargetSurvivorRatio=90 -XX:G1NewSizePercent=50 -XX:G1MaxNewSizePercent=80 -XX:G1MixedGCLiveThresholdPercent=35 -XX:+AlwaysPreTouch -XX:+ParallelRefProcEnabled -Dusing.aikars.flags=mcflags.emc.gs -jar yourserver.jar

Рекомендуемое серверное программное обеспечение

Если вы еще не используете Paper, предельно улучшенную версию Spigot, вам действительно нужно переключаться! Paper – это гораздо более быстрая версия Spigot с большим количеством улучшений производительности. Кроме того, она поставляется с исправлениями ошибок и эксплойтов, множеством новых функций, а также кучей новых API для разработчиков, чтобы они могли более эффективно работать с плагинами.

Paper – это лишь капля от Spigot, для которого каждый плагин, написанный для Bukkit/Spigot должен работать абсолютно также.

Image for post
Paper Minecraft Сервер

Paper обновляется практически также быстро, как и сам Minecraft!


Рекомендуемая память

Я рекомендую использовать до 10 ГБ, независимо от того, сколько игроков у вас играет! Если вы не можете позволить себе 10 Гб памяти, дайте максимально столько, сколько сможете, но убедитесь, что вы и операционной системе оставили немного памяти тоже. G1GC работает лучше с большим количеством памяти.

Переход свыше 10 ГБ может начать становиться субъективным, но должен быть нормальным. Хотя, довольно много серверов действительно требуют больше 10 ГБ.

Если вы работаете с памятью 10 ГБ или меньше для Minecraft, вам не следует настраивать данные параметры.

Потребности в памяти старшего поколения

Если у вас большое количество игроков и вы используете более 10 ГБ памяти, и вы видите старые всплески лагововых шипов, вы, возможно, захотите настроить следующее:

  • -XX:G1MaxNewSizePercent=60
  • -XX:G1NewSizePercent=40

Техническое пояснение флагов

  1. -Xms соответствует -Xmx – Почему: Вы никогда не должны запускать свой сервер в том случае, если -Xmx может загрузить систему вплодь до Out of Memory. От вашего сервера всегда следует ожидать, что он будет использовать весь -Xmx!
    Затем вы должны убедиться, что операционная система имеет дополнительную память сверх этого Xmx для вещей отличного от уровня MC/OS. Поэтому никогда не запускайте MC с настройками -Xmx, которые вы не можете поддержать, если Java может использовать все это.
    Теперь это означает, что если -Xms ниже, чем -Xmx - У ВАС НЕ ИСПОЛЬЗОВАННАЯ ПАМЯТЬ! Неиспользованная память — это пустая трата памяти. G1 (и, вероятно, даже CMS до определенного порога, но я только говорю то, в чем я уверен) работает лучше с большим количеством памяти, которое она дает. G1 адаптивно выбирает, сколько памяти уделять каждой области, чтобы оптимизировать время паузы.
    Если у вас больше памяти, чем нужно для достижения оптимального времени паузы, G1 просто втолкнет эту дополнительную память в старое создание и это не причинит вам вреда (это может быть и не так для CMS, но так же, как и для G1).
    Фундаментальная идея улучшения поведения GC заключается в том, чтобы недолговечные объекты умирали молодыми и никогда не разрастались.
    Чем больше памяти у G1, тем больше вы будете уверены в том, что объекты не будут преждевременно разрастаться в старое поколение.
    G1 работает иначе, чем предыдущие коллекторы, и способен более эффективно обрабатывать большие кучи. Если ему не нужна предоставленная память, он не будет ею пользоваться. Весь движок работает по-другому и не страдает от слишком больших куч, и это общепринятая в отрасли информация, которая при G1 держит Xms и Xmx одинаковыми!
  2. UnlockExperimentalVMOptions – необходим для некоторых из нижеперечисленных опций
  3. TargetSurvivorRatio: Уверен, вы все привыкли видеть это предложение. Хорошие новости! Вообще-то, это хороший флаг. Эта настройка управляет тем, сколько пространства "Survivor" можно использовать перед расширением. Если survivor становится сильно заполнен, вещи начинают продвигаться в старое поколение.
    Причина этого заключается в том, чтобы иметь возможность обрабатывать всплески выделения памяти, однако скорость выделения MC в большинстве случаев довольно стабильна (стабильно высока....), и когда она стабильна, ее можно безопасно поднять, чтобы избежать преждевременных скачков.
  4. G1NewSize Percent: Это важные. В CMS и других генерациях, настройка нового генератора приводит к ФИКСИРОВАННОМУ РАЗМЕРУ Нового генератора и обычно осуществляется посредством явной настройки размера с помощью -Xmn.
    С G1 все гораздо лучше! Теперь вы можете задать процент от общего желаемого диапазона для нового генератора.
    С этими настройками мы говорим G1 не использовать 5% по умолчанию для нового генератора, а вместо этого дать ему 50% как минимум!
    Minecraft имеет чрезвычайно высокую скорость выделения памяти, которая составляет не менее 800 Мегабайт в секунду на сервере из 30 игроков! И это в основном короткоживущие объекты (Позиция блока).
    Теперь, это означает, что MC действительно нуждается в большем внимании к новому поколению, чтобы иметь возможность даже поддерживать эту скорость распределения. Если ваш новый генератор слишком мал, вы будете запускать коллекции нового поколения 1-2+ раз в секунду, что действительно плохо.
    У вас будет так много пауз, что TPS рискует пострадать, и сервер не сможет поспевать за стоимостью GC.
    Тогда объедините тот факт, что объекты теперь будут быстрее продвигаться, в результате чего ваше старое поколение будет расти быстрее.
    Учитывая большее количество объектов нового поколения, мы можем замедлить интервалы между коллекциями молодого поколения, в результате чего у короткоживущих объектов появляется больше времени для молодой смерти, и в целом, более эффективное поведение GC.
    Если вы бегаете с большей кучей (15 ГБ+), вы можете захотеть снизить минимум до скажем 40%, но не опускаться ниже 30%. Это позволит G1 иметь больше власти в своих собственных предположениях.
  5. G1MixedGCLiveThresholdPercent: Управляет тем, когда включать Mixed GC в коллекцию молодого GC, поддерживая порядок в старой коллекции, не делая обычную коллекцию старых GC. Если ваша память меньше этого процента, старое поколение даже не будет включено в "смешанные" коллекции. Смешанные коллекции не такие тяжелые, как полная старая коллекция, поэтому небольшие пошаговые чистки старых коллекций позволяют не тратить много времени на использование памяти.
  6. AlwaysPreTouch: Данная опция настраивает память и резервирует ее при запуске процесса, обеспечивая ее целостность, повышая эффективность ее работы. Это повышает скорость доступа к памяти операционной системы.
  7. +DisableExplicitGC: Многие плагины думают, что они знают, как управлять памятью, и пытаются вызвать сборщик мусора. Плагины, которые делают это запускает сборщик мусора полностью, вызывая массивную задержку и резкий всплеск. Этот флаг отключает плагины от попыток сделать это, защищая вас от их плохого кода [:D].
  8. MaxGCPauseMillis=100: Эта настройка контролирует, сколько памяти используется между Минимальным и Максимальными диапазонами, указанными для вашей новой генерации. Это "цель", как долго вы хотите, чтобы ваш сервер останавливался для сборов данных. 100 равно 2 тикам, с максимальной потерей 2 тиков. Это приведет к короткому падению TPS, однако, Spigot и Paper оба могут компенсировать это падение мгновенно, что означает, что это не будет иметь значимого влияния на ваш TPS. 100 мс это меньше, чем игроки могут заметить.
  9. +ParallelRefProcEnabled: Оптимизирует процесс GC для использования нескольких потоков.

Использование больших страниц

Также для больших страниц [Пр.И.: Large Pages] – еще более важно использовать -Xms = -Xmx! Для больших страниц должна быть указана вся память, иначе вы можете остаться без выигрыша. Эта память все равно не будет использоваться операционной системой, так что используйте ее.
Также используйте эти флаги (Metaspace – только для Java 8, не используйте его для Java 7):

Код:

-XX:+UseLargePagesInMetaspace

Хочу сказать спасибо статье «G1GC Fundamentals: Lessons from Taming Garbage Collection» за помощь в укреплении и улучшении моего понимания флагов!


Changelog

  • 04.10.2018: Удален AggressiveOpts и InitiatingHeapOccupancyPercent. Aggressive был удален в Java 11, и IHOP может навредить производительности в Java 11. Вы должны удалить их и для Java 8.
  • 18.08.2018:
  1. Отрегулированно MixedGCLiveThreshold до 35 (с 50) чтобы обеспечить запуск смешанных GC заранее.
  2. Добавлены примечания о рекомендованном использовании 10 ГБ памяти.
  3. Добавлена дополнительная документация по флагам
  • 24.05.2018: Добавлен -XX:+ParallelRefProcEnabled
2 901 просмотр
Добавить
Еще
Ivan Istomin
24 y.o. Software Engineer from Moscow.
Подписаться