Частота одного ядра и стабильность тика игрового сервера: почему одних GHz недостаточно
Частота одного ядра и стабильность тика игрового сервера связаны через главный поток. Однопоточная производительность игрового сервера определяет результат, когда именно этот поток задерживает тик. Сравнивать CPU только по GHz нельзя, так как на время тика влияют IPC, кэш, память, серверная сборка и тепловые лимиты.
Почему скорость одного ядра важнее общего числа ядер?
Внутри одного тика работа идёт последовательно: пока главный поток не закончит обновление мира, сервер не начнёт следующий тик. Дополнительные ядра помогают фоновым задачам, но не сокращают эту цепочку. Если сервер упирается именно в главный поток, решает скорость одного ядра под длительной нагрузкой, а не их количество.
Показать последовательную работу одного игрового тика
Тик начинается с набора действий, которые должны сохранить состояние мира. Сервер обновляет сущности и блоки, выполняет запланированные задачи, вызывает код плагинов или модов и обрабатывает часть работы с чанками. Конкретный порядок зависит от серверной реализации и версии, однако следующий тик не может полноценно начаться, пока главный поток не закончит обязательную часть текущего.
Не вся работа проходит на одном ядре. Сетевые потоки принимают пакеты, отдельные пулы могут сжимать данные, загружать или генерировать чанки, а сборщик мусора JVM использует собственные потоки. Результаты фоновой работы всё равно часто нужны главному потоку. Если очередь не готова или требует синхронизации, тик ждёт её завершения.
Скорость прохождения этого участка и называют однопоточной производительностью игрового сервера. Дополнительные ядра освобождают главный поток от части фоновой нагрузки и не дают вспомогательным очередям конкурировать за одно и то же процессорное время. Они полезны, хотя ускорение не становится линейным: восемь ядер не превращают тик длительностью 80 мс в тик на 10 мс.
Отличить паспортный boost от устойчивого effective clock
Гигагерцы в спецификации CPU обычно означают максимальный boost на одном-двух ядрах, а не частоту, которую процессор держит в течение длительного прогона. На это влияют governor, лимиты мощности, температура, число активных ядер и настройки прошивки. В виртуальной машине гостевая ОС иногда видит номинальную частоту или неполные датчики, поэтому показания нужно сопоставлять с телеметрией хоста или условиями тарифа.
Частота CPU и tick rate что-то значат только вместе: записывать их нужно одновременно. Частота без MSPT не показывает, успевает ли сервер закончить тик, а MSPT без сведений о частоте не объясняет просадку из-за троттлинга. Для устойчивого режима нужен прогрев, после которого температура и энергопотребление перестают быстро расти.
На Linux базовую картину дают lscpu, cpupower frequency-info и turbostat. Последний показывает effective clock и температуру лишь на поддерживаемом оборудовании и обычно требует прав администратора. На VPS часть полей может отсутствовать, поэтому сравнение строят по MSPT и данным провайдера.
Почему одинаковые GHz дают разный тик
За один такт разные архитектуры выполняют разный объём работы. На результат влияют IPC, предсказание переходов и задержка кэша. Игровой код часто идёт по цепочкам связанных объектов и обильно ветвится, поэтому промахи кэша и ошибки предсказания случаются часто. Задержка при промахе определяется памятью и кэшем, а не частотой ядра, поэтому два процессора с одинаковыми GHz дают разное время тика.
Рабочая выборка тоже меняет результат. Мир с большим числом сущностей и сложной автоматикой сильнее нагружает кэш и память, чем пустой тестовый мир. Поэтому, например, стабильность тика Minecraft проверяют на копии рабочего мира или на близком воспроизводимом сценарии.
Что лучше предсказывает стабильность тика: частота или IPC?
Ни частота, ни IPC по отдельности не предсказывают стабильность тика. Результат определяет объём работы, который конкретное ядро успевает выполнить в этой сборке при устойчивой частоте. Сравнение по MSPT на одинаковом мире учитывает архитектуру, кэш и память, а выбор по заявленным GHz может поставить процессоры не в том порядке.
Частота против IPC для игрового сервера проверяется только прогоном на конкретной сборке. Синтетический single-core тест сужает список до двух-трёх процессоров, а дальше решает ваш мир и сценарий.
Развести главный поток и задачи, которым помогают дополнительные ядра
Часть нагрузки выполняется вне главного потока. Сеть, сжатие пакетов, отдельные операции с чанками и фоновые задачи плагинов могут использовать другие ядра, если это предусмотрено реализацией. Такие потоки снимают часть работы с главного потока, хотя суммарная нагрузка на процессор всё равно растёт. Доступ к состоянию мира по-прежнему часто требует серверного потока, поэтому вынести в фон можно не каждую задачу.
Главный поток может ждать результат фоновой работы. Например, генерация чанка в фоне помогает только тогда, когда данные готовы к моменту обращения. Если задача задержалась, ожидание увеличивает время тика. Пауза stop-the-world при сборке мусора тоже останавливает прикладные потоки, даже когда другие ядра свободны.
Поэтому высокое MSPT не стоит сразу объяснять скоростью одного ядра. Профиль может показать ожидание блокировки, загрузку чанка, синхронную запись или паузу JVM. В такой ситуации покупка CPU с более высоким boost изменит меньше, чем устранение блокировки, настройка памяти или перенос тяжёлой операции из критического пути.
Найти tick-bound участок через MSPT и spark
Частота тиков показывает, выдерживает ли сервер заданный темп, но скрывает форму задержек. При цели 20 тиков/с бюджет одного тика составляет 50 мс. Среднее MSPT может оставаться ниже этого значения, когда редкие пики уже вызывают рывки. Поэтому вместе с медианой нужны p95 и p99 времени тика за один период нагрузки.
Профилировщик spark связывает длинные тики с кодом главного потока. Чтобы профиль что-то значил, сценарий во время съёма должен быть заранее задан и воспроизводим. У tick-bound сервера значительная доля CPU приходится на обработку мира, сущностей или конкретного плагина. Если основное время уходит на ожидание, GC или дисковый ввод-вывод, причина находится в другом месте.
Результат профилирования придётся сравнивать: с другим процессором, с прошлой версией сборки или с чужим замером. Для этого одного скриншота профиля будет мало. Копию мира обычно хранят отдельно, а рядом с ней записывают её идентификатор, версию ядра сервера, список плагинов или модов, онлайн, view distance, simulation distance и описание действий. Распределение MSPT, профиль главного потока и журнал GC должны охватывать один интервал, так как совпадающие временные метки помогают отличить процессорный предел от паузы сборщика мусора.
Уравнять мир, конфигурацию и тепловой режим
Правильное сравнение начинается с копий одного мира и одной серверной сборки. Настройки JVM, RAM, плагины, моды, view distance и действия игроков остаются одинаковыми. Описание стенда содержит цель, например 20 TPS, и онлайн. Каждый такой кандидат проходит минимум три прогретых повтора, а порядок запусков чередуется.
Как правильно измерять стабильность времени тика?
Запустите одинаковый сценарий на копии мира с одной версией сервера, JVM, плагинов и модов.
После прогрева одновременно запишите MSPT, профиль главного потока, effective clock, температуру и журнал GC.
Повторите прогон минимум трижды и сравните медиану, p95 и p99 при одинаковом онлайне и тепловом режиме.
Отдельно записывают и конфигурацию машины: топологию CPU, SMT, governor, лимиты мощности и маску ядер, доступную процессу. В Linux часть данных собирают так:
lscpu -e=CPU,CORE,SOCKET,NODE,ONLINE > topology.txt
pgrep -a -x java
JAVA_PID=12345 # PID тестируемого сервера
taskset -pc "$JAVA_PID" > affinity.txt
cpupower frequency-info > governor.txt
sudo timeout 180 turbostat --interval 1 > turbo.txt 2>&1
Число 12345 нужно заменить на PID нужного Java-процесса. taskset записывает его маску и не меняет pinning. На VPS turbostat может не показать температуру или лимиты мощности. Профиль spark должен охватывать те же 180 секунд. Итоговая папка хранит конфигурацию, сырые выводы, профиль и CSV с номером повтора, сценарием, медианой, p95, p99 и effective clock. Если датчик недоступен, поле остаётся пустым.
Оценивать хвост тика и запас роста
Из двух процессоров тот, у которого средний MSPT ниже, может иметь худший хвост. Для игрока редкие длинные тики заметнее небольшой разницы в медиане, поэтому tick-time distribution нужно смотреть целиком. Если p99 приближается к 50 мс уже при обычном онлайне, сервер почти не оставляет запаса для генерации чанков, массового события или временного роста числа сущностей.
Каждый сценарий прогоняют отдельно. Idle показывает фоновую нагрузку без игроков: тикающие чанки спавна и работу JVM. Обычный онлайн задаёт рабочую точку, генерация территорий нагружает чанки, а массовое событие резко увеличивает число операций с сущностями и пакетами. У каждого такого режима свой критический путь, поэтому одно усреднённое число по всем прогонам скроет разницу между ними.
Запас считают по самому тяжёлому штатному сценарию, и условное число игроков тут ничего не даёт. Удвоение онлайна не должно удваивать MSPT, потому что результат зависит от распределения игроков, ферм, плагинов и загруженных чанков. На практике сервер считают готовым, если рабочий p99 укладывается в SLO, а тяжёлый тест не вызывает длительного отставания.
Сформулировать критерий покупки без рейтинга по GHz
Процессор сначала выбирают по бенчмарку близкой версии игры и похожей конфигурации. Single-thread performance сужает список, дальше отобранные процессоры проходят тест на копии мира. Результат теста сопоставляют с ценой, ядрами для сети, чанков и garbage collection, доступной памятью и условиями эксплуатации. Более быстрый главный поток не компенсирует медленное хранилище или тесный лимит RAM.
Опубликованный кем-то результат пригоден только вместе с описанием стенда. Оно должно содержать версию сервера, мир, онлайн, JVM, длительность, число повторов и тепловой режим. Один максимум тиков в секунду без распределения MSPT и профиля не отвечает на вопрос о стабильности.
У провайдера стоит узнать модель CPU, правила распределения vCPU, steal time и частоту, которую ядро держит под нагрузкой. На VPS одна только модель не скажет о доле ядра и о конкуренции на хосте. На выделенном сервере результат зависит от governor, охлаждения и лимитов мощности.
Частота одного ядра и стабильность тика игрового сервера сходятся в одном: сколько работы ядро успевает сделать за отведённые тику 50 мс. Подходящий CPU держит меньший хвост MSPT на вашей сборке после прогрева. Строка boost в спецификации об этом не говорит. Для проверки нужны копия мира, одинаковый сценарий, профиль главного потока и несколько повторов.
У этого способа есть граница, и её видно по тому же профилю. Если тик ждёт диск, блокировку или паузу JVM, замена процессора лаг не уберёт. Сначала профиль должен показать, где именно теряется время, и только потом имеет смысл сравнивать архитектуры, частоту и цену. Так нехватка одного ядра отделяется от ошибки в конфигурации.












