RE:NODE

Ресурсы13 мин чтения

Сколько игроков вмещает сервер: по играм

Число слотов - это просто значение в конфиге. Реальный предел задают память, бюджет тика и трафик - плюс таблица реалистичного числа игроков для 20 игр.

Обновлено

3 прочтений

Слоты - это число в файле конфига. Запись max-players=100 ничего не стоит и ничего не обещает. Реальный предел задаёт то, что кончится первым из четырёх ресурсов - память, бюджет тика, трафик или диск, - и что именно, зависит от игры и от того, чем заняты игроки. Тариф, заявленный как рассчитанный на сорок игроков, рассчитан на сорок игроков, делающих что-то конкретное, и это «что-то» почти никогда не оговаривается. В этой статье - как определить своё число, таблица реалистичных значений по играм и способ проверить его на практике, а не верить чьей-либо таблице, включая эту.

Слоты - это число в конфиге#

Каждая игра предоставляет максимальное число игроков, и его обеспечивает игра, а не железо. max-players в server.properties, MaxPlayers в Server.cfg Squad, sv_maxclients во FiveM, maxplayers в serverconfig.txt Terraria. Поставьте больше, и сервер примет столько подключений, но симулировать их он от этого не станет.

Что происходит, когда вы превышаете возможности железа, зависит от того, какой ресурс закончился, и отказывают они совершенно по-разному:

  • Память кончается резко. Процесс убивают, или JVM начинает тратить на сборку мусора больше времени, чем на игру. Плавной деградации нет. На RE:NODE при достижении лимита памяти контейнер останавливается и перезапускается начисто, а не сбрасывает данные на диск: восстановление быстрее, но несохранённое состояние теряется - поэтому интервал сохранения важнее, чем принято думать.
  • Бюджет тика кончается постепенно. Мир замедляется, или обновления приходят реже, ровно для всех. Ничего не падает. Просто становится хуже так, что никто не может указать пальцем.
  • Трафик кончается выборочно. Первыми потери замечают игроки, дальше всех от сервера или на худших маршрутах.
  • Диск кончается периодически. Сервер замирает на секунду при каждом сохранении, и замирание удлиняется по мере роста мира.

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

Что кончается первым#

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

Бюджет тика - это 50 мс, 20 мс или 15,6 мс, которые есть у сервера на шаг. Каждый игрок добавляет работу: его движение нужно симулировать, его окружение поддерживать в тике, снимок состояния собрать и отправить. Это предел для большинства шутеров и для любого сервера Minecraft с активными игроками, и его измеряют, а не угадывают - как прочитать его в каждой игре, см. в статье что на самом деле означает tick rate.

Трафик - это размер снимка, умноженный на частоту тиков и на число игроков, в обе стороны. Он редко становится определяющим ограничением на современном канале, но кусает шутеры с высоким tick rate и большим числом игроков и любую игру, которая отправляет данные мира при подключении. Что на самом деле значит «безлимитный», разобрано в статье трафик и fair use.

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

Реалистичное число игроков по играм#

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

ИграПредел и значение по умолчаниюКомфортноЧто кончается первым
Minecraft (Paper)Предела движка нет, max-players=2020-60Бюджет тика
Valheim10, зашито в коде10CPU, симуляция зон
Palworld3216-32Память
Project ZomboidНастраивается, обычно 3216-32Память, затем CPU
7 Days to DieServerMaxPlayerCount, по умолчанию 88-16Память
TerrariaМаксимум 255, maxplayers=88-16CPU
FactorioПредела нет10-30UPS
FiveM32 без OneSync, гораздо больше с ним32-64CPU и скрипты
Counter-Strike 210 в соревновательном, больше с переопределением10-24CPU
Counter-Strike 1.63220-32Практически ничего
Team Fortress 232 у движка, 24 стандартно24CPU
Garry's Mod128, обычно -maxplayers 1616-48Lua в основном потоке
Don't Starve Togethermax_players, по умолчанию 66-16CPU
The Forest, Sons of the Forest88Память
SatisfactoryПо умолчанию 4, настраивается4-8Память
Killing Floor 266CPU
UnturnedПо умолчанию 2416-24Память
BeamMPMaxPlayers, по умолчанию 108-16CPU, физика
Euro Truck Simulator 2 Convoy88Ничего
Squad100, лицензионный диапазон 80-10050-80CPU

Из этой таблицы стоит выделить три закономерности.

Выживание и строительство упираются в память. Palworld, Project Zomboid, 7 Days to Die, игры серии Forest: каждый игрок исследует мир, а исследование загружает и удерживает мир. Вы покупаете именно память, и число растёт неделями после запуска, даже если число игроков не меняется. Разобранный пример - память сервера Palworld.

Шутеры упираются в CPU. Counter-Strike, Team Fortress 2, Squad и всё на Unreal крутят быстрый тик над небольшой статичной картой. Мир ничего не стоит держать и стоит очень много обновлять. Память почти не важна выше небольшого порога, а вся игра - в тактовой частоте; как это выглядит на 100 слотах, см. в статье хостинг сервера Squad.

Minecraft - и то, и другое, в соотношении, которое задаёте вы. view-distance и simulation-distance - это регулятор, который превращает давление на CPU в давление на память и обратно, поэтому в статье сколько RAM нужно серверу Minecraft приходится говорить о настройках, а не только о числе гигабайт.

Память на игрока непостоянна#

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

Minecraft делает арифметику наглядной. Игрок удерживает вокруг себя квадрат загруженных чанков со стороной 2 x view-distance + 1:

code
view-distance=10  ->  21 x 21  =  441 chunks per playerview-distance=8   ->  17 x 17  =  289 chunks per playerview-distance=6   ->  13 x 13  =  169 chunks per playerview-distance=4   ->   9 x  9  =   81 chunks per player

Десять игроков, стоящих в одном городе, делят почти все эти чанки: сервер может держать в сумме 600 чанков. Те же десять игроков, разбросанные по карте в 10 000 блоков, не делят ничего, и сервер держит 4410. То же число игроков, в семь раз больше загруженного мира, и рассчитывать нужно на второй случай, потому что именно так происходит на любом сервере, где люди по-настоящему играют.

Снижение view-distance с 10 до 6 убирает 62% чанков, которые держит загруженными каждый игрок. Одно это изменение обычно помогает испытывающему трудности серверу больше, чем удвоение памяти, а игрокам это стоит лишь части обзора, на которую они в основном и не смотрели. В Minecraft 1.18 и позже simulation-distance отделён и управляет тем, как далеко на самом деле тикают мобы, посевы и редстоун, - поставьте его меньше, чем view-distance, и вы сохраните обзор, сократив работу. Подробности есть в руководстве по оптимизации Paper.

Тот же принцип без аккуратной арифметики действует в каждой игре с открытым миром. Сосредоточенные игроки дёшевы. Разбросанные умножают загруженную площадь. А игроки-строители дороги навсегда, потому что построенное ими остаётся загруженным по соседству вечно, независимо от того, онлайн они или нет.

Бюджет тика на игрока#

Стоимость тика на игрока тоже не линейна, причём хуже, чем линейна, по двум причинам.

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

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

code
tick cost ~= base world + (players x their own surroundings)                        + (players in view of each other, squared)                        + everything anyone has ever built

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

Трафик и когда он действительно предел#

Исходящий трафик - это примерно размер снимка, умноженный на частоту тиков и на число игроков, и это единственный ресурс, где арифметика проста:

code
32 players x 64 ticks/s x 200 bytes  ~=  410 kB/s out, sustained64 players x 20 ticks/s x 500 bytes  ~=  640 kB/s out, sustained

На любом приличном соединении это небольшие числа, поэтому трафик редко становится ограничением. Где он всё-таки кусает:

  • Всплески при входе. Игры, отправляющие данные мира при подключении - чанки Minecraft, весь сейв Factorio, загрузка модов, - резко всплескивают, когда после перезапуска заходит сразу несколько человек. Перезапуск в час пик - это событие для трафика.
  • Голос. Встроенный проксимити-чат в играх на выживание и милсимах может превышать сам игровой трафик.
  • Высокий тик при большом числе слотов. 128 тиков и 32 игрока - это действительно загруженный канал.

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

Жёсткие пределы, которые не поднять#

Некоторые числа вообще не относятся к решениям о ресурсах. Valheim ограничен десятью игроками в коде; покупка памяти этого не меняет, а моды, поднимающие предел, поднимают ограничение, вокруг которого игру балансировали. The Forest и Sons of the Forest - восемь. Euro Truck Simulator 2 Convoy - восемь. Стандартные режимы Killing Floor 2 - шесть. У Satisfactory низкое значение по умолчанию, которое настраивается, но никогда не подбиралось под толпу.

Когда у игры жёсткий предел, вопрос о ресурсах ставится совсем иначе: вы спрашиваете не сколько игроков поместится, а сколько мира и сколько часов строительства породят эти фиксированные игроки. Сервер Valheim на десять игроков, проработавший год, требует больше, чем такой же сервер, запущенный вчера, а руководство по Valheim прямо объясняет почему: террафомирование хранится навсегда для каждого изменённого участка земли.

Как проверить по-настоящему#

Двадцать минут настоящего полного сервера скажут больше, чем любая таблица. Метод:

  1. Снимите базовый уровень. Перезапустите сервер, дайте ему пять минут отстояться без игроков и запишите память, CPU и tick rate. Это ваш пол.
  2. Заполните его теми, кого ожидаете. Не ботами и не стресс-инструментом, а настоящими игроками, делающими то, что они обычно делают. Боты стоят на месте и ничего не стоят, а игроки разбредаются.
  3. Наблюдайте двадцать минут. Память должна вырасти и выровняться. CPU должен вырасти и остаться ниже своего лимита. Tick rate должен держаться.
  4. Затем заставьте их сойтись. Объявите что-нибудь в одном месте и соберите всех там. Это худший случай, и он решает вашу реальную вместимость.
  5. Запишите четыре числа в худший момент. Пиковую память, пиковый CPU, самый низкий tick rate и число игроков в тот момент.

Как выглядит хорошо: память достигает пика около 75-80% лимита, CPU ниже потолка с запасом, tick rate на цели или рядом. Как выглядит полный сервер: память выше 90%, или CPU упирается в лимит, или tick rate заметно ниже цели во время схождения.

Живой график превращает это в работу на пять минут, а не в исследовательский проект. Панель RE:NODE рисует память, CPU и диск на фоне лимитов тарифа, так что пик можно просто посмотреть, а не измерять самому. Что означают формы графиков, разобрано в статье как читать график нагрузки сервера, а что с ними делать - в когда пора повышать тариф.

Очереди, зарезервированные слоты и честная реклама#

Когда вы знаете своё число, остаётся вопрос, что делать, если приходит больше людей.

  • Очередь держит игроков вне сервера, пока не освободится слот. В Squad она встроена через PublicQueueLimit; в большинстве игр нет, и добавление обычно означает прокси или плагин. Очередь превращает плохой опыт в ожидание, а это улучшение.
  • Зарезервированные слоты держат место для админов и участников. Заметьте, что в большинстве реализаций - NumReservedSlots в Squad тому ясный пример - зарезервированные слоты вычитаются из максимума, а не добавляются к нему. Сервер на 80 слотов с 4 зарезервированными - это публичный сервер на 76 слотов.
  • Рекламировать число, которое вы не можете удержать, - худший вариант и самый распространённый. Сервер, заявленный на 100 слотов и плохо играющий выше 60, теряет игроков навсегда; те, кто попробовал при 85, не придут проверять, стало ли лучше.

Неприятная формулировка: вместимость - это свойство вашего железа и вашей конфигурации, и снижать заявленное число бесплатно, а повышать железо - нет. Сервер на 40 слотов, который всегда хорош, каждый раз побеждает сервер на 100 слотов, на котором иногда невозможно играть.

Тарифы на RE:NODE указаны по памяти, диску, доле CPU и выделяемым портам, и переход между ними меняет лимиты уже существующего сервера, а не создаёт новый, - так что тест, показавший, что нужно больше, дёшево реализовать, и тест, показавший, что нужно меньше, тоже.

FAQ#

Можно ли просто поставить максимум игроков 100 и посмотреть, что будет?

Можно, и на небольшом тарифе будет либо убийство по памяти, либо падение tick rate вдвое, когда сервер действительно заполнится. Отказ наступит в худший момент - в тот вечер, когда вы наконец собрали 100 человек. Проверьте на числе, которое можете удержать, а потом повышайте.

Нужен ли каждому игроку фиксированный объём RAM?

Нет, и правило «на игрока столько-то» - самая вводящая в заблуждение цифра в хостинге. Большая часть стоимости игрока - это мир, который он загружает вокруг себя, а он зависит от того, насколько игроки разбросаны. Десять игроков в одном городе могут стоить долю того, что стоят десять разбросанных.

Почему мой сервер тянет 30 игроков в шутере, а в игре на выживание только 10?

Разные пределы. У шутера небольшая статичная карта, и он тратит бюджет на быстрый тик. У игры на выживание огромный динамичный мир, и она тратит память на его удержание. Их рассчитывают по разным ресурсам, и числа несравнимы.

У сервера есть запас памяти, но при полной загрузке он лагает. Что покупать?

Пока ничего. Запас памяти при лагах означает, что предел - бюджет тика, поэтому исправление - делать меньше работы за тик: снизить дальность обзора или симуляции, сократить сущности, убрать скрипты по таймерам - или взять более быстрое ядро, а не больше гигабайт. Разбор - в статье CPU или RAM.

Сколько игроков вместит тариф на 4 ГБ?

Это целиком зависит от игры. 4 ГБ вмещают полный мир Valheim на десять игроков, сервер Minecraft на 20-40 игроков с разумной дальностью обзора, загруженный сервер Counter-Strike с запасом памяти и примерно никого на мир Palworld или 7 Days to Die с модами. Найдите свою игру в таблице выше, а не смотрите на объём памяти.

Поднимет ли больший тариф мой предел игроков?

Только там, где предел был ограничением ресурсов. Если игра зашивает максимум в код, как Valheim на десяти, никакой тариф его не изменит. Там, где предел задаёте вы, больший тариф повышает число, которое вы реально можете удержать, а это не то же самое, что число в конфиге.


Комментарии

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

0/2000