Page cover

🪛Оптимизация сервера

В данной статье вы сможете прочесть о том, как оптимизировать ваш сервер.

Цикл игровых тактов

Практически каждая игра, включая Minecraft, работает на основе большого программного цикла. Работа сервера разбита на "такты".

Каждый раз, когда проходит игровой такт - выполняются различные события, обрабатывающиеся процессором:

  • Чтение пакетов, исходящих от игроков (Например движение, установка/разрушение блоков, атакование других сущностей);

  • Обновление позиции игроков и других сущностей;

  • Отправка входящих пакетов всем игрокам, связанных с происходящим на сервере (Изменения блоков, движение сущностей и действия, например взаимодействие с жителями или блоками их работ);

  • Спавн сущностей (Мобов) , просчёт их ИИ и тому подобное;

  • Обработка действий красной пыли и других механизмов.

И многие другие вещи...

Такты в Minecraft

Сервер игры Minecraft старается работать на 20-ти тактах в секунду. Или, другими словами, один такт каждые 50 миллисекунд.

Когда сервер работает нормально

Когда сервер работает стабильно - время на выполнение одного такта должно быть меньше или равно 50 миллисекундам.

Если время, занявшее выполнение одного такта, менее 50 миллисекунд - сервер будет "спать" оставшееся время до тех пор, пока не придёт время выполнять следующий такт.

Сервер тратит 15 миллисекунд на выполнение такта сервер "спит" (Ничего не делает) 35 миллисекунд перед тем, как выполнять следующий такт.

Как вы можете видеть - выполнение каждого такта в этом примере заняло менее 50 миллисекунд, но время между ними было заполнено сном, чтобы все 20 тактов уложились ровно в 1 секунду.

Если бы сервер не заполнял время, оставшееся до выполнения следующего такта, сном (Пустотой) - игра бы чувствовалась быстрее и нестабильнее.

Когда сервер не справляется

Если выполнение одного такта занимает более 50-ти миллисекунд - выполнение следующего такта откладывается, так как выполнение тактов не может происходить параллельно. Когда это происходит - игровой процесс становится хуже, вещи становятся менее отзывчивыми и всё начинает "лагать".

Как вы можете видеть - когда определённые такты требуют больше времени на выполнение - всё начинает "сдвигаться вправо", выполняется меньше игровых тактов в тот же промежуток времени.

Отсюда вы можете видеть, откуда берутся показатели TPS (Тактов в секунду) и MSPT (Миллисекунд за такт).

В реалиях показанного выше примера:

  • TPS будет отображён как 17, поскольку всего 17 тиков было обработано за секунду;

  • Минимальный MSPT будет ~20 миллисекунд, в то время как максимальный - ~80 миллисекунд, что больше 50-ти.

Такты в плагине Spark

Плагин Spark - замечательный инструмент для отладки сервера. Установить его вы можете на его официальном сайте: https://spark.lucko.me/download

Плагин также есть в виде мода. Там же, на сайте, можно его скачать.

В профилировщике Spark вы можете увидеть цикл тактов, обычно он находится в самом верху.

В примере выше, вы можете увидеть что waitForNextTick(), - ожидание следующего такта, занимает около 81% активности ЦПУ в потоке сервера. Это хорошо - в среднем это говорит о том, что около 80% тактов обрабатываются менее, чем за 50 миллисекунд.

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

Подытоживая:

  • Больший процент сна - это хорошо;

  • Если сервер имеет менее чем 20% сна - значит сервер работает очень интенсивно и может подвисать на некоторых тактах;

  • Если у сервера менее 5% сна - значит ваш сервер, вероятно, не справляется с обработкой тактов.

Важно отметить: Все значения являются усреднёнными.

Это говорит о том, что, гипотетически, вашему серверу может требоваться всего 20 миллисекунд на обработку большинства тактов, но затем, внезапно, ему потребуется 300 миллисекунд на обработку некоторых тактов.

Обычно это происходит при "lag spike'ах", что не говорит об общей плохой производительности сервера.

Last updated