RE:NODE

Эксплуатация13 мин чтения

Что на самом деле значит tick rate и почему сервер тормозит

TPS, MSPT, пинг и частота кадров - четыре разных числа. Как читать каждое, на какое из них жалуются игроки и что исправляет каждое.

Обновлено

1 прочтений

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

Что такое тик#

Игровой сервер работает в цикле с фиксированным шагом. Он просыпается, читает всё, что пришло от клиентов с прошлого раза, продвигает симуляцию на один шаг, отправляет каждому клиенту то, что изменилось рядом с ним, а затем спит до следующего шага. Один проход - это тик. Частота - сколько таких проходов должно быть в секунду, а бюджет - сколько реального времени на один проход отведено.

code
budget per tick = 1000 ms / target tick rate20 ticks/s  -> 50.0 ms per tick   (Minecraft)50 ticks/s  -> 20.0 ms per tick   (many Unreal servers)64 ticks/s  -> 15.6 ms per tick   (Counter-Strike 2)128 ticks/s ->  7.8 ms per tick   (competitive Source servers)

Если тик укладывается в бюджет, сервер спит, и никто ничего не замечает. Если тик занимает дольше, следующий начинается с опозданием, и каждый последующий наследует этот долг. Что видят игроки, зависит от движка. Minecraft замедляет мир: день становится длиннее, печи плавят медленнее, мобы движутся как в замедленной съёмке, а всё остаётся внутренне согласованным, потому что растягивается вся симуляция. Шутеры обычно сохраняют реальное время и теряют информацию: мир идёт с правильной скоростью, но обновления приходят реже, а регистрация попаданий становится расплывчатой.

Стоит запомнить два следствия. Во-первых, эффект глобальный и равномерный: когда tick rate падает, он падает у всех в один момент на одну величину. Жалоба одного игрока, когда никто больше ничего не замечает, - это никогда не проблема tick rate. Во-вторых, бюджет измеряется реальным временем, поэтому его тратит всё, что блокирует основной поток: пауза сборки мусора, синхронная запись на диск, плагин, выполняющий запрос к базе данных прямо в потоке. Это не нехватка процессора, и более быстрый процессор этого не исправит.

Tick rate по играм#

ИграЦелевая частотаБюджетКак называется
Minecraft (vanilla, Paper)2050 msTPS, время тика - MSPT
Движок Source (TF2, Garry's Mod)66 по умолчанию15 msServer FPS
Counter-Strike 264, с sub-tick временем ввода15.6 msTickrate
Соревновательные серверы Source1287.8 ms128 tick
Factorio6016.7 msUPS
Squad и похожие серверы Unreal5020 msTick rate, показывается в браузере серверов
Valheimне отображается-Зону симулирует её владелец

К некоторым из них нужна сноска. Сервер Counter-Strike 2 работает на 64 тика, но ставит на ввод игрока метку того момента, когда он реально произошёл между тиками, - это и значит «sub-tick»: так исчезает большая часть преимущества, которое давали серверы 128 tick в CS:GO, и поэтому старый спор о tickrate в CS2 значит меньше, чем ожидают пришедшие из предыдущей игры. Игры на Source задают частоту при запуске через -tickrate, и её изменение меняет физику движения, так что сервер на 100 тиков - это не просто более плавный сервер на 66.

Valheim - исключение, и его стоит понять, потому что он объясняет целый класс запутанных жалоб. Сервер хранит мир и ретранслирует состояние, но каждую зону симулирует игрок, первым в неё вошедший. Единого серверного тика, который можно прочитать, нет, а один игрок с плохим соединением заставляет мир дрожать у всех, кто стоит рядом с ним. Это разобрано в руководстве по выделенному серверу Valheim.

Как читать число#

Никогда не ставьте диагноз по описанию игрока. Получите число.

Minecraft, Paper или Spigot. /tps печатает средние за одну, пять и пятнадцать минут, ограниченные значением 20. Это запаздывающий показатель: сервер, у которого один тик подскочил до 300 ms, всё равно покажет почти 20. Лучше число даёт /mspt в Paper, потому что оно показывает реальное время тиков за последние пять секунд, десять секунд и минуту, со средним и худшим случаем.

code
> /msptServer tick times (avg/max) from last 5s, 10s, 1m:◴ 41.2/188.9, 38.7/188.9, 22.4/241.6

Читайте это так: обычно всё нормально, но что-то время от времени съедает почти четверть секунды. Среднее ниже 50 при огромном максимуме - это проблема всплесков: генерируется чанк, идёт сохранение мира, срабатывает плагин по таймеру, - и лечится она профилировщиком, а не планом побольше. В ванильном 1.20.3 и новее появились /tick query, который печатает то же самое, а также /tick freeze, /tick step и /tick sprint для отладки.

Minecraft, любая версия, когда нужна причина. Установите spark. /spark tps показывает tick rate и загрузку процессора по потокам; /spark profiler start некоторое время сэмплирует сервер и выдаёт веб-ссылку, показывающую, какой метод съедает тик. Эта ссылка - разница между догадкой и знанием, а разбор одного профиля строка за строкой есть в статье как читать профиль spark.

Игры на Source. stats в консоли сервера печатает строку с серверным FPS, а это и есть его tick rate, плюс загрузка процессора и трафик. status перечисляет игроков с их пингом. Обе команды консольные, поэтому работают через RCON.

code
> statsCPU    NetIn   NetOut  Uptime  Maps   FPS      Players12.40  0.9     4.7     412     3      66.14    18

Серверы Unreal. Squad печатает свой tick rate в браузере серверов. Другие игры на Unreal показывают серверный FPS в консоли или административных инструментах. Во всех них число, падающее по мере заполнения сервера, - это нормальная и ожидаемая картина, а оценивать нужно то, где оно оказывается на пике.

Всё остальное. Если игра не показывает счётчик тиков, заменой служит график CPU. Игровой поток, упёршийся в свой предел при ровной памяти, - это сервер, у которого кончился бюджет тика, как бы игра это ни называла. Характерные формы описаны в статье как читать график нагрузки сервера.

Пинг - это совсем другое число#

Пинг - это время туда и обратно между одним игроком и сервером. Это свойство пути между двумя машинами - расстояния, маршрута, качества каждого узла, - и сервер практически не влияет на него. Никакие объёмы памяти, процессор или NVMe не изменят пинг игрока.

Диагностика тривиальна: посмотрите на пинг всех сразу. Если один игрок на 180 ms, а остальные на 30, то у этого игрока проблема с сетью, а сервер в порядке. Если у всех пинг подскочил на одну величину в один и тот же момент, что-то изменилось на стороне сети сервера, а это другое и гораздо более редкое дело.

В «пинге» скрыты три числа, и они не взаимозаменяемы:

  • Задержка - среднее время туда и обратно. Высокая, но стабильная задержка играбельна; игры рассчитаны на то, чтобы скрывать постоянную задержку.
  • Джиттер - её разброс. 60 ms задержки, которая гуляет между 40 и 200, ощущается гораздо хуже ровных 120, потому что предсказание клиента каждый кадр ошибается на разную величину.
  • Потеря пакетов - обновления, которые так и не пришли. Даже 1% заметен как rubber-banding, потому что клиенту приходится угадывать, а потом исправляться.

Как отличить их друг от друга, объяснено в статье задержка, джиттер и потеря пакетов, а как найти виновный узел - в чтении traceroute и mtr. Короткая версия: запустите MTR от жалующегося игрока до сервера на несколько минут и найдите первый узел, где начинается потеря и не прекращается.

Интерполяция, предсказание и lag compensation#

Понимание этих трёх вещей объясняет большинство споров о tick rate и то, почему более высокое число даёт меньше, чем кажется.

команда с меткой времениподтвердить или исправитьИгрок кликаетt = 0 msКлиент предсказываетсразу рисует попаданиеСетьпуть в одну сторонуТик сервераследующий шаг по графикуLag compensationоткат к виду игрокаСнимок наружувсем клиентам
Один выстрел от клика до подтверждения

Интерполяция. Ваш клиент рисует других игроков не там, где их поставил последний снимок. Он рисует их чуть в прошлом, между двумя последними полученными снимками, чтобы движение было плавным, а не телепортировалось при каждом обновлении. Цена - фиксированная задержка, обычно в два тика. При 64 тиках и двух тиках интерполяции это около 31 ms встроенной задержки; при 128 тиках - около 16 ms. Эти 15 ms разницы и есть реальный приз в споре 64 против 128, и он заметно меньше, чем внушает маркетинг.

Предсказание. Ваше собственное движение симулируется локально в тот момент, когда вы нажали клавишу, и исправляется, если сервер не согласен. Поэтому ваш персонаж отзывчив при пинге 120 ms, хотя все остальные выглядят с задержкой.

Lag compensation. Когда ваш выстрел приходит, сервер откатывает остальных игроков туда, где они были в момент выстрела, исходя из вашей задержки, и судит о попадании по этому состоянию. Поэтому вас убивают за укрытием: на экране стрелявшего вы за укрытием ещё не были. Это не баг и не tick rate, а сознательный компромисс, благодаря которому шутеры играбельны на расстоянии в целый континент.

В старых играх на Source вы могли настраивать свою сторону через rate, cl_updaterate, cl_cmdrate, cl_interp и cl_interp_ratio, в пределах серверных sv_minrate, sv_maxrate, sv_minupdaterate и sv_maxupdaterate. В Counter-Strike 2 большую часть этого убрали в пользу автоматических частот и sub-tick времени, так что советы из руководства по CS:GO 2016 года не применимы. Проверьте, что ваша конкретная игра ещё принимает, прежде чем вставлять конфиг из интернета.

Частота кадров - это клиент, и это не ваша проблема#

Частота кадров - это собственная машина игрока, рисующая мир. К серверу она не имеет отношения, и это стоит выяснить до того, как кто-нибудь повысит тариф ради её исправления. Игрок, который жалуется на подтормаживание, пока консоль сервера спокойна, время тика в бюджете, а всем остальным нормально, описывает свою видеокарту.

Тут есть два осложнения. Во-первых, изнутри игроки действительно не отличают клиент на 25 fps от сервера на 15 TPS: и то и другое выглядит как рывки мира. Во-вторых, низкая частота кадров слегка влияет на сервер, потому что клиент, рисующий 20 кадров в секунду, реже отправляет ввод, и его действия приходят с опозданием. Эффект небольшой и вредит только этому игроку.

Проверка, которая всё решает за десять секунд: спросите, высокий ли счётчик кадров в его собственной игре, когда всё идёт не так. Если кадров 144, а мир дёргается, виноват сервер. Если кадров 22 - нет.

Как отличить эти четыре#

Что вы видитеКакое числоКуда смотреть
Все тормозят одновременно и равномерноTick rateВремя тика, график CPU, профилировщик
Один игрок тормозит, остальные нормальноПингМаршрут этого игрока, MTR
Подтормаживание при спокойной консолиЧастота кадров клиентаЕго машина
Короткое замирание по регулярному циклуДискИнтервал сохранения, расписание бэкапов
Нормально при 10 игроках, плохо при 40Tick rate, зависящий от нагрузкиЧисло сущностей и чанков
Всю неделю нормально, каждый вечер плохоTick rate или общий CPUГрафик в часы пик

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

Что на самом деле повышает tick rate#

В порядке того, насколько они обычно помогают и сколько обычно стоят:

  1. Делайте меньше работы за тик. Меньше сущностей, меньше дальность прорисовки или симуляции, меньше скриптов на коротких таймерах, меньше загруженных чанков или зон. Это бесплатно и почти всегда самый большой выигрыш. Для Minecraft это настройки оптимизации Paper; для других игр - эквивалентные параметры их конфигов.
  2. Найдите одну дорогую вещь. У большинства лагов одна причина: один плагин, одна ферма мобов, один чанк с десятью тысячами предметов. Профилировщик находит её за минуты. Замена сервера - нет.
  3. Более быстрый одноядерный процессор. Почти каждый игровой сервер симулирует в одном потоке, поэтому тактовая частота задаёт потолок. Больше ядер помогает всему вокруг симуляции и не поднимает этот потолок.
  4. Уберите блокирующую работу. Синхронная запись на диск, запрос к базе данных в основном потоке, пауза сборки мусора. Они проявляются огромным максимальным временем тика при нормальном среднем и лечатся конфигурацией, а не железом.
  5. Меньше игроков. Непопулярно, эффективно и честно. Сервер на 60 слотов, который держит частоту, лучше, чем на 100, который не держит, - см. сколько игроков помещается на сервере.

Что не помогает: больше памяти на сервере с ровным графиком памяти, NVMe на сервере, упирающемся в процессор, и другой дата-центр для проблемы, которая не в сети. Тридцатисекундная версия этой сортировки - CPU или RAM, а разбор именно для Minecraft - почему падает TPS и что делать.

Цена высокого tick rate в трафике#

Tick rate - это ещё и настройка трафика, о чём говорят редко. Сервер отправляет каждому игроку снимок на каждый тик, так что удвоение частоты примерно удваивает исходящий трафик.

code
per-player downstream ~= snapshot size x tick rate200 bytes x 64 ticks/s  = 12.8 kB/s   per player200 bytes x 128 ticks/s = 25.6 kB/s   per player32 players at 128 tick  ~= 820 kB/s out, sustained

Эти цифры иллюстративные - реальный размер снимка зависит от числа видимых сущностей, - но по форме всё верно, и это объясняет, почему серверу на 128 тиков с большим числом игроков нужен канал, на который можно положиться, а не общий. Это также объясняет, почему повышение tick rate на сервере, который уже подошёл к пределу процессора, делает всё хуже: вы удвоили и вычислительную, и сетевую стоимость именно того, что и так опаздывало.

FAQ#

Плохо ли 20 TPS?

Нет. 20 - это максимум Minecraft и его нормальное состояние. TPS ограничен целевой частотой, так что 20.0 означает здоровье, а всё ниже - отставание. Эквивалентный здоровый показатель в шутере на 64 тика - 64, а не 20: числа в разных играх несопоставимы.

Снижает ли более высокий tick rate мой пинг?

Нет. Tick rate меняет, как часто сервер вас обновляет; пинг - это то, сколько обновление идёт до вас. Сервер на 128 тиков на другом континенте будет ощущаться хуже, чем сервер на 64 тика поблизости. Единственное, что убирает tick rate, - несколько миллисекунд задержки интерполяции.

Почему меня убивают за укрытием?

Lag compensation. Сервер откатил вид стрелявшего к моменту выстрела, а в тот момент вы были видны на его экране. Это сделано намеренно: альтернатива - шутеры, где приходится вести цель с упреждением на собственную задержку. Более высокие tick rate слегка сужают это окно, но никогда не закрывают его.

Мой сервер показывает 20 TPS, а игроки жалуются на лаги. Что делать?

Смотрите на максимальное время тика, а не на среднее. /mspt в Paper или профилировщик на чём-то другом. Среднее в 20 ms при пике в 400 ms - это сервер, который замирает ненадолго, но часто, а TPS, усреднённый за минуту, это полностью скрывает.

Исправит ли низкий TPS повышение тарифа?

Только если ограничивает вас именно доля процессора по тарифу и только когда на новом тарифе ядра быстрее, а не просто их больше. Сначала сверьте график CPU с лимитом. Если график до лимита не доходит, что-то в основном потоке блокируется, и больше процессора ничего не даст.

Влияет ли tick rate на то, сколько RAM мне нужно?

Почти нет. Память определяется тем, сколько мира и сколько сущностей загружено, а не тем, как часто их обновляют. Tick rate - это настройка процессора и трафика.


Комментарии

Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.

0/2000