Показатели команды /mem /gc /lag
  • skibidi
    2 июня 2017 - 15:12
    Вы не авторизованы, войдите на сайт.
  • просмотров 12226 | ответов 14
Если на сервере установлен плагин Essentials, то после ввода команд /mem, /gc или /lag мы увидим в чате вывод показателей:

  • Аптайм — время работы сервера после включения.
  • TPS — Tick Per Second (количество тактов в секунду на сервере).
  • Максимум памяти — количество памяти, выделенной для сервера. Указывается в параметре запуска сервера -Xmx.
  • Выделено памяти — количество используемой памяти, которая требуется серверу в настоящий момент.
  • Свободной памяти — количество памяти, которую освободил сборщик мусора (Java).


Разберём подробнее четвёртый пункт: «Выделено памяти».
Многие не понимают его и думают, что их обманули с памятью. Они считают, что значение «Выделено памяти» должно быть равно значению «Максимум памяти». Это крайне неверное мнение, и складывается оно у многих неопытных пользователей и администраторов серверов Minecraft по причине неправильного перевода плагина.
Итак! Для сервера максимальная память — 10 000 мегабайт (выделить для сервера можно и больше памяти), но это не означает, что сервер сразу будет её всю использовать. Сервер не задействует больше памяти, чем ему требуется, поэтому он из 10 000 мегабайт возьмёт для начала столько, сколько нужно для работы.
Например, при запуске сервера потребовалось 484 мегабайта (как на рисунке), но по мере увеличения количества игроков на сервере карта для каждого из них будет прогружаться. Для этого серверу потребуется больше памяти. Вот тут сервер автоматически начнёт выделять для своей работы ещё памяти из максимально доступной, которая указана в третьем пункте.
На увеличение этого показателя могут влиять и другие факторы: большое количество плагинов, неправильная работа плагинов, неправильная конфигурация плагинов, безрассудный игровой процесс, постоянные огромные сеты (//set), полёты с большой скоростью (/speed 5-10) и многое другое.
Объяснить можно проще, сравнив это с ведром, водой, мальчиком Васей и его гостями.
Представим:
У вас есть пустое ведро, объём которого равен 10 литрам.
У вас есть 1 литр воды.
Мальчик Вася попросил принести ему 1 литр воды.
Вам нужно в этом ведре перенести для Васи 1 литр воды.
Но вдруг Вася сообщает, что к нему пришли гости — ещё 3 мальчика — и требуется воды уже не 1 литр, а 4.
Вы успешно помещаете всю эту воду в ведро в размере 4 литров.
Через некоторое время Василий сообщает, что гостей гораздо больше: их уже не три, а семь, и воды требуется уже 10 литров + 1 литр для мальчика Васи — это уже 11 литров. А ведро у вас всего лишь на 10 литров воды. Вы пытаетесь вместить одиннадцатый литр в 10-литровое ведро, но вода льётся через край. В итоге вы приносите всего лишь 10 литров на 11 человек, и каждому мальчику достаётся менее 1 литра.
Вот то же самое происходит и с сервером.
Разработчики Minecraft рекомендуют для каждого игрока выделять 100 мегабайт оперативной памяти с учётом того, что сервер не будет перегружен плагинами.
Если память вашего сервера — 10 000 мегабайт, а памяти на одного игрока требуется 100 мегабайт, то делим 10 000 / 100 = 100. Получается сто. Значит, при таком объёме оперативной памяти комфортно будут играть на сервере 100 человек, если оперативную память не съедают ваши плагины и игровой процесс.
Ведром в этом случае будет являться сам сервер с выделенной для него памятью 10 000 (как на картинке, это пример). Водой — карта сервера и плагины, а гостями — игроки, заходящие на сервер, для которых потребуется память минимум 100 мегабайт.
Итог таков: показатель «Выделено памяти» отображает размер памяти, который задействован сервером в данный момент и требуется для его работы. Это размер памяти, которую потребляют в данный момент плагины, карта и игроки.
Конечно, можно сделать параметры запуска такими, что карта сразу будет прогружаться до предела выделенной для сервера памяти. Показатели «Максимум памяти» и «Выделено памяти» при этом будут равными. Это принесёт печальный результат и постоянные краши, так как вся память будет бессмысленно израсходована на карту, которая никем не используется.
Сервер Minecraft устроен так, что регионы и чанки начинают прогружаться только тогда, когда игрок попадает на них. Например, зашёл игрок на сервер, телепортировался в определённое место — и вокруг этого игрока в этом месте всё прогрузилось. Начали бегать мобы, заработали механизмы, погода в этом месте начала для игрока меняться — то есть всё ожило. На всё это требуется около 100 мегабайт памяти. Остальные участки карты в тех местах, где нет игроков, отключены, и оперативная память на них не тратится.
А теперь представим, что параметры запуска сервера мы настроили так, что наш сервер прогружает карту на все 10 000 мегабайт. Получится так, что карта, которая не используется игроками, будет расходовать оперативную память. И в случае, если игрок попадёт за пределы координат прогруженной карты, для него не найдётся свободной оперативной памяти для дальнейшей прогрузки. Начнутся лаги, либо сервер крашнется с ошибкой Out of Memory. Ведро-то уже полное. 🙂
Автор: Иван Дратьев
  • skibidi
    3 июня 2017 - 01:19
Kozulka Minecraft сказал(а):
Главное, чтобы не лень было прочитать столько текста.
Я думаю так, кому интересно, прочитают.
  • MersaK
    6 июня 2017 - 05:01
А продолжение про сборщика ненужной памяти и чистилку кто напишет?
Сборка мусора
Управление памятью

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

Но вот какие у него настройки на данном хосте?
Я - честно - не понял, так как когда выполняю команду плагина ASW (модуль AutoSaveWorld)
asw forcegc
В ответ получаю
[Инфо]: Your JVM is configured to ignore GC calls, can't force gc
А на asw serverstatus
 [Инфо]: Cpu usage: 0.01%
 [Инфо]: Memory usage: 12.00% (512/4000 MB)
И если бы это ещё что-то значило, но...
gc отвечает:
[Инфо]: Размер оперативной памяти для вашего сервера: 4,000 MB.
[Инфо]: Размер оперативной памяти требуемый сервером: 942 MB.
[Инфо]: Размер оперативной памяти которая освободилась: 515 MB.

То есть 512 = 515 - окей, нормально. Свободная память.
Но 12% от 4000 = 480Мб - где это, что это?
Графики зоротекса при этом выдают и вовсе:
Процессор: 12 из 160 = 7%
Оперативная память: 1496Mb из 4000Mb = 37%
Вот отсюда у нас начинаются полнейшие непоняти.
Какие параметры запуска Minecraft-сервера на данном хосте?
  • NoName
    6 июня 2017 - 16:21
В ответ получаю[Инфо]: Your JVM is configured to ignore GC calls, can't force gc

Возможно данного флага "GC" - нет в Java 8  либо хостинг использует другой,  аналогичный этому сборщик мусора,  поэтому твой плагин и не может получить данные из этого параметра.
  • NoName
    6 июня 2017 - 16:40
Какие параметры запуска Minecraft-сервера на данном хосте?

Сборщик мусора на хосте более новый: XX:+UseG1GC. В краш-репорте был написан полностью параеметр запуска, если найду выложу.
  • NoName
    6 июня 2017 - 19:59
MersaK MersaK сказал(а):
Какие параметры запуска Minecraft-сервера на данном хосте?

Параметры запуска Вашего сервера:
-server -XX:MaxPermSize=128M -Xmx4000M -Xms128M -Xmn380m -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -XX:MaxGCPauseMillis=45 -XX:TargetSurvivorRatio=90 -XX:G1MaxNewSizePercent=80 -XX:InitiatingHeapOccupancyPercent=10 -XX:G1MixedGCLiveThresholdPercent=50 -XX:+AggressiveOpts -jar spigot-1.10.2.jar
Подробнее о параметрах.
........................................................................Основные параметры:
  • -Xmn определяет объём занятой памяти до которой сборщик мусора должен освобождать память (если это возможно);
  • -Xms определяет размер начальной выделенной памяти под объекты;
  • -Xmx определяет максимальный размер памяти, выше которого приложение не задействует;
  • MersaK
    7 июня 2017 - 17:10
Спасибо, попробуем поменять и понаблюдать эффект.
  • MersaK
    27 июня 2017 - 05:13
Сергей TU154 сказал(а):
Параметры запуска Вашего сервера:-server -XX:MaxPermSize=128M -Xmx4000M -Xms128M -Xmn380m -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -XX:MaxGCPauseMillis=45 -XX:TargetSurvivorRatio=90 -XX:G1MaxNewSizePercent=80 -XX:InitiatingHeapOccupancyPercent=10 -XX:G1MixedGCLiveThresholdPercent=50 -XX:+AggressiveOpts -jar spigot-1.10.2.jar
После появления функции авторестарта на сайте (или случайно так совпало?) у меня опять пошло что-то бесконтрольное.
До того, рестарт эффективно высвобождал память (становилось занято в начале ~1Гб).
Теперь же, даже изменив параметры запуска в файле start.sh - рестарт сразу забирает 3Гб из четырёх.
Никаких кардинальных изменений в моих плагинах небыло, только стало больше построек в мирах.
Команда worldguard report выдала отчет по параметрам запуска:
Java: Oracle Corporation 1.8.0_121 (http://java.oracle.com/)
Operating System: Linux 4.8.0-52-generic (amd64)
Available Processors: 12
Free Memory: 2374 MB
Max Memory: 4000 MB
Total Memory: 2924 MB
System Load Average: 1.51
Java Uptime: 119 minutes
Startup:
 Input Arguments:
 -XX:MaxPermSize=128M
 -Xmx4000M
 -Xms128M
 -Xmn380m
 -XX:+AlwaysPreTouch
 -XX:+DisableExplicitGC
 -XX:+UseG1GC
 -XX:+UnlockExperimentalVMOptions
 -XX:MaxGCPauseMillis=45
 -XX:TargetSurvivorRatio=90
 -XX:G1NewSizePercent=50
 -XX:G1MaxNewSizePercent=80
 -XX:InitiatingHeapOccupancyPercent=10
 -XX:G1MixedGCLiveThresholdPercent=50
 -XX:+AggressiveOpts

Из чего я делаю вывод, что Zorotex проигнорировал мои настройки запуска в start.sh , либо выдаёт этот отчёт с другого места (не моего сервера).
Что мне теперь с этим делать?
/memory

[Инфо]: Размер оперативной памяти для вашего сервера: 4,000 MB.
[Инфо]: Размер оперативной памяти требуемый сервером: 2,924 MB.
[Инфо]: Размер оперативной памяти которая освободилась: 2,124 MB.
/asw serverstatus
 [Инфо]: Cpu usage: 0.79%
 [Инфо]: Memory usage: 14.00% (512/4000 MB)
На страничке с графиками:
Оперативная память: 3553Mb из 4000Mb

Есть что по-существу объяснить?
  • NoName
    4 июля 2017 - 22:15
MersaK MersaK сказал(а):
После появления функции авторестарта на сайте .....

Вы проигнорировали стандартные настройки запуска. Если бы их можно было бесконтрольно переопределять через start.sh, то ограничения по слотам и ресурсам теряли бы смысл. В противном случае любой пользователь мог бы заказать сервер на 15 слотов, прописать в start.sh любые параметры памяти и слотов и использовать ресурсы всего дата-центра за минимальную плату. Очевидно, что это не работает.
Возможен другой вариант: ваш плагин или настройки start.sh порождают множество процессов, а система выдаёт случайный отчёт об одном из них.
Технический аспект: для запуска сервера необходимо, чтобы предыдущий процесс был завершён. На Windows при попытке запустить сервер дважды второй экземпляр остановится с ошибкой «порт уже используется». В Linux серверы обычно запускаются через screen. При нажатии кнопки «Старт» в панели управления создаётся процесс с идентификатором сервера. Он работает до нажатия кнопки «Стоп». В вашем случае процесс не завершён, а вы пытаетесь запустить ещё один сервер с параметрами из start.sh. Новый экземпляр не может стартовать, потому что порт уже занят предыдущим процессом и сессией screen, а завершить их можно только штатно через панель.

Теперь о параметрах в вашем start.sh. Для примера можно взять механику GTA 5: физика и объекты загружаются только в зоне нахождения игрока, что позволяет экономить ресурсы CPU и RAM. Вы указываете -Xms1800M (почти 2 ГБ) сразу при старте. Но в областях, где нет игроков, ресурсы сервера не должны расходоваться нерационально. Обычно достаточно -Xms128M, а дальнейшая загрузка происходит по мере перемещения игроков по карте.
Именно поэтому при запуске сервера вы видите:
[Инфо]: Размер оперативной памяти, требуемый сервером: 2 924 MB.
Сервер при старте сразу загружает карту на объём, заданный в -Xms1800M.
Рекомендуется отключить плагин, который перезапускает сервер, и пересмотреть параметры start.sh. Это должно нормализовать работу.
  • MersaK
    5 июля 2017 - 15:58
Большое спасибо за подробные разъяснения.
Но…
«при незавершённом процессе вы запускаете ещё один сервер с настройками из вашего start.sh»
Плагину AutoSaveWorld (который, собственно, взят из вашего раздела «Модули» для версии 1.10) более двух недель назад указано не выполнять перезагрузку сервера. Там стояла только опция crashrestart: enabled. Предполагалось, что она должна запустить сервер в случае краша из-за какого-нибудь плагина (я давно отладил их, и никаких крашей уже не наблюдалось).
Проверил функционал «Авторестарт сервера», установив перезапуск через 3 часа. Сервер перезапустился. Никакой разницы не вижу.
Сделал, как вы сказали: убрал AutoSaveWorld и start.sh. Перезапустил кнопками на странице управления. Результат ещё хуже.
Оперативная память: 3998 Mb из 4000 Mb.
И тут одно из двух: либо сервер распух из-за ботов-аккаунтов, либо у моего экземпляра сервера ранее запустились какие-то процессы и зависли на вашей стороне.
Я не знаю, что дальше исправлять. Надо всё остановить.