Обсудим [Spigot 1.11.2] Crash сервера при заполнении ОЗУ

  • Автор темы Автор темы XboxPro
  • Дата начала Дата начала

XboxPro

Активный участник
Баллы
61
Ник в Minecraft
XboxProOne
Здравствуйте! Прошу помощи или совета.
Немного о сервере
Сервер Spigot 1.11.2 работает под Ubuntu 14.04 (64bit)
Выделено 16Gb ОЗУ (Работает под Hyper-V)
Версия Java: 1.7.0_121

Во время прогрузки новой карты с помощью плагина WorldBorder
(/wb fill 80) происходит crash сервер при заполнении всей доступной серверу ОЗУ -Xmx12G
Из плагинов установлены только WorldBorder и Dynmap

Используя советы с темы: http://rubukkit.org/threads/kak-sdelat-server-otkazoustojchivym.37655/
Участника форума InterVi
Если выделить джаве всю память в -Xms, то она ее сожрет и отвалится. Если этот параметр меньше допустимого максимума, то джава будет стремится укладыватся в его рамки и исервер будет жить хорошо.

И это работало на CraftBukkit 1.9.4, но на Spigot 1.11.2 ОЗУ забивается и сервер крашится.

мой start.sh:
Код:
java -Xmx12G -Xms4G -XX:MaxPermSize=512M -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:parallelGCThreads=20 -jar spigot.jar nogui


Используя документацию Oracle Java и Google поиск - пытался найти решения самостоятельно.
https://docs.oracle.com/cd/E40972_01/doc.70/e40973/cnf_jvmgc.htm
http://www.oracle.com/technetwork/articles/java/vmoptions-jsp-140102.html
https://habrahabr.ru/post/269863/

Подскажите пожалуйста, кто смог разобраться, что я могу предпринять для разгрузки ОЗУ.

----
Дополнение (может кому пригодится)
Переехал на Ubuntu Server 16 (чистая установка) и версию Java:
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

Используя советы из статей
https://forums.spongepowered.org/t/optimized-startup-flags-for-consistent-garbage-collection/13239
https://github.com/Brettflan/WorldBorder/issues/75
и документацию Java 8
http://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html

удалось частично оптимизировать работу Spigot 1.11.2 с плагином WorldBoard
также я выставил значение авто-сохранения мира /wb fillautosave [seconds]
Заметил, что во время частого сохранения происходит заполнение ОЗУ и изменил параметр на 3600 сек (1час)

из моего start.sh
Код:
java -Xms2G -Xmx10G -XX:+UseLargePagesInMetaspace -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -XX:MaxGCPauseMillis=100 -XX:+DisableExplicitGC -XX:TargetSurvivorRatio=90 -XX:G1NewSizePercent=50 -XX:G1MaxNewSizePercent=80 -XX:InitiatingHeapOccupancyPercent=10 -XX:G1MixedGCLiveThresholdPercent=50 -XX:+AggressiveOpts -XX:+AlwaysPreTouch -jar spigot.jar nogui

-XX:+UseLargePagesInMetaspace работает в Java 8

Оставлю тестироваться на ночь
 
Последнее редактирование:
Убери динмапу и проверь как будет.
Dynmap удалял, но сервер крешился. И сейчас не использую его.
Дописал дополнение в шапке темы
Переехал на версию Java:
java version "1.8.0_121"
За ночь сервер не крашнулся хотя ОЗУ забивается до конца и в N-промежуток времени появляется сообщение о освобождении памяти.
Available memory is very low, task is pausing. A cleanup will be attempted now, and the task will automatically continue if/when sufficient memory is freed up.
Alternatively, if you restart the server, this task will automatically continue once the server is back up.

но даже при /wb fill 500 карта (wb set 50000 будет погружаться около 2-х недель хотелось бы побыстрее), пробую уже на физическом сервере под Windows Server 2008 с /wb fill 1000
java -Xms6G -Xmx24G ...

подцепил Zabbix для мониторинга
 
Оптимизированная java машина для серверов (облачных):
http://zulu.org/download/
Качаешь под ubuntu и ставишь.
sudo apt install ./имяпакета
И удаляешь старый openjdk:
sudo apt purge openjdk-8-jdk
sudo apt -purge autotemove

Затем меняешь ядро на форк спигота. Развивается медленно, но работает стабильно (последний раз пользовался им на 1.9.4)
Билд под 1.11:
https://ci.techcable.net/job/TacoSpigot/86/artifact/build/TacoSpigot.jar
 
Оптимизированная java машина для серверов (облачных):
http://zulu.org/download/
Качаешь под ubuntu и ставишь.
sudo apt install ./имяпакета
И удаляешь старый openjdk:
sudo apt purge openjdk-8-jdk
sudo apt -purge autotemove

Затем меняешь ядро на форк спигота. Развивается медленно, но работает стабильно (последний раз пользовался им на 1.9.4)
Билд под 1.11:
https://ci.techcable.net/job/TacoSpigot/86/artifact/build/TacoSpigot.jar
Обычная java, только удалили несколько системных драрников. Быстрее оно не станет работать. А вот что то отвалится может, из за их отсутствия.
 
Оптимизированная java машина для серверов (облачных):
http://zulu.org/download/
Качаешь под ubuntu и ста..

Спасибо, попробую.

1000 это же колво чанков в секунду.
Или нет?
Для прогрузки чанков и 12гб маловато. У меня она и 28гб кушала.
Ставь 100. Это вроде оптимальное колво чанков.
Попробуй эти флаги
https://aquifermc.org/threads/optim...kes-fix-tps-improve-performance.101/#post-822

Пост с этого форума, уже читал но тут (использую эти флаги к java8):
https://forums.spongepowered.org/t/optimized-startup-flags-for-consistent-garbage-collection/13239

при wb fill 100 память все равно заполняется до отказа, но только медленнее.
screenshot из Zabbix первая волна - wb fill 1000, сейчас вторая ползет - wb fill 100
unRW1N-VBGw.jpg


не понятно почему не работают флаги java8 которые должны "выносить мусор" разгружая ОЗУ
ведь это работало у меня на CraftBukkit 1.9.4
 
Спасибо, попробую.



Пост с этого форума, уже читал но тут (использую эти флаги к java8):
https://forums.spongepowered.org/t/optimized-startup-flags-for-consistent-garbage-collection/13239

при wb fill 100 память все равно заполняется до отказа, но только медленнее.
screenshot из Zabbix первая волна - wb fill 1000, сейчас вторая ползет - wb fill 100
unRW1N-VBGw.jpg


не понятно почему не работают флаги java8 которые должны "выносить мусор" разгружая ОЗУ
ведь это работало у меня на CraftBukkit 1.9.4
Значит где то утечка памяти идет, в ядре или плагинах.
 
Значит где то утечка памяти идет, в ядре или плагинах.
из плагинов только WorldBorder, ядро спигота (spigot-1.11.2-R0.1-SNAPSHOT) собирал через BuildTools, как предложенный вариант участником форума InterVi, так как загруженное с https://getbukkit.org/spigot так и не смог запустить из за имеющейся ошибки при запуске сервера:
java.lang.NoClassDefFoundError: org/apache/logging/log4j/core/config/ConfigurationFactory$Factory
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:195)
at org.apache.logging.log4j.core.config.plugins.PluginManager.decode(PluginManager.java:241)
at org.apache.logging.log4j.core.config.plugins.PluginManager.collectPlugins(PluginManager.java:152)
at org.apache.logging.log4j.core.config.plugins.PluginManager.collectPlugins(PluginManager.java:130)
at org.apache.logging.log4j.core.pattern.PatternParser.<init>(PatternParser.java:116)
at org.apache.logging.log4j.core.pattern.PatternParser.<init>(PatternParser.java:102)
at org.apache.logging.log4j.core.layout.PatternLayout.createPatternParser(PatternLayout.java:183)
at org.apache.logging.log4j.core.layout.PatternLayout.<init>(PatternLayout.java:115)
at org.apache.logging.log4j.core.layout.PatternLayout.createLayout(PatternLayout.java:219)
at org.apache.logging.log4j.core.config.DefaultConfiguration.<init>(DefaultConfiguration.java:51)
at org.apache.logging.log4j.core.LoggerContext.<init>(LoggerContext.java:63)
at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.locateContext(ClassLoaderContextSelector.java:217)
at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:114)
at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:81)
at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:83)
at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:34)
at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:387)
at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:322)
at net.minecraft.server.v1_11_R1.MinecraftServer.<clinit>(MinecraftServer.java:53)
at org.bukkit.craftbukkit.Main.main(Main.java:186)
Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.core.config.ConfigurationFactory$Factory
at java.net.URLClassLoader$1.run(URLClassLoader.java:356)
at java.net.URLClassLoader$1.run(URLClassLoader.java:348)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:347)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 21 more
Caused by: java.util.zip.ZipException: invalid LOC header (bad signature)
at java.util.zip.ZipFile.read(Native Method)
at java.util.zip.ZipFile.access$1400(ZipFile.java:56)
at java.util.zip.ZipFile$ZipFileInputStream.read(ZipFile.java:682)
at java.util.zip.ZipFile$ZipFileInflaterInputStream.fill(ZipFile.java:415)
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:158)
at sun.misc.Resource.getBytes(Resource.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:437)
at java.net.URLClassLoader.access$100(URLClassLoader.java:64)
at java.net.URLClassLoader$1.run(URLClassLoader.java:354)
... 27 more

похоже что ядро битое, собери заново через BuildTools или перекачай откуда-нибудь
 
Xms с Xmx должны быть равны. И да, снимай все флаги, оставляй только G1GC, AlwaysPreTouch. И да последнее ядро не будет отгружать чанки если тик сервера уходит полностью на что-то ещё, так что отгружать их надо силой.
 
Последнее редактирование:
Xms с Xmx должны быть равны. И да, снимай все флаги, оставляй только G1GC, AlwaysPreTouch.

Значит именно флаг -XX:+AlwaysPreTouch заполняет всю указанную в Xms, Xmx ОЗУ и после работает с ней.
Судя по мониторингу из Zabbix идет очистка мусора и новое заполнение. Оставлю до завтра для тестирования на crash. Указал wb fill 200.

И да последнее ядро не будет отгружать чанки если тик сервера уходит полностью на что-то ещё, так что отгружать их надо силой.

Не совсем понятно про "так что отгружать их надо силой"
 
Извращенци... у меня на на 4 гига за ночь норм прогружалась карта, только немного подлагивало, но и игроки играли.. Поставь clearlagg и в нем настрой ограничение нагрузки.
 
Значит именно флаг -XX:+AlwaysPreTouch заполняет всю указанную в Xms, Xmx ОЗУ и после работает с ней.
Судя по мониторингу из Zabbix идет очистка мусора и новое заполнение. Оставлю до завтра для тестирования на crash. Указал wb fill 200.



Не совсем понятно про "так что отгружать их надо силой"
chunk.unload(true).
 
Заново установил чистую Ubuntu 16.04 (в прошлой осталось много мусора)
oracle-java8 от webupd8team и обновил пакетом zulu8 (http://zulu.org)
получилось так:
openjdk version "1.8.0_121"
OpenJDK Runtime Environment (Zulu 8.20.0.5-linux64) (build 1.8.0_121-b15)
OpenJDK 64-Bit Server VM (Zulu 8.20.0.5-linux64) (build 25.121-b15, mixed mode)

Случайно узнал о PaperSpigot
https://yivesmirror.com/downloads/paperspigot
Почитав документацию об изменениях, настройках и улучшенной производительности
https://paper.readthedocs.io/en/paper-1.11/config/
Решил использовать это ядро спигота. (Кстати производительность ощущается).

Выделил на этот раз 4ГБ ОЗУ
-Xms4G -Xmx4G

Мои флаги в start.sh
Код:
java -Xms4G -Xmx4G -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -XX:+AggressiveOpts -XX:+AlwaysPreTouch -jar PaperSpigot-1.11.2-b1055.jar nogui

Загрузив новый мир, указал границу /wb set 5000 и /wb fill 100, карта погружалась около 4 часов, занимаемое место world 2.1ГБ. Краша не возникло, ОЗУ освобождается по мере работы сервера, это видно из htop.

Сейчас все работает стабильно, на данный момент отрабатывает Dynmap отрисовку карты для браузера. Теперь буду пробовать границу мира /wb set 50000.

---
Спасибо всем, кто помог, и давал советы, самостоятельно разбирался бы долго и не узнал бы о zulu8 и TacoSpigot и PaperSpigot.
 
Последнее редактирование:
Назад
Верх Низ