RE:NODE

Максимум игроков на сервере BeamMP: лимиты, MaxCars и лаги

Автор Команда RE:NODE
14 мин чтения


У сервера BeamMP нет собственного жёсткого лимита на число игроков. MaxPlayers принимает любое число от 1 и выше, а серверная программа будет передавать данные столько людям, сколько вы впустите. Упираетесь вы совсем в другое: ПК каждого игрока должен просчитывать каждую машину на сервере, поэтому настоящий потолок - это общее число транспортных средств, то есть MaxPlayers, умноженное на MaxCars, и оценивается он по самому слабому ПК в сессии. Для смешанной публичной аудитории это примерно 10-12 игроков с 1-2 машинами у каждого. Компания друзей с мощными процессорами потянет 20 и больше игроков по одной машине. Когда в одной зоне больше 30 машин, физика в реальном времени почти ни у кого не успевает.

Сам сервер - самая дешёвая часть. Он почти не нагружает CPU и память, а его стоимость растёт вместе с трафиком, который увеличивается пропорционально квадрату числа игроков. В этой статье разбираем, откуда берётся каждый лимит, как прикинуть трафик, что вызывает подтормаживания и телепортацию машин, которые все называют лагами, и как подобрать MaxPlayers и MaxCars под нужный вам сервер. Об установке, ключе авторизации и остальном в ServerConfig.toml читайте в руководстве по серверу BeamMP.

Почему лимит упирается в ПК игроков#

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

BeamMP эту модель не меняет. Каждый клиент сам отвечает за свои машины и параллельно локально просчитывает машины всех остальных игроков, поправляя их по обновлениям положения и состояния, которые приходят через сервер. Физики сервер не видит вообще. Он авторизует игроков, следит за тем, кому принадлежит какая машина, передаёт обновления и запускает Lua-плагины.

состояние машин Aсостояние машин Bсостояние машин CИгрок Aсвои машины + все чужиеИгрок Bсвои машины + все чужиеИгрок Cсвои машины + все чужиеBeamMP serverrelay, no physics
Каждый клиент просчитывает все машины на сервере

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

Из этого следуют два вывода, которые стоит сформулировать прямо:

  • Если игроков вдвое больше, общая работа примерно вчетверо больше. Вдвое больше ПК просчитывают вдвое больше машин. Поэтому сервер, который нормально шёл на 8 игроках, на 16 кажется сломанным, и поэтому снижение MaxCars даёт больше запаса, чем любое другое изменение.
  • Графики производительности сервера обычно выглядят спокойно, пока игроки жалуются. Работа происходит не на CPU сервера. Прежде чем что-то апгрейдить, спросите, какая у жалующихся игроков частота кадров и скорость симуляции.

MaxPlayers и MaxCars: что они делают на самом деле#

Обе настройки находятся в секции [General] файла ServerConfig.toml. Значения по умолчанию, которые записывают актуальные сборки сервера, консервативные:

ServerConfig.toml
[General]MaxPlayers = 8MaxCars = 1Private = true
КлючПо умолчаниюЧто ограничивает
MaxPlayers8Подключённых игроков на весь сервер. Машины не ограничивает
MaxCars1Машин на игрока. Лишние удаляются сразу после появления
PrivatetrueНе лимит, но новый сервер не виден в списке, пока вы не поставите false

MaxCars считается на игрока, а не на сервер. Встроенного лимита машин на весь сервер нет, поэтому худший случай - всегда произведение двух чисел. Сервер с MaxPlayers = 20 и MaxCars = 3 допускает 60 машин, и в загруженный вечер до этого значения будет недалеко.

Есть несколько деталей, на которых часто спотыкаются:

  • Машиной считается всё, что игрок создаёт. Прицепы, объекты и AI-трафик, созданные с клиента, занимают слот MaxCars. В большинстве версий так же считается и режим пешехода (моноцикл), поэтому игрок на сервере с MaxCars = 1, вышедший пройтись пешком, может обнаружить, что его машина удалена. Если сервер строится вокруг прицепов или буксировки, практический минимум - MaxCars = 2.
  • Самый дорогой момент - появление машины. Когда машина создаётся или редактируется, каждый клиент должен её загрузить и собрать, и BeamNG на это время ненадолго замирает. На загруженном сервере игроки, которые перезапускают или меняют машины, создают для всех остальных поток мелких зависаний. В клиенте BeamMP есть очередь в настройках мультиплеера, которая откладывает чужие появления и правки до удобного момента; названия опций менялись между версиями клиента, поэтому ищите в разделе Multiplayer внутриигровых настроек.
  • Лимиты принудительные, а не рекомендательные. Машина сверх MaxCars удаляется, а не отклоняется вежливо, а игрока сверх MaxPlayers не пускают на сервер.

Если нужны правила умнее, чем «N на игрока» - общий лимит на сервер, другие лимиты для персонала, запрет тяжёлых грузовиков после определённого числа игроков, - это делается Lua-плагином, о чём ниже.

Трафик на игрока и как он растёт#

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

Отсюда у исходящего трафика сервера квадратичная форма:

code
outbound ≈ players × (players - 1) × cars per player × per-vehicle streaminbound  ≈ players × cars per player × per-vehicle stream

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

Players x carsПотоков отправляет серверОтносительно 8 x 1
8 x 1561x
10 x 2180около 3x
16 x 1240около 4x
20 x 2760около 14x
30 x 21,740около 31x

Переход с 8 на 16 игроков по одной машине увеличивает исходящий трафик вчетверо, а 30 игроков по две машины стоят в тридцать раз дороже, чем конфигурация по умолчанию. Входящий трафик остаётся линейным и небольшим; как почти во всех играх, заполняется именно исходящий канал. Трафик игрового сервера на игрока разбирает эту асимметрию на примере разных игр и объясняет, почему установившийся трафик редко бывает настоящей проблемой.

Всплески важнее, чем постоянная нагрузка. Каждый байт в Resources/Client отправляется каждому подключающемуся игроку, у которого этого ещё нет. Пакет модов на 2 ГБ при пяти игроках, заходящих в начале мероприятия, - это 10 ГБ за несколько минут, и они конкурируют с потоками машин тех, кто уже едет. Часто именно в этот момент ровная сессия вдруг начинает дёргаться у всех сразу, и число игроков тут ни при чём. Держите пакет компактным, заранее сообщайте его размер и просите постоянных игроков заходить заранее перед организованным событием.

На собственной Linux-машине быстрее всего увидеть реальные цифры, понаблюдав за портом во время сессии:

bash
$ sudo iftop -i eth0 -f "port 30814"$ vnstat -l -i eth0

iftop показывает трафик по каждому соединению в реальном времени, так что видно и то, какой игрок скачивает пакет модов. vnstat -l выводит нарастающий итог по интерфейсу. Запишите значения в загруженный момент при известном числе игроков и машин, разделите - и у вас будет собственное значение на одну машину для подстановки в формулу.

Для домашнего хоста стена - это исходящая скорость. Домашней линии с 20-40 Мбит/с на отдачу хватает небольшой группе, но на верхних строках таблицы она быстро заканчивается, особенно пока кто-то качает моды. У канала в дата-центре запас есть для любого реалистичного сервера BeamMP, но безлимит не означает отсутствие ограничений, а публичный сервер, который целый день отдаёт посторонним пакет в несколько гигабайт, - как раз тот трафик, о котором идёт речь.

Таблица подбора: игроки, машины и ресурсы сервера#

Подбирать нужно две разные вещи, и их легко перепутать. Первая - сессия: сколько машин вы просите просчитывать ПК игроков. Вторая - сервер: RAM, CPU и трафик для программы-ретранслятора.

Начнём с сессии. Это рабочие ориентиры для публичного или полупубличного сервера, где вы не контролируете железо игроков:

Тип сервераMaxPlayers x MaxCarsМашин на клиент
Небольшая группа, мощные ПК6-8 x 3До 24
Публичный freeroam, разные ПК10-12 x 2До 24
Загруженный публичный cruise16-20 x 1До 20
Крупное событие, по одной машине25-30 x 1До 30, нужны мощные ПК
Derby или плотные гонки8-12 x 1До 12, все рядом

Плотные гонки и demolition derby заслуживают отдельной строки. Аварии - самое дорогое, что просчитывает BeamNG, столкновения между чужими машинами - место, где чаще всего проявляется desync, а в derby все машины находятся на одной небольшой арене. Derby на двенадцать машин тяжелее, чем круиз на сорок машин, разбросанных по Италии: в круизе большинство машин далеко и едут плавно.

Теперь сервер. Ретранслятор лёгкий, а память в основном занимают сама программа, состояние Lua и буферы для передаваемых модов:

ИгроковRAMvCPU
До 102 GB1
10-20, пакет модов3-4 GB1.5-2
20-40, тяжёлые плагины4-6 GB2

Нагрузка на CPU сервера чаще всего однопоточная. Если она высокая при скромном числе игроков, причина почти всегда в Lua-плагине с быстрым таймером или тяжёлой работой с JSON в обработчике появления машины, а не в числе игроков. Lua-плагины BeamMP и гонки показывают, как замерять время обработчиков через Util.DebugExecutionTime(). Диск - это вес вашего пакета модов плюс немного; общую картину смотрите в статье сколько места нужно игровому серверу.

На RE:NODE тарифы BeamMP идут от 2 GB с одним vCPU до 8 GB с тремя, на NVMe, причём CPU выделяется жёстко, а не в режиме burst. Для BeamMP младших тарифов хватает почти любому серверу, потому что дорогая часть работы происходит на машинах игроков; тариф побольше имеет смысл брать ради места на диске под большой пакет модов или ради плагинов, которые делают реальную работу, а не ради повышения MaxPlayers.

Что вызывает лаги и desync#

Под словом «лаг» на сервере BeamMP скрывается минимум пять разных проблем, и чинятся они по-разному. Чтобы их различить, достаточно минуты и правильных вопросов.

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

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

Столкновения, о которых игроки не согласны. Два игрока сталкиваются, и каждый видит свой результат. Это заложено в архитектуру: владелец машины сам определяет её физику, а другая машина на его экране - предсказание по немного устаревшим данным. При задержке 100 мс между двумя игроками машина на скорости 100 км/ч оказывается почти в трёх метрах от того места, где её видит другой игрок. Контактная езда на BeamMP лучше всего работает у игроков с низким ping до одного сервера, и это главный довод в пользу размещения сервера рядом с игроками. Некоторые серверы именно поэтому отключают столкновения для публичных круизов через плагин или клиентский мод; посмотрите, что предлагает ваша версия.

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

Подтормаживание началось после добавления мода. Некоторые моды машин и карт намного тяжелее стандартного контента или сломаны для текущей версии BeamNG и сыплют ошибками в каждом кадре. Проверьте, убрав мод из Resources/Client и перезапустив сервер. Если виновата карта, платят за это все игроки на протяжении всей сессии.

Ограничение числа машин Lua-плагином#

MaxCars - грубый инструмент. Плагин может задать лимит на весь сервер, а именно это число действительно важно для клиентов. onVehicleSpawn срабатывает до того, как машина принята, а возврат 1 отменяет её появление:

Resources/Server/VehicleCap/main.lua
local SERVER_CAP = 24local function countVehicles()    local total = 0    for id, _ in pairs(MP.GetPlayers() or {}) do        local vehicles = MP.GetPlayerVehicles(id)        if vehicles then            for _ in pairs(vehicles) do total = total + 1 end        end    end    return totalendfunction capSpawn(playerID, vehicleID, data)    if countVehicles() >= SERVER_CAP then        MP.SendChatMessage(playerID, "Server vehicle limit reached. Remove a car first.")        return 1    endendMP.RegisterEvent("onVehicleSpawn", "capSpawn")

С таким плагином можно поставить MaxCars = 3, чтобы у игроков было место для прицепа, и при этом быть уверенным, что сервер никогда не заставит клиент вести больше 24 машин. В том же обработчике можно отказывать конкретным тяжёлым моделям или разрешать персоналу больший лимит, проверяя идентификатор beammp. Сначала проверьте любой плагин на вашей версии сервера - API менялся между крупными релизами, а руководство по Lua-плагинам подробно описывает сигнатуры событий.

Следите, чтобы такие обработчики были дешёвыми. Обработчик, который перебирает несколько десятков машин, ничего не стоит; тот, что при каждом появлении разбирает полный JSON конфигурации каждой машины, в загруженную ночь начинает заметно нагружать CPU сервера.

Как безопасно поднять лимит#

Когда сервер кажется переполненным, важен порядок изменений. Большинство полезных рычагов бесплатны:

  1. Сначала снизьте `MaxCars`. Переход с 2 на 1 вдвое уменьшает нагрузку на клиентов и трафик. Если людям нужны прицепы, добавьте лимит плагином.
  2. Выберите карту побольше для больших компаний. Машины, разнесённые далеко друг от друга, обходятся дешевле, чем машины на одном перекрёстке, и порождают меньше столкновений, о которых можно спорить. Gridmap и небольшие арены подходят для небольших групп.
  3. Сократите пакет модов. Каждый тяжёлый мод машины повышает стоимость одной машины для всех клиентов, а размер пакета определяет, насколько тягостно подключение.
  4. Обозначьте ожидания в описании сервера. Фраза «Рекомендуется: 6-ядерный процессор» в Description или в вашем Discord избавит вас от игроков, которые заходят, работают на половине скорости и винят хост.
  5. Повышайте `MaxPlayers` небольшими шагами. Поднимите с 10 до 14, понаблюдайте за целым вечером, потом решайте. Следите за жалобами игроков на замедление, а не только за показателями самого сервера.
  6. И только потом смотрите на тариф. Если нагрузка на CPU сервера действительно высокая, сначала найдите плагин. Если упираетесь в исходящую скорость дома, поможет хост в дата-центре.

Перезапуск перед большой сессией - это гигиена, а не способ ускорить сервер: он сбрасывает зависшее состояние машин и гарантирует, что все начинают на одной версии сервера. Расписания перезапуска, которые помогают объясняют, когда его планировать. На RE:NODE вкладка Schedules может запускать этот перезапуск, а перед ним - backup, по выражению cron.

Устранение неполадок#

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

У всех одновременно дёргается картинка. Проверьте, не подключался ли кто-то и не скачивал ли пакет модов. Если нет, проверьте исходящий канал сервера, особенно на домашнем подключении.

Машина одного игрока телепортируется на экранах у всех. Дело в соединении этого игрока. Попросите его проверить потерю пакетов до адреса сервера по проводному подключению.

Новые машины исчезают сразу после появления. Игрок достиг MaxCars, возможно, считая прицеп или моноцикл пешехода. Либо плагин вернул 1 из onVehicleSpawn.

CPU сервера на 100% при нескольких игроках. Виноват плагин. Убирайте плагины из Resources/Server по одному или замеряйте время их обработчиков.

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

FAQ#

Какое максимальное число игроков на сервере BeamMP?

Жёсткого максимума в сервере нет; MaxPlayers принимает любое положительное число. Рабочий предел - производительность клиентов: загруженные публичные серверы обычно держат 10-20 игроков, а для очень больших событий нужны по одной машине и игроки с мощными процессорами.

Что повышать: MaxPlayers или MaxCars?

Для публичного сервера - число игроков. Каждая дополнительная машина на игрока добавляет полную машину каждому клиенту за каждого подключённого игрока, так что MaxCars дороже из двух. Держите его на уровне 1-2 и повышайте число слотов для игроков.

Уменьшит ли лаги BeamMP более мощный тариф сервера?

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

Считается ли моноцикл пешехода машиной?

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

Сколько исходящей скорости нужно серверу BeamMP?

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