RE:NODE

Руководства13 мин чтения

Выделенный сервер Arma 3: установка, server.cfg и моды

Как установить сервер Arma 3, что делает каждый ключ server.cfg, как работают моды и ключи подписей и как headless client возвращает серверу FPS.

Обновлено

1 прочтений

Arma 3 - это однопоточная симуляция с очень длинным списком того, что нужно симулировать, поэтому ощущения от игры определяет тактовая частота, а не число ядер. Шестнадцатиядерная машина с умеренной частотой каждый раз проиграет четырём быстрым ядрам, и никакой объём памяти этого не изменит. Остальная работа - это три файла (server.cfg, basic.cfg и профиль), список модов, который у каждого клиента должен совпадать точно, и пять UDP-портов. В этом руководстве есть всё: установка сервера, каждая настройка, которую стоит менять, то, как проверка подписей решает, кто может зайти, и headless client - самое крупное улучшение производительности из доступных и то, о чём большинство руководств упоминают вскользь.

Что такое сервер Arma 3 и от чего зависят ощущения#

Выделенный сервер - это бесплатное отдельное приложение Arma 3 Dedicated Server, Steam app id 233780, которое скачивается через SteamCMD с анонимным входом. Он работает без графики и звука, загружает миссию и симулирует всё, что в ней есть: объекты рельефа, физику, баллистику и, прежде всего, ИИ.

Производительность сервера измеряется в серверных FPS, которые вы видите командой #monitor 1 в чате, войдя как администратор. Выше 30 - это здорово, 20 - точка, где ИИ начинает принимать плохие решения, а ниже 15 бой превращается в слайд-шоу из юнитов, телепортирующихся в укрытия. Что двигает это число, по порядку:

  1. Количество ИИ. Каждый юнит ИИ обходится в поиск пути, выбор целей и обновление знаний в каждом кадре. Двести ИИ на большой карте вдвое уменьшат серверные FPS ещё до того, как подключится хоть один игрок.
  2. Скрипты. Миссия с тяжёлыми циклами в unscheduled-коде блокирует тот же поток, который использует симуляция. Причина деградации сервера на третьем часу обычно в миссии, а не в хосте.
  3. Объекты и физика. Уничтоженная техника, брошенное оружие и ragdoll накапливаются. Миссия, которая никогда не чистит за собой, становится всё медленнее.
  4. Игроки. Удивительно, но в списке они далеко внизу. Рядом с ИИ игроки дёшевы.

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

Требования и потребление ресурсов#

КонфигурацияRAMCPUДиск
Ваниль, 20-30 игроков, лёгкий ИИ3-4 GB2 быстрых ядра40 GB
CBA плюс ACE, одна миссия, 40 игроков6 GB2-3 быстрых ядра55 GB
Полный набор: CBA, ACE, RHS, CUP Terrains8-12 GB3+ быстрых ядра80-100 GB
Headless client рядом с серверомплюс 2-4 GBплюс 1-2 ядранет
  • Диск - сюрприз. Базовый сервер занимает около 20 GB. CUP Terrains целиком и RHS вместе больше самой игры. Группа, которая посреди кампании добавит пару пакетов карт, может выбрать весь диск тарифа за один вечер, а Arma не умеет красиво падать, когда не может записать.
  • Доля CPU важнее числа ядер. Если хост ограничивает вас долей ядра, Arma будет ощущаться ровно так плохо, как это звучит. В статье CPU или RAM для игровых серверов описано, как понять, чего вам не хватает на самом деле.
  • Полоса пропускания составляет примерно 100-300 KB/s на игрока в загруженной миссии, а при большом числе ИИ в поле зрения - больше. Это немного, но Arma чувствительна к jitter так, как большинство игр не бывают, - в статье задержка, jitter и потеря пакетов разобрано, как отличить их друг от друга.

Установка сервера через SteamCMD#

Самому серверу аккаунт не нужен:

bash
$ steamcmd +force_install_dir /home/arma/server +login anonymous \    +app_update 233780 validate +quit

С модами из Workshop дело обстоит иначе. Они принадлежат игре, app id 107410, и для их скачивания нужен аккаунт Steam, которому принадлежит Arma 3:

bash
$ steamcmd +force_install_dir /home/arma/server +login your_account \    +workshop_download_item 107410 <item-id> +quit

Скачанные материалы попадают в steamapps/workshop/content/107410/<item-id>/. Скопируйте или свяжите каждый из них символической ссылкой с папкой @ModName в корне сервера. На RE:NODE установка Arma 3 по этой причине просит логин Steam на вкладке Setup, а учётные данные сохраняются в том виде, в каком вы их вводите, - используйте запасной аккаунт, которому принадлежит игра, а не основной.

Рабочая строка запуска для Linux выглядит так:

bash
$ ./arma3server_x64 -port=2302 -config=server.cfg -cfg=basic.cfg \    -profiles=./profiles -name=server -world=empty -autoInit \    -bandwidthAlg=2 \    -mod="@CBA_A3;@ace;@RHSAFRF" -serverMod="@ServerTools"
АргументЧто делает
-port=2302Игровой порт. Порт запросов всегда на единицу больше
-config=Файл server.cfg, описанный ниже
-cfg=Сетевой файл basic.cfg
-profiles=Куда записываются профиль сложности и логи
-name=Какой профиль в этой папке использовать
-world=emptyНе загружать карту при старте. Быстрее и легче
-autoInitЗапустить первую миссию, не дожидаясь игрока
-mod=Моды, которые должны загрузить и клиенты
-serverMod=Моды, которые загружает только сервер
-bandwidthAlg=2Новый оценщик пропускной способности. Стоит включить
-filePatchingРазрешить загрузку распакованных файлов. Выключено, пока не нужно

Всегда используйте arma3server_x64, а не 32-битный arma3server. 32-битный файл всё ещё существует, всё ещё запускается и исчерпает адресное пространство в тот момент, когда вы добавите список модов.

server.cfg: важные настройки#

server.cfg - это обычный текстовый файл в корне сервера, в собственном синтаксисе конфигурации Arma: точка с запятой после каждой инструкции, массивы объявляются через [].

server.cfg
hostname = "Longship Crew - ACE";password = "";passwordAdmin = "change-me";serverCommandPassword = "also-change-me";maxPlayers = 40;motd[] = {"Rules in the Discord.", "TFAR on channel 1."};motdInterval = 20;admins[] = {"76561198012345678"};logFile = "server_console.log";verifySignatures = 2;BattlEye = 1;kickDuplicate = 1;allowedFilePatching = 0;persistent = 1;timeStampFormat = "short";disconnectTimeout = 90;steamProtocolMaxDataSize = 1024;voteMissionPlayers = 3;voteThreshold = 0.33;onUnsignedData = "kick (_this select 0)";onHackedData = "kick (_this select 0)";headlessClients[] = {"127.0.0.1"};localClient[] = {"127.0.0.1"};class Missions{    class Liberation    {        template = "Liberation.Altis";        difficulty = "custom";    };};

Те, от которых зависит, заработает ли сервер вообще:

  • `passwordAdmin` - то, что принимает #login. `serverCommandPassword` - отдельный пароль, дающий только команды с #; его выдают доверенному модератору, который не должен иметь возможности выключить сервер. `password` - пароль для входа, обычно пустой.
  • `admins[]` перечисляет SteamID64, которые получают права администратора без ввода пароля. Это безопаснее, чем делиться passwordAdmin с шестью людьми.
  • `verifySignatures = 2` отклоняет любой аддон, не подписанный ключом, который есть у сервера. Именно это не пускает на сервер изменённые PBO, и это же причина номер один для «я не могу зайти» - об этом ниже.
  • `persistent = 1` оставляет миссию работающей, когда уходит последний игрок. Вместе с -autoInit она ещё и запускается при старте. Без этого кампания сбрасывается каждый раз, когда сервер пустеет.
  • `steamProtocolMaxDataSize = 1024` увеличивает размер ответа сервера в Steam, чтобы лаунчер Arma мог показать длинный список модов. Оставьте значение по умолчанию при тридцати модах - и игроки получат неполный список и неудачное подключение.
  • `class Missions` - это ротация. template - имя папки миссии или .pbo, включая суффикс карты, точно так, как оно записано в mpmissions. Опечатка здесь означает, что сервер сидит в лобби, и ничего не выбрано.

difficulty = "custom" ссылается на настройки сложности в вашем файле профиля, который лежит в папке -profiles в подпапке с именем из -name. В этом файле живут вид от третьего лица, прицел, маркеры на карте и навык ИИ. Правьте его при остановленном сервере: сервер перезаписывает его при выходе.

Порты и подключение#

ПортПротоколНазначение
2302UDPИгровой трафик
2303UDPSteam query. С ним общаются браузер и лаунчер
2304UDPSteam master, отчёты сервера
2305UDPЗарезервирован блоком портов
2306UDPBattlEye

Правило такое: Arma занимает с -port по -port + 4, всё это UDP, и сдвиг игрового порта сдвигает весь блок. Поэтому тарифы Arma 3 на RE:NODE идут с пятью выделенными портами, а не с одним: при меньшем числе либо браузер, либо BattlEye тихо перестаёт работать. Если нужно больше, вкладка Network добавляет и убирает порты. В статье порты игрового сервера объяснено, зачем вообще нужен отдельный порт запросов.

Игроки заходят через встроенный браузер серверов, через прямое подключение в Arma 3 Launcher или добавив адрес в избранное Steam. Игрокам стоит советовать именно лаунчер, потому что он умеет загрузить список модов сервера одним щелчком - при условии, что задан steamProtocolMaxDataSize.

Моды, ключи и проверка подписей#

Мод - это папка, название которой начинается с @, с каталогом addons из файлов .pbo и, как правило, каталогом keys с одним .bikey. Два правила покрывают почти все отказы при входе:

  1. Каждый `.bikey` каждого мода из `-mod=` нужно скопировать в корневую папку `keys/` сервера. При verifySignatures = 2 и отсутствующем ключе клиент отклоняется с сообщением о неподписанном аддоне, в котором названо имя файла, а не мода.
  2. Список модов клиента должен совпадать со списком `-mod=` сервера: те же моды, те же версии. Исключение - моды из -serverMod=: они загружаются только на сервере, и клиентам они не нужны и не видны. Серверные инструменты администрирования, логирования и производительности относятся сюда.

Порядок загрузки выбираете вы, и он важен. CBA_A3 грузится раньше всего, что от него зависит; ACE - после CBA; моды карт - раньше модов, которые эти карты правят. Arma сама разрешает большинство зависимостей, но мод, который правит другой и загружается первым, попросту не применяется.

На Linux есть ещё одна ловушка, стоящая людям вечера: регистр символов. Материалы из Workshop приходят с именами папок и файлов в смешанном регистре, и сервер на Linux не найдёт Addons/ACE_Main.pbo, когда конфигурация просит addons/ace_main.pbo. После каждого скачивания приводите всё к нижнему регистру:

bash
$ find ./@ace -depth -name '*[A-Z]*' -execdir bash -c 'mv "$0" "${0,,}"' {} \;

Три привычки делают список модов стабильным. Фиксируйте версии: мод, который автоматически обновился посреди кампании, кампанию заканчивает, а в Workshop у Arma собственной фиксации версий нет, так что фиксация означает «не скачивать заново». Публикуйте список там, откуда игроки могут его скопировать, лучше всего в виде файла пресета лаунчера, а не описывая в сообщении. А когда что-то всё-таки ломается, что делать, когда обновление мода всё сломало - путь короче, чем пересобирать список с нуля.

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

basic.cfg и настройки, которые копируют, не измерив#

В basic.cfg лежит сетевая настройка. Вот документированные значения по умолчанию:

basic.cfg
MaxMsgSend = 128;MaxSizeGuaranteed = 512;MaxSizeNonguaranteed = 256;MinBandwidth = 131072;MaxBandwidth = 2147483647;MinErrorToSend = 0.001;MinErrorToSendNear = 0.01;MaxCustomFileSize = 0;class sockets { maxPacketSize = 1400; };

MaxMsgSend - это число сообщений, которые сервер отправляет за цикл симуляции, и именно оно даёт реальный эффект: увеличение до 256 на нагруженном сервере с хорошим запасом CPU уменьшает desync, а на сервере, которому и так не хватает CPU, ухудшает положение, потому что сообщения приходится собирать в том же потоке, который уже опаздывает. MinErrorToSend и MinErrorToSendNear определяют, насколько объект должен измениться, чтобы отправилось обновление: уменьшение сглаживает движение вдали ценой полосы и CPU.

Честная позиция по этому файлу такова: это самая копируемая и наименее измеренная конфигурация в Arma. Поменяйте одно значение, отыграйте сессию с включённым #monitor 1 и запишите числа. Если разницы в серверных FPS или в сообщаемом desync не видно, верните как было.

Headless client#

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

bash
$ ./arma3server_x64 -client -connect=127.0.0.1 -port=2302 \    -profiles=./hc -name=hc -nosound \    -mod="@CBA_A3;@ace;@RHSAFRF"
UDP 2302входит как клиентпередаёт группыИгрокидо 40 клиентовHeadless clientта же машинаИИ на клиентеего группыСервер Arma 3UDP 2302
Где работает ИИ с headless client

Три условия, которые должны выполняться одновременно:

  • headlessClients[] = {"127.0.0.1"}; и localClient[] = {"127.0.0.1"}; в server.cfg, чтобы сервер выдал ему статус headless и неограниченную пропускную способность.
  • Тот же список модов, что и у сервера, загруженный через -mod=.
  • Миссия, написанная под него. Вот то, что большинство руководств пропускает. Пока миссия явно не передаёт группы ИИ на headless client, его подключение не меняет ничего, кроме числа игроков. Liberation, Antistasi и большинство крупных постоянных миссий его поддерживают; миссия, которую вы написали на прошлой неделе, - нет, пока вы не добавите передачу.

Он также занимает слот и собственную память, так что на небольшом тарифе headless client может ухудшить положение, толкнув всё к пределу памяти. Дайте ему отдельные 2-4 GB, прежде чем считать это победой.

Команды администратора и управление миссией#

Войдите из чата командой #login <passwordAdmin>, затем:

КомандаЧто делает
#login <password>Стать администратором
#logoutОтказаться от прав администратора
#missionsВернуться к экрану выбора миссии
#mission <name>Загрузить конкретную миссию
#restartПерезапустить текущую миссию
#reassignПерезапустить и вернуть всех к выбору слотов
#monitor 1Выводить серверные FPS и CPS в чат каждую секунду
#userlistПоказать подключённых игроков
#kick <name>Отключить игрока
#lock / #unlockЗапретить и разрешить новые подключения
#shutdownОстановить сервер
#exec ban <name>Забанить игрока

#monitor 1 - диагностика, которая важна. Она выводит серверные FPS и CPS (вычисления условий в секунду); наблюдайте за ней в течение сессии, и вы увидите ровно тот момент, когда миссия начинает проседать. #monitor 0 снова отключает её. Для всего, что хочется сохранить, записью служит лог сервера, названный в logFile, - в статье логи, которые стоит хранить описано, какие строки стоит оставлять и на какой срок.

Диагностика проблем#

«You cannot play/edit this mission; it is dependent on downloadable content». У клиента нет мода, нужного миссии, или он другой версии. Ошибка называет аддон, а не мод, так что ищите по имени аддона.

Мгновенный кик с ошибкой подписи. В папке keys/ сервера нет .bikey либо у клиента изменённый PBO. Добавьте ключ; если проблема только у одного игрока, у него сломана загрузка, и ему нужно проверить целостность мода.

Лаунчер показывает только часть списка модов. Слишком мал steamProtocolMaxDataSize. Задайте 1024.

Сервер есть в браузере, но никто не может подключиться. Проверьте, что открыт весь блок UDP от -port до -port + 4, а не только игровой порт.

Серверные FPS падают через час после начала любой миссии. Почти всегда виновата миссия, а не хост: неубранные обломки, тела и брошенные предметы или цикл в скрипте. Включите #monitor 1 и смотрите, когда идёт падение. Если оно совпадает с событием в миссии, дело в миссии.

Миссия сбрасывается, когда уходит последний игрок. Нет persistent = 1.

Моды загружаются на Windows и не загружаются на Linux. Регистр. Приведите папки модов и их содержимое к нижнему регистру.

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

FAQ#

Сколько RAM нужно серверу Arma 3?

От трёх до четырёх гигабайт для ванили при тридцати игроках, шесть с CBA и ACE и от восьми до двенадцати для полного набора RHS и CUP. Моды загружаются независимо от того, использует ли их миссия, так что список модов задаёт нижнюю границу, а миссия определяет, насколько выше вы уйдёте.

Правда ли, что быстрый CPU важнее большого числа ядер?

Да. Симуляция работает в одном потоке и не делится, поэтому более высокая частота напрямую поднимает серверные FPS, а лишние ядра по большей части простаивают. Исключение - headless client: это настоящий второй процесс, и он использует ещё одно ядро.

Почему одни игроки могут зайти, а другие нет?

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

Нужны ли клиентам моды, загруженные через -serverMod?

Нет, в этом и смысл аргумента. Серверные моды логирования, администрирования и производительности идут в -serverMod=, чтобы они никогда не попадали в список, который игрок должен совпасть.

Можно ли запустить два сервера Arma 3 на одной машине?

Да, если у каждого свой блок из пяти портов и своя папка -profiles. Берите -port=2302 и -port=2312, а не соседние числа, чтобы блоки не пересекались, и помните, что каждый сервер держит в памяти свою копию списка модов.

Стоит ли настраивать headless client для небольшой группы?

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


Комментарии

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

0/2000