MAATRIX GAMES / Блог / Краш при телепортации между картами

Краш при телепортации между картами

MAATRIX GAMES

Кластер из нескольких карт ARK настроен, обелиски и порталы стоят на местах, игроки радостно бегают между The Island и Scorched Earth — и вдруг у кого-то краш прямо в момент перехода. Экран чернеет, клиент вылетает в рабочий стол, а персонаж потом либо не появляется на целевой карте, либо появляется без части инвентаря. Разберём по шагам, где искать причину и как чинить кластер, чтобы телепортация между картами работала предсказуемо.

Как вообще устроена передача персонажа между картами

Кластер ARK — это не один сервер с несколькими картами внутри, а несколько независимых процессов ShooterGameServer, каждый со своей картой, которые договариваются между собой через общую директорию кластера. Когда игрок заходит в обелиск или портал, сервер-источник не «телепортирует» персонажа напрямую на другой сервер — он сохраняет снимок игрока (профиль, инвентарь, иногда прирученных существ) в файл в общей директории кластера, а сервер назначения при следующем входе игрока читает этот файл и разворачивает состояние у себя.

Отсюда и три главных класса причин краша: сервера не видят друг друга как единый кластер (не совпадает ClusterID), не могут физически прочитать/записать файл передачи (проблема с ClusterDirOverride), либо файл передачи прочитан, но целевой сервер не может корректно принять данные — тут уже дело либо в ресурсах, либо в повреждённых данных самого профиля.

Важно понимать: клиентский краш при переходе — это почти всегда симптом на стороне сервера назначения, а не сервера-источника. Источник своё дело сделал (сохранил снимок), а вот принимающий сервер либо не готов, либо спотыкается о сами данные.

Проверка ClusterID: самая частая причина

ClusterID — это идентификатор, который объединяет отдельные серверы в один логический кластер. Указывается в команде запуска через параметр -ClusterID=<имя>. Если хотя бы один сервер в связке запущен с другим значением (или вообще без параметра) — с точки зрения остальных серверов он не часть кластера, и передача персонажа туда либо не сработает вовсе (сервер откажет в переходе на этапе выбора обелиска), либо, что хуже, начнётся переход, но целевой сервер не найдёт данные — и вы получите краш или зависание на экране загрузки.

Проверьте команду запуска (или юнит systemd, или конфиг панели) на всех серверах кластера — значение -ClusterID должно быть идентичным посимвольно, с учётом регистра:

ps aux | grep ShooterGameServer

Или, если сервера запущены через systemd-юниты, посмотрите строку ExecStart в каждом:

cat /etc/systemd/system/ark-server-theisland.service | grep ExecStart
cat /etc/systemd/system/ark-server-scorched.service | grep ExecStart

Пример корректной пары для двух карт одного кластера:

./ShooterGameServer TheIsland?listen?SessionName=MyCluster-Island?ClusterID=maatrix-cluster-01 -server -log -clusterid=maatrix-cluster-01
./ShooterGameServer ScorchedEarth_P?listen?SessionName=MyCluster-Scorched?ClusterID=maatrix-cluster-01 -server -log -clusterid=maatrix-cluster-01

Обратите внимание: ClusterID встречается и как параметр карты (?ClusterID=...), и как отдельный флаг командной строки (-clusterid=...) — на практике надёжнее продублировать оба варианта. Один лишний пробел, опечатка в имени или разный регистр («MyCluster» вместо «mycluster») — и сервера формально в разных кластерах, хотя выглядят одинаково на первый взгляд.

Поднять сервер ARK: Survival за пару минут

Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.

Создать сервер

ClusterDirOverride: где физически лежат файлы передачи

Второй по частоте виновник — путь к общей директории кластера, задаваемый параметром -ClusterDirOverride=<путь>. Если этот параметр не задан явно, ARK использует директорию по умолчанию внутри профиля сервера, и на разных серверах кластера (даже на одной машине, не говоря уже про разные VPS) она может физически не совпадать — тогда сервер-источник пишет файл передачи в одно место, а сервер назначения ищет его в другом. Итог: игрок «застревает» на экране загрузки, либо клиент получает от сервера назначения ошибку и вылетает.

Что обязательно проверить:

  • Путь совпадает на всех серверах кластера. Если кластер размещён на одном физическом сервере (несколько процессов ARK на одной машине под разными портами) — это самый простой случай, задайте один и тот же абсолютный путь везде:
-ClusterDirOverride=/home/arkserver/cluster-shared
  • Директория существует и доступна на запись от пользователя, из-под которого запущен процесс сервера:
mkdir -p /home/arkserver/cluster-shared
chown arkserver:arkserver /home/arkserver/cluster-shared
chmod 750 /home/arkserver/cluster-shared
  • Если сервера кластера физически на разных машинах (например, разные VPS под разные карты) — общая директория обязана быть на реально общем хранилище (сетевая ФС, смонтированный общий диск), потому что локальная папка на сервере А физически недоступна серверу Б. Это частая ловушка при масштабировании: настройка, которая работала на одном сервере с несколькими картами, ломается при переезде одной из карт на отдельную машину, потому что ClusterDirOverride продолжает указывать на локальный путь.

Проверить, что файлы передачи вообще появляются, просто: зайдите в обелиск, попробуйте переход и сразу посмотрите в директорию кластера:

ls -la /home/arkserver/cluster-shared/

Если после попытки перехода там не появился новый файл (обычно с именем вида <SteamID>.arktribe или похожим, плюс служебные файлы) — проблема на стороне записи (права доступа или неверный путь на сервере-источнике). Если файл появился, но переход всё равно крашит — смотрите дальше, в сторону сервера назначения.

Нехватка ресурсов на целевом сервере

Если ClusterID и ClusterDirOverride в порядке, файл передачи создаётся, но краш всё равно происходит именно в момент захода на целевую карту — вероятно, целевой сервер физически не готов принять игрока в момент попытки.

Два типичных сценария:

  1. Целевой сервер перегружен. Активная карта с 20+ игроками, десятками прирученных существ и крупной застройкой уже потребляет заметную долю RAM и CPU на обработку тиков. Заход нового игрока через кластер — это дополнительная нагрузка (подгрузка чанка местности вокруг обелиска, спавн персонажа со всем инвентарём), и если сервер уже находится на грани по памяти, эта операция может вызвать краш или зависание. Проверьте потребление памяти в момент попытки перехода:
free -h
top -b -n 1 | grep ShooterGameServer

Если свободной памяти впритык — это симптом, что серверу кластера в целом (или конкретно целевой карте) не хватает выделенных ресурсов, и решение тут не в конфигах, а в апгрейде VPS под эту карту.

  1. Целевой сервер ещё не полностью запустился. Если сервера кластера рестартуют одновременно (например, все по расписанию в одно окно через cron) или целевой сервер только что перезапустился после падения, у него уходит несколько минут на инициализацию мира — а обелиск на сервере-источнике может уже показывать целевую карту как «онлайн» по факту открытого порта, хотя мир там ещё не догрузился. Попытка телепортации в этот момент чаще ловит именно краш клиента, чем внятную ошибку.

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

Повреждённые данные существа или инвентаря

Самый редкий, но и самый неприятный случай: и ClusterID совпадает, и директория доступна, и ресурсов на целевом сервере хватает, а краш всё равно повторяется стабильно для конкретного игрока или конкретного переносимого существа. Это обычно означает, что файл передачи (снимок профиля или существа) физически повреждён — например, из-за того, что запись файла прервалась на середине (сервер-источник крашнулся или был убит через kill -9 в момент сохранения снимка), либо сам инвентарь игрока содержит предмет с некорректными данными (нередко встречается после кривого мода, который менял структуру предметов, а потом был отключён).

Признаки именно этого случая:

  • Краш повторяется у одного и того же игрока при попытке перейти именно с определённым существом или предметом в инвентаре, а без них переход проходит нормально.
  • В логе целевого сервера (ShooterGame/Saved/Logs/) в момент краша видны ошибки парсинга или ассерты, связанные с классом конкретного предмета/существа, а не общие сетевые обрывы.
  • Проблема не лечится ни рестартом серверов, ни проверкой прав на директорию кластера.

Штатного способа «почистить» один битый файл передачи без потерь у ARK нет — можно вручную удалить конкретный файл передачи игрока из ClusterDirOverride, тогда персонаж на целевой карте просто не примет этот снимок (игрок потеряет то, что нёс в этой попытке перехода, но сможет зайти). Если же повреждение уже просочилось в основной сейв целевой карты и краш происходит не только при заходе через портал, а постоянно на этой карте — остаётся только откат сервера к более ранней резервной копии. Порядок действий — в статье восстановление сервера из бэкапа: практика.

Диагностика по логам: с чего начинать разбор

Если не понятно, к какой из трёх категорий выше относится ваш случай, начните с логов обоих серверов — источника и назначения — сразу после воспроизведения краша:

tail -n 200 /home/arkserver/ark-server-theisland/ShooterGame/Saved/Logs/ShooterGame.log
tail -n 200 /home/arkserver/ark-server-scorched/ShooterGame/Saved/Logs/ShooterGame.log

Что искать в первую очередь:

Что видите в логеНа что это указывает
Сервер-источник не упоминает попытку сохранения снимка при переходеИгрок не дошёл до перехода — проверьте порты и доступность обелиска, это не проблема кластера
Целевой сервер молчит про приём файла кластераНе совпадает ClusterID или ClusterDirOverride указывает не туда
Целевой сервер пишет про нехватку памяти / OOM-killer в dmesgРесурсная проблема на целевом сервере
Ошибка парсинга конкретного класса предмета/существаБитые данные в файле передачи

Команда dmesg | tail -n 50 на целевом сервере сразу после краша тоже полезна — если процесс ShooterGameServer был убит ядром из-за нехватки памяти (OOM-killer), там будет прямая запись об этом, и тогда вопрос закрывается однозначно в пользу ресурсов, а не конфигов кластера.

Настройка тестового перехода без риска для боевых игроков

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

Полезно держать под рукой и базовую документацию по картам и запуску — если кластер только настраивается или один из серверов пересобирается с нуля, свежая пошаговая инструкция здесь: как поднять сервер ARK: Survival.

Поднять сервер ARK: Survival за пару минут

Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.

Создать сервер

Частые вопросы

Обязательно ли использовать одинаковый ServerAdminPassword на всех картах кластера?

Не обязательно для самой передачи персонажей — на неё влияют только ClusterID и ClusterDirOverride. Но для удобства администрирования (единый RCON-доступ ко всем картам) одинаковый пароль практичнее.

Можно ли собрать кластер из карт ARK: Survival Evolved и ARK: Survival Ascended вместе?

Нет, это технически разные игры с разным движком и форматом сохранений — кластер работает только между картами одной и той же версии игры.

Сколько времени должен занимать переход между картами в норме?

Обычно от нескольких секунд до минуты в зависимости от того, насколько загружен целевой сервер и сколько данных переносится (существо с полным инвентарём дольше пустого персонажа). Если переход стабильно занимает несколько минут даже без краша — это тоже сигнал приглядеться к ресурсам целевого сервера.

Что если краш происходит только у части игроков, а не у всех?

Это почти всегда указывает на повреждённые данные конкретного профиля/существа, а не на общую конфигурацию кластера — общая проблема (ClusterID, директория) ловит всех одинаково.

Нужно ли перезапускать все серверы кластера после изменения ClusterDirOverride?

Да, изменения командной строки запуска применяются только при перезапуске конкретного процесса — обновите путь и перезапустите каждый сервер кластера по очереди, не одновременно, чтобы не ловить второй пункт из раздела про нехватку ресурсов.