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 бой превращается в слайд-шоу из юнитов, телепортирующихся в укрытия. Что двигает это число, по порядку:
- Количество ИИ. Каждый юнит ИИ обходится в поиск пути, выбор целей и обновление знаний в каждом кадре. Двести ИИ на большой карте вдвое уменьшат серверные FPS ещё до того, как подключится хоть один игрок.
- Скрипты. Миссия с тяжёлыми циклами в unscheduled-коде блокирует тот же поток, который использует симуляция. Причина деградации сервера на третьем часу обычно в миссии, а не в хосте.
- Объекты и физика. Уничтоженная техника, брошенное оружие и ragdoll накапливаются. Миссия, которая никогда не чистит за собой, становится всё медленнее.
- Игроки. Удивительно, но в списке они далеко внизу. Рядом с ИИ игроки дёшевы.
Память редко бывает ограничением на ванильном сервере и всегда - на сервере с большим набором модов, потому что моды загружают своё содержимое в процесс независимо от того, использует ли его миссия.
Требования и потребление ресурсов#
| Конфигурация | RAM | CPU | Диск |
|---|---|---|---|
| Ваниль, 20-30 игроков, лёгкий ИИ | 3-4 GB | 2 быстрых ядра | 40 GB |
| CBA плюс ACE, одна миссия, 40 игроков | 6 GB | 2-3 быстрых ядра | 55 GB |
| Полный набор: CBA, ACE, RHS, CUP Terrains | 8-12 GB | 3+ быстрых ядра | 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#
Самому серверу аккаунт не нужен:
$ steamcmd +force_install_dir /home/arma/server +login anonymous \ +app_update 233780 validate +quitС модами из Workshop дело обстоит иначе. Они принадлежат игре, app id 107410, и для их скачивания нужен аккаунт Steam, которому принадлежит Arma 3:
$ 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 выглядит так:
$ ./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: точка с запятой после каждой инструкции, массивы объявляются через [].
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. В этом файле живут вид от третьего лица, прицел, маркеры на карте и навык ИИ. Правьте его при остановленном сервере: сервер перезаписывает его при выходе.
Порты и подключение#
| Порт | Протокол | Назначение |
|---|---|---|
2302 | UDP | Игровой трафик |
2303 | UDP | Steam query. С ним общаются браузер и лаунчер |
2304 | UDP | Steam master, отчёты сервера |
2305 | UDP | Зарезервирован блоком портов |
2306 | UDP | BattlEye |
Правило такое: Arma занимает с -port по -port + 4, всё это UDP, и сдвиг игрового порта сдвигает весь блок. Поэтому тарифы Arma 3 на RE:NODE идут с пятью выделенными портами, а не с одним: при меньшем числе либо браузер, либо BattlEye тихо перестаёт работать. Если нужно больше, вкладка Network добавляет и убирает порты. В статье порты игрового сервера объяснено, зачем вообще нужен отдельный порт запросов.
Игроки заходят через встроенный браузер серверов, через прямое подключение в Arma 3 Launcher или добавив адрес в избранное Steam. Игрокам стоит советовать именно лаунчер, потому что он умеет загрузить список модов сервера одним щелчком - при условии, что задан steamProtocolMaxDataSize.
Моды, ключи и проверка подписей#
Мод - это папка, название которой начинается с @, с каталогом addons из файлов .pbo и, как правило, каталогом keys с одним .bikey. Два правила покрывают почти все отказы при входе:
- Каждый `.bikey` каждого мода из `-mod=` нужно скопировать в корневую папку `keys/` сервера. При
verifySignatures = 2и отсутствующем ключе клиент отклоняется с сообщением о неподписанном аддоне, в котором названо имя файла, а не мода. - Список модов клиента должен совпадать со списком `-mod=` сервера: те же моды, те же версии. Исключение - моды из
-serverMod=: они загружаются только на сервере, и клиентам они не нужны и не видны. Серверные инструменты администрирования, логирования и производительности относятся сюда.
Порядок загрузки выбираете вы, и он важен. CBA_A3 грузится раньше всего, что от него зависит; ACE - после CBA; моды карт - раньше модов, которые эти карты правят. Arma сама разрешает большинство зависимостей, но мод, который правит другой и загружается первым, попросту не применяется.
На Linux есть ещё одна ловушка, стоящая людям вечера: регистр символов. Материалы из Workshop приходят с именами папок и файлов в смешанном регистре, и сервер на Linux не найдёт Addons/ACE_Main.pbo, когда конфигурация просит addons/ace_main.pbo. После каждого скачивания приводите всё к нижнему регистру:
$ find ./@ace -depth -name '*[A-Z]*' -execdir bash -c 'mv "$0" "${0,,}"' {} \;Три привычки делают список модов стабильным. Фиксируйте версии: мод, который автоматически обновился посреди кампании, кампанию заканчивает, а в Workshop у Arma собственной фиксации версий нет, так что фиксация означает «не скачивать заново». Публикуйте список там, откуда игроки могут его скопировать, лучше всего в виде файла пресета лаунчера, а не описывая в сообщении. А когда что-то всё-таки ломается, что делать, когда обновление мода всё сломало - путь короче, чем пересобирать список с нуля.
Про Creator DLC стоит сказать отдельно: сервер может запускать карту из CDLC, а игроки, у которых её нет, всё равно могут зайти, но с ограниченным доступом к этому содержимому. Сработает ли это для вашей миссии, зависит от того, что миссия использует.
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 - способ вынести эту работу из процесса сервера. Это вторая копия того же исполняемого файла, которая подключается к серверу как игрок без экрана, и миссия передаёт ей владение группами ИИ. На машине с запасом ядер это разница между боем на третьем часу, в который можно играть, и боем, который ползёт.
$ ./arma3server_x64 -client -connect=127.0.0.1 -port=2302 \ -profiles=./hc -name=hc -nosound \ -mod="@CBA_A3;@ace;@RHSAFRF"Три условия, которые должны выполняться одновременно:
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. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.