Когда кто-то говорит, что сервер лагает, он имеет в виду одну из четырёх несвязанных вещей, и три из них к серверу не относятся. Tick rate - это то, как часто сервер продвигает мир вперёд. Пинг - сколько идёт до него пакет. Частота кадров - это видеокарта самого игрока. Периодическое подвисание - обычно диск. У каждого своё число, у каждого своё исправление, и вся работа при расследовании лагов состоит в том, чтобы решить, на какое число смотреть, до того как вы потратите деньги. В этой статье - как читать все четыре, с реальными командами для разных игр.
Что такое тик#
Игровой сервер работает в цикле с фиксированным шагом. Он просыпается, читает всё, что пришло от клиентов с прошлого раза, продвигает симуляцию на один шаг, отправляет каждому клиенту то, что изменилось рядом с ним, а затем спит до следующего шага. Один проход - это тик. Частота - сколько таких проходов должно быть в секунду, а бюджет - сколько реального времени на один проход отведено.
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) | 20 | 50 ms | TPS, время тика - MSPT |
| Движок Source (TF2, Garry's Mod) | 66 по умолчанию | 15 ms | Server FPS |
| Counter-Strike 2 | 64, с sub-tick временем ввода | 15.6 ms | Tickrate |
| Соревновательные серверы Source | 128 | 7.8 ms | 128 tick |
| Factorio | 60 | 16.7 ms | UPS |
| Squad и похожие серверы Unreal | 50 | 20 ms | Tick 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, потому что оно показывает реальное время тиков за последние пять секунд, десять секунд и минуту, со средним и худшим случаем.
> /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.
> 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 и то, почему более высокое число даёт меньше, чем кажется.
Интерполяция. Ваш клиент рисует других игроков не там, где их поставил последний снимок. Он рисует их чуть в прошлом, между двумя последними полученными снимками, чтобы движение было плавным, а не телепортировалось при каждом обновлении. Цена - фиксированная задержка, обычно в два тика. При 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 игроках, плохо при 40 | Tick rate, зависящий от нагрузки | Число сущностей и чанков |
| Всю неделю нормально, каждый вечер плохо | Tick rate или общий CPU | График в часы пик |
Регулярное замирание заслуживает отдельного упоминания, потому что его постоянно диагностируют неверно. Большинство игр пишут мир на диск по таймеру, и на большом мире эта запись может блокировать основной поток на секунду и дольше. Это выглядит как проблема тика, а на деле это проблема хранилища. В статье что на самом деле меняет NVMe описано, каким операциям это помогает, а каким нет.
Что на самом деле повышает tick rate#
В порядке того, насколько они обычно помогают и сколько обычно стоят:
- Делайте меньше работы за тик. Меньше сущностей, меньше дальность прорисовки или симуляции, меньше скриптов на коротких таймерах, меньше загруженных чанков или зон. Это бесплатно и почти всегда самый большой выигрыш. Для Minecraft это настройки оптимизации Paper; для других игр - эквивалентные параметры их конфигов.
- Найдите одну дорогую вещь. У большинства лагов одна причина: один плагин, одна ферма мобов, один чанк с десятью тысячами предметов. Профилировщик находит её за минуты. Замена сервера - нет.
- Более быстрый одноядерный процессор. Почти каждый игровой сервер симулирует в одном потоке, поэтому тактовая частота задаёт потолок. Больше ядер помогает всему вокруг симуляции и не поднимает этот потолок.
- Уберите блокирующую работу. Синхронная запись на диск, запрос к базе данных в основном потоке, пауза сборки мусора. Они проявляются огромным максимальным временем тика при нормальном среднем и лечатся конфигурацией, а не железом.
- Меньше игроков. Непопулярно, эффективно и честно. Сервер на 60 слотов, который держит частоту, лучше, чем на 100, который не держит, - см. сколько игроков помещается на сервере.
Что не помогает: больше памяти на сервере с ровным графиком памяти, NVMe на сервере, упирающемся в процессор, и другой дата-центр для проблемы, которая не в сети. Тридцатисекундная версия этой сортировки - CPU или RAM, а разбор именно для Minecraft - почему падает TPS и что делать.
Цена высокого tick rate в трафике#
Tick rate - это ещё и настройка трафика, о чём говорят редко. Сервер отправляет каждому игроку снимок на каждый тик, так что удвоение частоты примерно удваивает исходящий трафик.
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. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.