RE:NODE

Эксплуатация14 мин чтения

Что такое выделенный игровой сервер и как он работает

Выделенный игровой сервер запускает игру без единого игрока за ним. Что это меняет, сколько нужно RAM, CPU и портов и как держать его в порядке.

0 прочтений

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

Практически это выглядит так: безголовая программа, от 512 МБ до 16 ГБ памяти в зависимости от игры, одно-два быстрых (а не многочисленных) ядра процессора, несколько гигабайт диска, один-два открытых порта и файл конфигурации. Сложности не в установке. Они в обновлениях, сохранениях и в том, что игровой сервер - это программа, которая должна выживать без чьего-либо присмотра.

Listen-серверы, peer-to-peer и выделенные серверы#

Многопользовательские игры выбирают одну из трёх схем, и от выбора зависит почти всё, что касается хостинга.

МодельКто хранит мирЗатраты ложатся наЛомается, когда
Peer-to-peerВсе клиенты, по согласованиюСоединение каждогоУ кого-то плохая задержка
Listen-серверИгровой клиент одного игрокаПК и исходящий канал хостаХост выходит из игры
Выделенный серверОтдельный безголовый процессМашину, на которой он работаетЛомается машина

Listen-сервер - это то, что вы получаете от Host and Play в Terraria, Open to LAN в Minecraft, внутриигрового хоста мира в Valheim или Create Server в играх на Source. Это тот же самый код, что и у выделенного сервера, приклеенный к клиенту, который ещё и рисует игру. Он бесплатный и запускается за десять секунд, но у него три проблемы, которые никуда не денутся: у хоста нулевая задержка, а у остальных такая, какую позволяет исходящий канал хоста; мир существует, только пока открыта игра хоста; и машина хоста делает две работы сразу. В загруженный вечер хост переключается в браузер, и это чувствуют восемь человек.

Peer-to-peer реже встречается в играх с постоянным миром и часто - в сессионных: файтингах, некоторых кооперативных шутерах, старых RTS. Обычно и там один из игроков всё равно назначается хостом, поэтому существует «миграция хоста» и поэтому она обычно неприятна.

Выделенный сервер убирает игрока из уравнения. Издатель выпускает вторую программу без рендера и звука: valheim_server.x86_64, srcds_linux, PalServer.sh, server.jar, 7DaysToDieServer.x86_64. Она запускается из командной строки, пишет в стандартный вывод и администрируется через консоль или RCON, а не через меню. Почти всегда она бесплатна, даже когда сама игра платная, и почти всегда доступна под Linux, поэтому её хостинг стоит несколько долларов, а не цену десктопа с Windows.

Что на самом деле работает на машине#

Уберите маркетинг, и игровой сервер окажется циклом. Он просыпается через фиксированный интервал, читает всё, что пришло от клиентов с прошлого раза, продвигает симуляцию на один шаг, решает, что каждому клиенту позволено знать, и отправляет это. Затем повторяет. Интервал - это tick rate: 20 в секунду у Minecraft, 30, 64 или 128 у соревновательных шутеров в зависимости от игры и конфига, 60 у многих игр на Unreal. Почему большее число не обязательно лучше, объясняет статья что на самом деле значит tick rate.

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

Вот что находится между мышью игрока и файлом, в котором живёт мир, на типичном арендованном сервере:

имя в IPUDP или TCPпроброс портасохраняет по таймеруИгрокиигровые клиентыDNS-имянеобязательная A-записьХост-машинаГермания, NVMeКонтейнерлимит RAM и CPUИгровой процессцикл тиковМир и конфигна диске
Что стоит между игроком и файлом мира

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

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

Дома, на VDS или на игровой панели#

Три способа запустить выделенный сервер, и это действительно разные работы.

ВариантВы управляетеХорош дляПодвох
Ваш ПК или запасная машинаВсемОбучения, LAN, тестовИсходящий канал, CGNAT, электричество, ваш домашний IP
VPS или VDSОС и всем вышеЛюбой игры, нескольких игр, необычных настроекТеперь вы сисадмин
Хостинг с игровой панельюТолько игройЗапустить одну игру и не дать ей упастьНет root, один сервер - одна игра

Дома бесплатно, пока не перестаёт быть бесплатным. Людей останавливают две вещи: исходящая пропускная способность (сервер отправляет намного больше, чем получает, а большинство домашних подключений устроены наоборот) и carrier-grade NAT, когда у вашего роутера нет публичного адреса, на который можно пробросить порт. Добавьте электричество, шум, то, что ваш домашний IP теперь известен посторонним, и то, что машина должна работать, пока вас нет. Честное сравнение есть в статье свой игровой сервер дома или аренда.

VPS или VDS даёт root и чистую машину с Debian или Ubuntu. Вы ставите SteamCMD, пишете unit для systemd, настраиваете файрвол, организуете бэкапы и следите за обновлениями ОС. Это верный ответ, когда вам нужно несколько игр на одной машине, игра, которую никто не предлагает, или софт, которого не будет в контейнере. И неверный, если фраза «пишете unit для systemd» стала причиной, по которой вы бросили читать. Учтите ловушку терминологии: «выделенный сервер» в смысле этой статьи - программа, а выделенные машины в смысле хостингового продукта - железо. Эти два значения постоянно сталкиваются.

Хостинг с игровой панелью запускает каждый сервер в собственном контейнере с уже установленной игрой, уже выделенными портами и веб-консолью вместо SSH. Вы отказываетесь от root и возможности запускать на машине что угодно. Для одной игры и одной компании друзей такой обмен почти всегда правильный. Решение расписано в статье VDS или игровая панель, а что за механизм лежит под большинством панелей, объясняет статья что такое панель Pterodactyl.

Что нужно выделенному игровому серверу#

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

ИграRAM на ~10 игроковCPUРастёт вместе с
Terraria0.5-1 GB1 ядроРазмером мира, числом NPC
Counter-Strike 21-2 GB1-2 быстрых ядраПлагинами, tick rate
Minecraft (Paper)2-4 GB1-2 быстрых ядраДальностью прорисовки, чанками, плагинами
Valheim2-4 GB1 быстрое ядроИсследованной областью, постройками, изменением рельефа
Factorio1-3 GB1 очень быстрое ядроРазмером фабрики, а не числом игроков
Project Zomboid3-6 GB2 ядраЗагруженными ячейками карты, числом зомби
Palworld8-16 GB2-4 ядраБазами, палами, наигранным временем
7 Days to Die8-12 GB2-4 ядраРазмером мира, разбросом игроков

Четыре правила, стоящие за этой таблицей:

  • Память занимается, а не используется. Серверы на Java особенно склонны расти до размера выданной кучи и только потом собирать мусор. Сервер Minecraft, занявший 90% кучи в 4 ГБ, обычно в порядке; тот же сервер, упёршийся в лимит контейнера и умерший, - нет. Та же ловушка на стороне приложений разобрана в статье лимиты памяти Node простыми словами.
  • С процессором вопрос в тактовой частоте, а не в числе ядер. Почти у любого игрового сервера есть один горячий поток. Четыре ядра для игры, использующей 1.2 из них, ничего вам не дадут. Как понять, что именно у вас закончилось, объясняет статья CPU или RAM для игровых серверов.
  • Диск - это в основном установка. Игры на движке Source и крупные survival-проекты хотят 20-60 ГБ ещё до первого сохранения; Minecraft и Valheim - два-три. Скорость важна при сохранении и генерации мира, и именно там заметно то, о чём говорит статья что на самом деле меняет NVMe, и больше нигде.
  • Трафика мало, а задержка не мала. Большинство игр отправляет от 30 до 300 КБ/с на игрока. Десять игроков не затруднят ни один современный канал. То, что люди называют лагом, почти всегда оказывается задержкой, джиттером или потерей пакетов, а эти три вещи - разные проблемы с разными способами лечения.

Порты, адреса и как игроки находят сервер#

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

ИграПортПротоколПримечание
Minecraft Java25565TCPИ UDP 25565, если включён query
Valheim2456, 2457UDPИгровой порт и игровой порт + 1
Source / CS227015UDPТо же число по TCP для RCON
Palworld8211UDPПлюс порт REST/RCON, если включён
Terraria7777TCP
Factorio34197UDP
Project Zomboid16261UDPПрямое подключение может использовать 16262
7 Days to Die26900TCP + UDPДиапазон UDP 26900-26902

Из этой таблицы постоянно вырастают два вида отказов. Первый - правило файрвола для TCP при игре на UDP: получается сервер, который запускается, бодро пишет в лог и никого не принимает. Второй - открыт игровой порт, но не порт запросов: получается сервер, к которому можно подключиться по IP, но который не появляется ни в одном браузере. Оба случая разобраны в статье порты игрового сервера.

Игроки находят сервер одним из четырёх способов: набирают IP, пользуются собственным браузером серверов игры на основе мастер-сервера, заходят через стороннюю listing-площадку или получают код подключения в Discord. Для браузера обычно нужен открытый порт запросов и, для игр Steam, часто токен входа игрового сервера - когда он нужен, объясняет статья токены игровых серверов Steam. Если вам нужно имя вместо адреса, это A-запись, указывающая на IP сервера, а для Minecraft запись SRV позволяет полностью спрятать нестандартный порт: см. как привязать домен к игровому серверу и SRV-записи для Minecraft.

Установка и файлы, которые её настраивают#

Для игр Steam установка - это SteamCMD и app id, обычно с анонимным входом:

bash
$ steamcmd +force_install_dir /home/container +login anonymous \    +app_update 896660 validate +quit

Горстка игр отказывается от анонимной загрузки и требует настоящий аккаунт Steam, а некоторым перед запуском сервера нужен собственный ключ доступа. App id и синтаксис бета-веток есть в статье SteamCMD простыми словами. Minecraft - исключение из всего этого: скачайте jar, запустите один раз, примите EULA в eula.txt, запустите снова (весь первый запуск).

Конфигурация затем живёт в одной из четырёх форм, в зависимости от игры:

  1. Файл «ключ-значение», который сервер читает при запуске: server.properties, PalWorldSettings.ini, serverconfig.xml, ServerConfig.toml.
  2. Скрипт из консольных команд, выполняемый при запуске: server.cfg в играх на Source, autoexec.cfg, server.cfg у FiveM.
  3. Только аргументы запуска без всякого файла - самый известный случай Valheim, и люди, пришедшие из Minecraft, двадцать минут ищут несуществующий конфиг.
  4. Переменные окружения: именно так хостинги на контейнерах обычно выводят аргументы запуска, чтобы их можно было править в форме, а не в командной строке.

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

Как поддерживать его в живых#

Установка сервера занимает вечер. Эксплуатация - это и есть работа, и сводится она к четырём привычкам.

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

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

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

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

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

Что идёт не так и что это обычно значит#

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

Работает и доступен по IP, но не появляется в браузере. Порт запросов закрыт, публичный флаг выключен или нет токена Steam. Списки серверов к тому же медленные: десять минут до появления новой записи - это норма.

"Incompatible version" после обновления. Клиент и сервер на разных сборках. Обновите сервер; если он с модами, сначала дождитесь модов.

Тормозит при восьми игроках, хотя график CPU показывает 35%. Этот график - среднее по ядрам, а игра использует одно. Единственный горячий поток забит до предела, хотя суммарно всё выглядит простаивающим.

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

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

FAQ#

Выделенный сервер - это то же самое, что выделенный хостинг?

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

Нужен ли выделенный сервер для двух-трёх друзей?

Технически нет: подойдёт listen-сервер. Но вы захотите его в первый же раз, когда кому-то понадобится поиграть, пока хост спит, или когда машина хоста начнёт тормозить во время рейда. Самые маленькие тарифы для нетребовательных игр начинаются с 1-2 ГБ, чего в большинстве игр хватает небольшой группе.

Нужна ли серверу видеокарта?

Нет. Серверные сборки безголовые: без рендера, без звука, без окна. Поэтому они работают на Linux-машинах вообще без GPU и требуют намного меньше железа, чем клиент.

Сколько игроков вмещает один сервер?

Это зависит от игры гораздо сильнее, чем от железа. Valheim по замыслу ограничен десятью; предел Minecraft скорее практический, чем жёсткий, и зависит от дальности прорисовки и плагинов; некоторые шутеры настроены на 64. Арифметику разбирает статья сколько игроков помещается на сервере.

Можно ли запустить две игры на одном сервере?

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

Что будет с моим миром, если я перестану платить?

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


Комментарии

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

0/2000