Spigot Timings
Способ найти лаги
В данной теме опишу простой способ поиска проблемных компонентов сервера, которые влияют на производительность на примере Timings (далее тайминг).
Цикличность Minecraft реализована на тиках или такт (англ. tick) — программная единица времени Minecraft’а, на которой основана вся игровая механика. Представляет из себя паузу между повторами цикла обновлений игрового мира. В одной секунде 20 тиков, что означает, что один тик должен произойти через каждые 50 миллисекунд. Игровые сутки длятся 24000 тактов или 20 минут.
За каждый такт немного меняются многие игровые аспекты: движущиеся объекты меняют положение в пространстве, мобы проверяют окружение и обновляют поведение, меняются здоровье и голод игрока под внешним воздействием, и многое другое.
Единственная вещь, независимая от игрового цикла и тактов — прорисовка графики. Прорисовка происходит в отдельном, асинхронном цикле. Это защищает изображение от «тормозов» игровой механики, и наоборот — игровой процесс от медленной прорисовки.(sic)
Во время одного из этих тактов, обрабатываются все события на сервере (игровые такты (о которых выше), таких как загрузка чанков и игроков, взаимодействующих с блоками), и каждый плагин на сервере точно так же собирает информацию и обрабатывает ее в период такта (например, такой плагин как WorldGuard использует PlayerMoveEvent чтобы убедиться, что игрок там, где он не должен был быть исходя из прошлого такта).
Данные по таймингам становится полезными для администраторов серверов. Они позволяют вам контролировать, сколько времени затрачивают плагины на обработку событий на вашем сервере. Это позволяет увидеть, где возникают лаги, которые могу привести к задержкам смены такта, таким образом снизить кол-во тактов менее 20.
Tick per second "TPS" (кол-во тактов в секунду на сервере можно узнать используя команду /lag (при установленном плагине Essentials)
soytzvCT.png
Использование Timing Parser Aikar's
Использование Timing Parser Aikar's позволяет облегчить восприятие собранных таймингов на вашем сервере. Отчеты разделяется на секции для каждого плагина. Первые две секции являются игровыми для Minecraft в (Загрузка/разгрузка чанков и т.д.), остальные принадлежат плагинам (отсортировано по общему времени, работы плагина). (Да, все верно. Установлен и находится ли плагин в работе на данный момент, это разные понятия)
В верхней части отчета, есть несколько колонок, общее данные:
soytzvCU.png
Total: общее время обработки событий.
Sample Time: Время, потраченное на сбор пакета для отчета.
Average Entities: Среднее кол-во активных энити/ общее кол-во энити.
Entities все динамические и движущиеся объекты в мире Minecraft
Average Players: Среднее кол-во подгруженных игроков в сборе данных.
Average TPS: Средний TPS в течении сбора данных.
В заголовках разделов для плагинов, есть два пункта содержащие имя и версию плагина
soytzvCV.png а так же параметры:
Total: Общее время активности плагина
Pct: Процент активности плагина от параметра Sample Time для этого плагина.
Каждая секция имеет несколько столбцов данных:
soytzvCW.png
Pct Total: Процент времени для определенного процесса, затраченного на обработку событий от головного параметра Total, то есть от общего времени активности плагина. .
Расчет: Total / Sample Time
Pct Tick: Процент на один такт (50 ms) при обработки события.
Расчет: Среднее / 50ms
Total: Общее время, затраченное на обработку события.
Avg: Среднее кол-во времени за такт.
Count: Общее кол-во раз, когда данный процесс обрабатывался плагином.
Event: Имя процесса.
Pct Total является хорошим показателем общего уровня такта сервера (TPS). Если определенное событие занимает большое количество времени чтобы обработать себя, это может означать, что он несет ответственность за лаги, потому что для обработки данного процесса затрачивается большее кол-во тактов, соответственно часть из них откидывается.
Колонка Pct Tick является полезной для выявления подвисаний действий у игроков (к примеру задержка отправки сообщений в чат или авторизация на сервере). Например, если ваши игроки жалуются что сервер повисает только при входе в игру, было бы целесообразно изучить процесс PlayerJoinEvent. Большое количество в колонке Pct Tick и низкое число в столбце Count может означать, что плагин тратит много времени на один такт обработки события, и таким образом, вызывая подвисания. В сочетании с Avg, это будет означать, что плагин является окончательной причиной устойчивых, повторяющихся лагов.
Сбор информации в парсер
В данной графе я опишу каким способом можно получить информацию в Aikar's timing parser
Создание данных (только для билдов 1261 - 1537) на новых билдах менять ничего не надо
Это не рекомендуется для последних версий Spigot.
Во-первых, остановить сервер, чтобы предотвратить перезапись изменений, которые будут внесены.
Открыть bukkit.yml текстовом редакторе.
Найти пункт plugin-profiling логическое и изменить его с false по умолчанию на true.
Сохранить данные и запустить сервер
Оставьте ваш сервер работать не менее 1 минуты во время задержки или до всплеска лаггов если вы хотите проанализировать что происходит.
Введите команду "/timings paste" либо в вашем клиенте (если ваша учетная запись имеет соответствующие разрешения) или в консоли.
Вы получите ссылку на парсер:
soytzvCZ.png
Если вы не удовлетворены результатом или хотите сократить время сбора данных во время лагов, запустите "/timings reset" для сброса данных и повторите процесс копирования в парсер.
Рекомендуется формировать отчет через несколько минут после запуска окончательной сборки сервера и наполнением его игроками. Для включения формирования отчета используйте команду /timings on