Сервер Minecraft живёт тиками: 20 тиков в секунду, на каждый — 50 мс. Если тик не укладывается в 50 мс, TPS падает, и лагает у всех сразу. Причину не угадывают, а измеряют: команда /mspt показывает запас, профайлер spark — кто его съел. Чаще всего виноваты сущности, редстоун, генерация новых чанков, слишком большая дальность прорисовки или конкретный плагин.
Сервер, сеть или клиент
Слово «лагает» игроки говорят про три разные проблемы. Лечатся они по-разному, поэтому сначала определите, какая у вас.
| Что видно | Что это | Как проверить |
|---|---|---|
| У всех сразу: мобы замирают, сломанный блок возвращается, сундук открывается с задержкой | Низкий TPS — сервер не успевает | /spark tps, /mspt |
| Одного игрока откидывает назад, у остальных всё нормально | Пинг или потери пакетов у этого игрока | Полоски связи в списке игроков (Tab) |
| Картинка дёргается, но мир живёт нормально | Низкий FPS на компьютере игрока | Счётчик FPS на экране F3, настройки графики |
Сервер не может поднять игроку FPS, а мощный компьютер игрока не спасёт от низкого TPS. Дальше — про лаги самого сервера.
TPS и MSPT: бюджет в 50 мс
TPS (ticks per second) — сколько тиков сервер успевает за секунду, норма — 20. MSPT (milliseconds per tick) — сколько миллисекунд занимает тик. Для 20 TPS MSPT должен быть меньше 50.
MSPT полезнее TPS, потому что показывает запас. TPS не бывает выше 20: при MSPT 15 и 45 он одинаковый, но во втором случае до лагов осталось 5 мс. Следите за MSPT в часы пика — он предупредит раньше, чем игроки начнут жаловаться.
/spark tps
/mspt
/spark health/spark tps показывает TPS и загрузку процессора, /mspt в Paper — среднее, минимальное и максимальное MSPT за последние 5, 10 и 60 секунд, /spark health — общий отчёт: TPS, процессор, память и диск.
Профайлер spark: как найти виновника
Начиная с 1.21 Paper поставляется со встроенным spark, ставить его отдельно не нужно. Профайлер несколько минут записывает, чем занят сервер, и выдаёт ссылку на отчёт.
- 1
Дождитесь лагов
Профиль полезен, только пока проблема происходит. Снимите его в пиковый онлайн или когда игроки жалуются.
- 2
Запустите профайлер
/spark profiler start --timeout 600— он остановится сам через 10 минут и пришлёт ссылку. Для редких фризов добавьте--only-ticks-over 100: в отчёт попадут только тики дольше 100 мс. - 3
Откройте поток сервера
В отчёте выберите «Server thread» — основной поток, который считает тик. Ищите самые толстые ветви: на что уходит больше всего времени.
- 4
Включите вид по источникам
Вид «Sources» строит отдельное дерево для каждого плагина. Так сразу видно, какой плагин сколько времени забирает у тика.
/spark profiler start --timeout 600
/spark profiler start --only-ticks-over 100
/spark profiler open
/spark profiler stopЧастые причины лагов
Сущности и фермы
Фермы мобов, сотни животных в загонах, горы предметов на земле, вагонетки — каждая сущность обрабатывается каждый тик. /paper entity list покажет, каких сущностей больше всего и в каком мире, а /paper chunkinfo — сколько чанков загружено.
Редстоун
Быстрые часы, огромные механизмы и фермы на поршнях нагружают тик даже тогда, когда рядом никого нет, если чанки держатся загруженными. Профиль spark покажет, сколько они стоят на самом деле.
Генерация новых чанков
Построить новый кусок мира — рельеф, пещеры, постройки, свет — одна из самых дорогих операций сервера. Игроки на элитрах, летящие в неизведанные земли, легко роняют TPS для всех. Лечится границей мира и заранее прогруженным миром: см. прогрузка мира.
Дальность прорисовки и симуляции
view-distance задаёт, сколько чанков вокруг игрока сервер отправляет клиенту, simulation-distance — в каком радиусе сущности обновляются. Обе по умолчанию равны 10. Снижение simulation-distance прямо уменьшает работу тика; подробнее — в статье про server.properties.
Плагины
Один плохо написанный плагин способен съесть весь тик. Не удаляйте плагины наугад: вид «Sources» в spark покажет, кто сколько тратит, и вы уберёте или замените виновника, а не половину сборки.
Память и сборка мусора
Если памяти мало, Java часто останавливается на сборку мусора — игроки видят это как регулярные короткие фризы. /spark gc покажет историю сборок, /spark health — заполненность памяти. Сколько выделять и какие флаги ставить — в статье сколько оперативной памяти нужно серверу. Лишняя память, впрочем, тик не ускорит.
Процессор
Игровой тик Paper считается в одном основном потоке, поэтому серверу важнее быстрое ядро, чем много ядер. На дешёвом хостинге с перегруженным процессором MSPT высокий даже на пустом сервере — тогда помогает только смена тарифа или площадки, см. хостинг или VPS.
А что с античитом?
Античит тоже бывает причиной лагов, если делает тяжёлую работу в основном потоке. Проверяется так же: найдите его в виде «Sources» профиля spark и посмотрите, сколько времени он отнимает у «Server thread».
DGuard считает проверки в сетевых потоках, а не в основном, поэтому TPS держится на 20. На живом сервере это 0,03 % одного ядра на основном потоке: 0,38 мс из 10,9 мс тика при 121 игроке. Проверить на своём сервере можно командой /dguard perf — она показывает, сколько времени занимают проверки. Как измерить нагрузку любого античита — в статье сколько ресурсов ест античит.
Частые вопросы
Какой TPS считается нормальным?
20 — это максимум и норма: каждый тик укладывается в 50 мс. Если TPS ниже, сервер не успевает, и лагает у всех игроков сразу.
Почему TPS 20, а игроки жалуются на лаги?
Скорее всего, дело в пинге или FPS у самих игроков, а не в сервере. Ещё бывают редкие фризы: средний TPS держится, но отдельные тики длятся сотни миллисекунд — их видно в /mspt по максимуму и в профиле spark с флагом --only-ticks-over.
Как узнать, какой плагин лагает?
Запустите /spark profiler start --timeout 600 во время лагов, откройте ссылку на отчёт и включите вид «Sources»: он показывает, сколько времени тика забирает каждый плагин.
Поможет ли от лагов больше оперативной памяти?
Только если проблема в памяти: частые сборки мусора и фризы. Лишняя память тик не ускоряет, а сущности, редстоун или медленный процессор она не исправит.
Нужно ли ставить spark на Paper отдельно?
Нет. Начиная с 1.21 Paper поставляется со встроенным spark, команда /spark доступна сразу.
Источники
- spark: команды
- spark: TPS и MSPT
- spark: как читать отчёт
- Paper: профилирование
- Paper 1.21.3: timings отключён
- Minecraft Wiki: тик
- Paper: команды
- Minecraft Wiki: server.properties
- DGuard — лучший античит для современного сервера Minecraft: сравнение проверок с GrimAC, Vulcan, Polar, Intave и Matrix
- DGuard: установка, требования и решение проблем
- DGuard: поддерживаемые версии Paper и Leaf