На всех серверах Безлимитный трафик, защита от DDoS и IPMI включены. Без платы за подключение и контракта. Безлимитный трафик на всех серверах Смотреть цены

Руководство · Игры

Хостинг игровых серверов на выделенном оборудовании

Почему частота и кэш процессора определяют производительность игрового сервера, как оценить число инстансов на сервер и как запускать их на Linux с защитой от DDoS.

  • 8 мин чтения
  • Обновлено
  • Инженерная команда FlexDedi

Для этого руководства

Core 16X

  • AMD EPYC 4585PX · 16 ядер
  • 192 ГБ DDR5 ECC
  • 2 × 3,84 ТБ NVMe Gen4
  • 10 Гбит/с, безлимитный трафик
На этой странице

Игровые серверы — необычная нагрузка. Их редко ограничивает суммарная мощность CPU, объём памяти или пропускная способность канала; ограничивает их то, насколько быстро один поток успевает обработать каждый тик симуляции. В этом руководстве разберём, что это означает для выбора оборудования, как оценить, сколько серверов поместится на одной машине, и как запускать их в Linux с разумной защитой и резервным копированием.

Бюджет времени на тик

Авторитарный игровой сервер (authoritative server) обновляет мир с фиксированной частотой. За каждый тик он обрабатывает ввод игроков, физику, ИИ и игровые правила, а затем отправляет состояние клиентам. Время, отведённое на один тик, считается простой арифметикой:

Частота тиковВремя на тик
20 Гц (Minecraft Java)50 мс
30 Гц33,3 мс
64 Гц15,6 мс
128 Гц7,8 мс

Когда тик не укладывается в бюджет, сервер начинает отставать, и это ощущает каждый игрок: персонажей откидывает назад (rubber-banding), попадания засчитываются с опозданием, а разрушенные блоки появляются снова. Дополнительные ядра не помогают, если работа выполняется в одном главном потоке, — а во многих движках так устроена значительная часть симуляции.

Почему важны частота и кэш

Производительность одного потока — это число инструкций за такт, умноженное на частоту. Все серверы FlexDedi построены на ядрах Zen 5, поэтому разница определяется частотами и кэшем: Core 16 работает в режиме Boost на частоте до 5,4 ГГц, а Core 16X — до 5,7 ГГц, тогда как серверы на EPYC 9005 — от 4,4 ГГц до 4,5 ГГц. Базовая частота тоже важна, потому что на плотно заполненном игровом хосте заняты все ядра: 4,3 ГГц у Core 16X и 3,0 ГГц у Core 16.

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

3D V-Cache в Core 16X

В EPYC 4585PX, на котором построен Core 16X, поверх кристалла размещён дополнительный кэш L3 — в сумме 128 МБ против 64 МБ у EPYC 4545P в Core 16. 3D V-Cache создан именно для больших нерегулярных рабочих наборов, и игровая симуляция — один из таких случаев. Насколько он поможет, зависит от игры, карты и числа игроков, поэтому тестируйте свою игру, а не полагайтесь на допущения.

Кэш распределён неравномерно. 16-ядерный процессор Zen 5 состоит из двух 8-ядерных кристаллов (CCD) по 32 МБ L3 на каждом, а дополнительные 64 МБ находятся на одном из них: 96 МБ на одном CCD и 32 МБ на другом. Определите, какие логические CPU используют большой кэш:

bash
for d in /sys/devices/system/cpu/cpu*/cache/index3; do
  echo "$(cat "$d/size") $(cat "$d/shared_cpu_list")"
done | sort -u

Вы увидите две строки вида 98304K 0-7,16-23 и 32768K 8-15,24-31; нумерация на вашем сервере может отличаться. Привяжите самые требовательные серверы к CPU с большим кэшем. Некоторым играм частота важнее кэша, поэтому, прежде чем принять окончательное решение, сравните одну и ту же карту на каждой группе CPU.

SMT и политика управления частотой

Выделите главному потоку каждого сервера собственное физическое ядро; соседний SMT-поток того же ядра может обслуживать вспомогательные потоки. Кроме того, на bare metal вы сами управляете политикой частоты, к которой виртуальная машина доступа никогда не даёт. Проверьте драйвер и регулятор частоты (governor) и на чувствительных к задержкам хостах используйте performance:

bash
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_driver
echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

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

Сколько серверов поместится на одной машине

Честной универсальной цифры не существует. Всё зависит от игры, модов, размера карты, числа игроков и частоты тиков. Измерьте один экземпляр в пике нагрузки и посчитайте:

  1. Запустите один сервер с реалистичным числом игроков и зафиксируйте загрузку CPU главным потоком, резидентную память (RSS), объём записи на диск во время сохранений и сетевой трафик.
  2. Примените каждое ограничение из таблицы ниже и возьмите наименьший результат.
ОграничениеОценка
CPU(физические ядра − ядра, зарезервированные под ОС, панель и резервное копирование) ÷ ядра на один экземпляр
Память(RAM − запас под ОС и страничный кэш) ÷ пиковый RSS одного экземпляра
Сеть(скорость порта × коэффициент запаса) ÷ (число игроков × трафик на одного игрока)
Дисксколько сохранений может выполняться одновременно, не задерживая тики

Пример с условными цифрами, а не с результатами измерений: каждому экземпляру нужно одно физическое ядро для главного потока, а в пике он занимает 8 ГБ RAM. На Core 16X, если зарезервировать 2 ядра и 32 ГБ, по CPU получается 14 экземпляров, а по памяти — (192 − 32) ÷ 8 = 20. Ограничивает CPU, поэтому рассчитывайте примерно на 14 экземпляров и проверьте это под реальной нагрузкой.

Несколько закономерностей справедливы для большинства игр:

  • Постоянные миры-песочницы (игры о выживании, строительстве и управлении колонией) со временем занимают всё больше памяти, а их сохранения растут, поэтому повторяйте замеры раз в несколько недель.
  • Серверы для матчей живут недолго и обычно расходуют мало памяти, поэтому предел задаёт CPU.
  • Minecraft Java обрабатывает тики мира в одном главном потоке. Серверное ПО вроде Paper снижает стоимость тика, а /mspt или профилировщик spark показывают, насколько вы близки к бюджету в 50 мс. Задайте JVM фиксированный размер кучи (-Xms равен -Xmx) по фактическому потреблению сервера, а не по всему объёму RAM, который у вас есть.
  • Сеть ограничивает редко: трафик одного игрока ничтожен по сравнению с портом 10 Гбит/с. Важнее интенсивность потока пакетов и трафик атак.

Защита от DDoS

Игровые серверы — частая мишень DDoS-атак. Для каждого IP-адреса FlexDedi включена постоянно активная защита от DDoS, поэтому трафик атак фильтруется без каких-либо действий с вашей стороны. Но базовая гигиена на самом хосте по-прежнему важна:

  • Открывайте только те порты, которые нужны каждой игре, и только с нужным протоколом, например ufw allow 25565/tcp или ufw allow 27015/udp.
  • Не выставляйте порты RCON, query и администрирования в публичный интернет: привязывайте их к 127.0.0.1 или к частной сети.
  • Размещайте веб-панели за VPN или ограничивайте доступ к ним списком разрешённых IP-адресов и никогда не открывайте наружу базы данных, которые используют плагины или панели.

Выбирайте локацию по местонахождению игроков

Расстояние задаёт нижнюю границу задержки. Свет в оптоволокне проходит около 200 км за миллисекунду, поэтому каждые 1 000 км пути добавляют к времени отклика (RTT) не менее 10 мс. Для оценки: Даллас находится примерно в 2 000–2 200 км и от Лос-Анджелеса, и от Нью-Йорка, а значит, физический минимум RTT до любого из побережий — около 20–22 мс ещё до того, как добавится задержка маршрутизации.

Выбирайте локацию, ближайшую к основной массе ваших игроков: Нью-Йорк, Ашберн, Даллас или Лос-Анджелес в Северной Америке; Амстердам, Франкфурт или Лондон в Европе; Сингапур, Токио или Сидней в Азиатско-Тихоокеанском регионе. Core 16 и Core 16X доступны во всех десяти локациях. Прежде чем принять решение, запустите ping и traceroute до сетей ваших игроков из Looking Glass.

Настройка Linux с systemd

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

ini
# /etc/systemd/system/minecraft@.service
[Unit]
Description=Minecraft server %i
After=network-online.target
Wants=network-online.target

[Service]
User=minecraft
WorkingDirectory=/srv/minecraft/%i
ExecStart=/usr/bin/java -Xms8G -Xmx8G -XX:+UseG1GC -jar server.jar --nogui
Restart=on-failure
RestartSec=10
SuccessExitStatus=0 143
TimeoutStopSec=90
CPUAffinity=0-7 16-23
Nice=-5
NoNewPrivileges=true
ProtectSystem=full
PrivateTmp=true

[Install]
WantedBy=multi-user.target
bash
sudo useradd --system --create-home --home-dir /srv/minecraft --shell /usr/sbin/nologin minecraft
sudo systemctl daemon-reload
sudo systemctl enable --now minecraft@survival minecraft@creative
journalctl -u minecraft@survival -f

Каждый экземпляр располагается в /srv/minecraft/NAME. При остановке systemd отправляет SIGTERM: сервер сохраняет мир, а JVM завершается с кодом 143, который SuccessExitStatus считает штатным. CPUAffinity привязывает экземпляры к найденным ранее CPU с большим кэшем. Чтобы перенести менее нагруженный экземпляр на другие CPU, выполните sudo systemctl edit minecraft@creative и добавьте пустую строку CPUAffinity=, а за ней — строку с новым списком: иначе настройка объединится со значением из шаблона. Интерактивной консоли systemd не предоставляет, поэтому администрируйте серверы через RCON с помощью клиента, например mcrcon.

LinuxGSM и панели управления

LinuxGSM

LinuxGSM — консольный менеджер для более чем 100 игровых серверов. Он устанавливает сервер, запускает его в tmux и добавляет мониторинг, обновления и резервное копирование. Для каждой игры создаётся отдельный пользователь:

bash
sudo adduser vhserver
su - vhserver
curl -Lo linuxgsm.sh https://linuxgsm.sh && chmod +x linuxgsm.sh && bash linuxgsm.sh vhserver
./vhserver install
./vhserver start
./vhserver details

vhserver — это Valheim; у каждой поддерживаемой игры своё короткое имя. Проект рекомендует запускать по cron команду monitor, которая перезапускает упавший сервер, и команду update:

text
*/5 * * * * /home/vhserver/vhserver monitor > /dev/null 2>&1
*/30 * * * * /home/vhserver/vhserver update > /dev/null 2>&1

Панели в стиле Pterodactyl

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

  • Разместите панель на небольшом отдельном сервере или ВМ и подключайтесь к игровым хостам по частной сети.
  • Задайте лимиты CPU для каждого сервера и, если панель это поддерживает, закрепите потоки так, чтобы тяжёлые серверы работали на CPU с большим кэшем.
  • Контейнеры публикуют порты через Docker, а он обходит UFW, поэтому управляйте доступностью портов через их распределение (allocations) в панели и через цепочку DOCKER-USER в Docker.

Резервное копирование

Миры — то, что нельзя заменить. Делайте их резервные копии по расписанию, храните копии вне сервера и проверяйте восстановление:

  • На время копирования приостанавливайте сохранение, чтобы файлы были согласованными. Для Minecraft отправьте через RCON save-off и save-all flush, скопируйте мир, затем отправьте save-on. Команда LinuxGSM ./vhserver backup создаёт собственные архивы.
  • Передавайте копии на другой сервер с помощью restic или rsync. Сервер хранения данных в той же локации получает их по бесплатной частной сети, вторая локация защищает от инцидента на уровне всей площадки, а благодаря безлимитному трафику внешние копии не добавляют платы за передачу данных.
  • Храните несколько поколений копий: повреждение мира может оставаться незамеченным несколько дней.

Запуск на FlexDedi

Для большинства задач игрового хостинга начните с Core 16X ($399/мес.): EPYC 4585PX с 3D V-Cache, базовая частота 4,3 ГГц и Boost до 5,7 ГГц, 192 ГБ DDR5 ECC и 2 × 3,84 ТБ NVMe. Core 16 ($299/мес.) подойдёт для менее требовательных игр и тестовых серверов. У обоих порты 10 Гбит/с с безлимитным трафиком и постоянно включённая защита от DDoS, оба доступны во всех 10 локациях и обычно готовы в течение 15 минут.

Если вы размещаете много небольших серверов вместе с панелями и базами данных, Pro 32 ($749/мес.) предлагает 32 ядра и 384 ГБ ценой меньшей скорости на ядро. Подробнее — на странице «Игровые серверы».

Другие руководства

Ваш следующий сервер — через несколько минут.

Закажите Core 16 за $299/мес. или доверьте нашим инженерам подбор парка серверов под ваши задачи.

  • Без платы за подключение
  • Безлимитный трафик
  • Отмена в любой момент