Утечка памяти (скорее всего)

Haunted

Активный участник
Баллы
61
Ник в Minecraft
IIHaunted
Я держу майнкрафт сервер на PurPur 1.18.2, и последний +-месяц наблюдаю падение игрового сервера. У меня 3 сервера - Velocity, Lobby и основной игровой. Падает только основной и только при наличии хотя бы 1 игрока. Долгое время пытаюсь решить эту проблему как самостоятельно, так и с помощью тех поддержки хостингов/платных системных администраторов. Помимо падений бывают залаги как основного сервера, так и велосити (перестаёт пускать игроков, но продолжает работать ссылаясь на плохое подключение игрока)

Оперативная память выходит за рамки установленных данных в start.sh, забивает фулл оперативу и SWAP и далее падает основной игровой сервер (без краш репортов или каких либо варнов/ошибок). Сервер падает без сохранений, оставляя обрыв в логах, будто бы ничего не произошло.

Параметры VDS:
36GB Оперативной памяти
16 Процессоров AMD Ryzen 7 5800X

Пробовал уйму методов, расскажу по порядку: 1. Смена хоста, 2. Перебор плагинов по одному, 3. Оптимизация кфг ядер, 4. Изменения в командах запуска.

1. Изначально был на хостинге appletec, проблема появилась где то в середине разработки сервера. Краши были изначально с большой переодичностью, постепенно ускоряясь. Потом перешел на OVH (проблема осталась)

2. Перебирал плагины, особо не заметил разницу в потреблении оперативки, так же сильно жрёт. (возможно проблема в них, но я не в силах полноценно разобраться в этом)

3. Ставил дефолт кфг ядер, ставил настроенные по гайдам в форумах, ставили сис. админы. Не помогло.

4. Пробовал разное: Выделять 2гб при старте и ставить максимум 10, выделять 10гб при старте и максимум 24. Пробовал даже SWAP в запуске, оставляя 2гб на старт и 24-2 гб максимума. Ставил 24 выделенных и 24 максимум. Менял флаги запуска, ничего не поменялось.
Команда запуска на данный момент:

java -Xms128M -Xmx$((20576-4096))M -Dterminal.jline=false -Dterminal.ansi=true -Duser.timezone=GMT+3 --add-modules=jdk.incubator.vector -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true -XX:G1NewSizePercent=40 -XX:G1MaxNewSizePercent=50 -XX:G1HeapRegionSize=16M -XX:G1ReservePercent=15 -XX:+UnlockDiagnosticVMOptions -XX:GCLockerRetryAllocationCount=4 -jar server.jar --nogui
​
Прикрепил к посту список плагинов.

Проверял сборку на наличие вирусов, ничего не нашел. Все плагины в сборке либо бесплатные, либо самописные либо платные. На данный момент в сборке нет ни 1 ликнутого или скачанного с сомнительного ресурса плагина.
image.png

Вот htop моего вдс:
image.png
Тут сервер работает 9 минут. Онлайн: 5-9

heapsummary от spark - Heap Summary | spark (lucko.me)
 
Помимо падений бывают залаги как основного сервера, так и велосити (перестаёт пускать игроков, но продолжает работать ссылаясь на плохое подключение игрока)
Возможно перестает пускать как раз из-за проблем на игровом сервере, а не из-за велосити. Лучше это диагностировать в моменте.

Оперативная память выходит за рамки установленных данных в start.sh
Это нормальная ситуация. В аргументах запуска указывается количество памяти, выделяемой самому приложению. Вот только помимо этого количество нужна оперативная память для работы самой виртуальной машины Java. Обычно полгига запаса бывает достаточно, но бывают и исключения. Возможно как раз твоя ситуация.

забивает фулл оперативу и SWAP и далее падает основной игровой сервер
А вот это уже не нормально. Даже если это происходит при запуске с запасом памяти, то ты явно что-то делаешь не так. Первое же, на что я обратил внимание - это аргумент, ограничивающий макс. количество памяти:
-Xmx$((20576-4096))M
Это что? Там указано конкретное значение или вот прям так и установлено? В любом случае, должно быть конкретное число:
-Xmx4096M

падает основной игровой сервер (без краш репортов или каких либо варнов/ошибок). Сервер падает без сохранений, оставляя обрыв в логах, будто бы ничего не произошло.
Такое чаще всего происходит НЕ при утечке памяти, а при убийстве процесса.

Первая причина такого поведения - убивает панель сервера из-за различных причин. Есть какие-то панели по типу Pterodactyl или иные? Или же управление по SSH?
в логах панели наверняка можно найти записи об убийстве процесса.

И вторая причина такого поведения - линукс убивает процессы, когда в системе конается оперативная память. Механизм называется Out-Of-Memory Killer.
При этом в системных логах тоже появляется соответствующая запись, файл /var/log/syslog

Параметры VDS:
36GB Оперативной памяти
У тебя при таком подходе остаётся 12 гигов. Часть идёт на JVM, часть на другие процессы, часть на систему. Если оперативки не остаётся, то как раз система и убивает процесс.

Так что поставь для начала небольшое значение - для десяти игроков будет достаточно 4- гигов с головой. После этого прям в игре проверь количество выделенной памяти, чтобы убедиться, что оно действительно корректное. В Essentials для этого есть команда /mem или /gc
Если есть какая-то утечка - как раз сервер будет быстрее падать, чтобы подтвердить или опровергнуть твою теорию.

Если падения продолжатся, то начни проделывать каждый из шагов, пока причина не будет обнаружена:
1) Изучи логи. После корректировки xmx логи с высокой вероятностью НЕ будут обрываться. Возможно найдёшь причину остановки/зависания/падения сервера
2) Обнови ядро до последнего билда ядра (пурпур 1.18.2). Если не помогло, то...
3) Пробуй временно убрать половину плагинов. Если не помогло, то...
4) Пробуй временно убрать другую половину плагинов. Если не помогло, то...
5) Удали для теста все аргументы java кроме xms и xmx. Если не помогло, то...
6) Обнови Java до последнего билда. 1.18.2 работает на 17+, но при желании можно ставить и более новые версии, всё должно работать. Если не помогло, то будем разбираться дальше

Таким образом ты, скорее всего, приблизишься к обнаружению причины проблемы. 10 минут - довольно небольшой промежуток времени, поэтому найти причину можно довольно быстро
 
Возможно перестает пускать как раз из-за проблем на игровом сервере, а не из-за велосити. Лучше это диагностировать в моменте.


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


А вот это уже не нормально. Даже если это происходит при запуске с запасом памяти, то ты явно что-то делаешь не так. Первое же, на что я обратил внимание - это аргумент, ограничивающий макс. количество памяти:
-Xmx$((20576-4096))M
Это что? Там указано конкретное значение или вот прям так и установлено? В любом случае, должно быть конкретное число:
-Xmx4096M


Такое чаще всего происходит НЕ при утечке памяти, а при убийстве процесса.

Первая причина такого поведения - убивает панель сервера из-за различных причин. Есть какие-то панели по типу Pterodactyl или иные? Или же управление по SSH?
в логах панели наверняка можно найти записи об убийстве процесса.

И вторая причина такого поведения - линукс убивает процессы, когда в системе конается оперативная память. Механизм называется Out-Of-Memory Killer.
При этом в системных логах тоже появляется соответствующая запись, файл /var/log/syslog



У тебя при таком подходе остаётся 12 гигов. Часть идёт на JVM, часть на другие процессы, часть на систему. Если оперативки не остаётся, то как раз система и убивает процесс.

Так что поставь для начала небольшое значение - для десяти игроков будет достаточно 4- гигов с головой. После этого прям в игре проверь количество выделенной памяти, чтобы убедиться, что оно действительно корректное. В Essentials для этого есть команда /mem или /gc
Если есть какая-то утечка - как раз сервер будет быстрее падать, чтобы подтвердить или опровергнуть твою теорию.

Если падения продолжатся, то начни проделывать каждый из шагов, пока причина не будет обнаружена:
1) Изучи логи. После корректировки xmx логи с высокой вероятностью НЕ будут обрываться. Возможно найдёшь причину остановки/зависания/падения сервера
2) Обнови ядро до последнего билда ядра (пурпур 1.18.2). Если не помогло, то...
3) Пробуй временно убрать половину плагинов. Если не помогло, то...
4) Пробуй временно убрать другую половину плагинов. Если не помогло, то...
5) Удали для теста все аргументы java кроме xms и xmx. Если не помогло, то...
6) Обнови Java до последнего билда. 1.18.2 работает на 17+, но при желании можно ставить и более новые версии, всё должно работать. Если не помогло, то будем разбираться дальше

Таким образом ты, скорее всего, приблизишься к обнаружению причины проблемы. 10 минут - довольно небольшой промежуток времени, поэтому найти причину можно довольно быстро

По поводу вопросов:
1. Выделение оперативной памяти было создано вместе со свапом как я понял (ставила тех поддержка хостинга, как 1 из вариантов попытки решения проблемы). На данный момент стоит статичное число - 18. Все так же падает.
2. Управление идет по SSH исключительно, проверял /gc (Essentials), выделение памяти идет корректно.
Теперь по поводу предложений:
1. Логи никак не меняются от команды запуска. Они обрываются в обоих случаях.
2. Ядро обновлял. Ушел с пурпура по итогу на пафферфиш, по итогу сервер живет больше, оптимизация лучше.
3. Я не удалял половину плагинов. Я мучаясь удалял по 1 плагину, проверяя и дожимая до конца (до каления). Судя по всему плагины тут не сильно влияют.
4. Аналогично с 3.
5. Флаги запуска менял многократно, чаще всего это вызывало большие проблемы.
6. Джава стоит ласт билда 17 версии. Сменить саму версию не смогу, на ней держатся многие плагины в моей сборке.

Могу дополнить, что начал по одному плагину воссоздавать сборку на отдельной вдс, по началу помогало. Решил заменить многий мусор одним CMI (оплаченный, не ликнутый). Проблемы вроде бы не было, но с разовым добавлением 4-5 плагинов судя по накоплению оперативки проблема настигла меня и тут. Отправлю плагины, которые я добавил.
 
По поводу вопросов:
1. Выделение оперативной памяти было создано вместе со свапом как я понял (ставила тех поддержка хостинга, как 1 из вариантов попытки решения проблемы). На данный момент стоит статичное число - 18. Все так же падает.
2. Управление идет по SSH исключительно, проверял /gc (Essentials), выделение памяти идет корректно.
Теперь по поводу предложений:
1. Логи никак не меняются от команды запуска. Они обрываются в обоих случаях.
2. Ядро обновлял. Ушел с пурпура по итогу на пафферфиш, по итогу сервер живет больше, оптимизация лучше.
3. Я не удалял половину плагинов. Я мучаясь удалял по 1 плагину, проверяя и дожимая до конца (до каления). Судя по всему плагины тут не сильно влияют.
4. Аналогично с 3.
5. Флаги запуска менял многократно, чаще всего это вызывало большие проблемы.
6. Джава стоит ласт билда 17 версии. Сменить саму версию не смогу, на ней держатся многие плагины в моей сборке.

Могу дополнить, что начал по одному плагину воссоздавать сборку на отдельной вдс, по началу помогало. Решил заменить многий мусор одним CMI (оплаченный, не ликнутый). Проблемы вроде бы не было, но с разовым добавлением 4-5 плагинов судя по накоплению оперативки проблема настигла меня и тут. Отправлю плагины, которые я добавил.

Вот список плагинов. Все скачаны с официальных ресурсов. В AjLeaderboards я уверен (удалял его из проблемной сборки и сервак все равно падал), не уверен разве что с PrimeAlchemist и возможно с AdvancedCrates
image.png
 
Вот список плагинов. Все скачаны с официальных ресурсов. В AjLeaderboards я уверен (удалял его из проблемной сборки и сервак все равно падал), не уверен разве что с PrimeAlchemist и возможно с AdvancedCrates
Посмотреть вложение 66194
Я правильно понимаю, что ситуация сейчас такая?
1) Ядру выделено небольшое количество памяти, это подтверждается значениями в /mem
2) В системе остаётся большое количество оперативной памяти
3) Сервер по-прежнему завершает работу, а логи при этом обрываются
4) Проблема воспроизводится даже без плагинов

Всё верно?

В этом случае вопрос - каким образом запускается сервер?
В screen/tmux/docker? Через панели по типу Multicraft/Pterodactyl?
 
Всё было куда проще.
JSEXP, как я уже не раз говорил - корень всех зол

Удалил бы джейкоб то видео с ним к ебени матери, чтоб людей не приучать к софту вредящему...
 
Всё было куда проще.
JSEXP, как я уже не раз говорил - корень всех зол

Удалил бы джейкоб то видео с ним к ебени матери, чтоб людей не приучать к софту вредящему...
😆😆😆👎👎👎🙄🙄🙄😢😢😢👍👍👍👍
 
Задампи сурв и почекай через yourkit
 
Назад
Верх Низ