Pterohost docs

Оптимизация Palworld-сервера: TPS, лаги, флаги запуска

Глубокая оптимизация Palworld dedicated server: флаги -useperfthreads, -NoAsyncLoadingThread, -UseMultithreadForDS, параметры конфига под нагрузку, CPU-affinity, NVMe и измерение serverfps.

Оптимизация Palworld-сервера - это не одна галочка, а связка из флагов запуска, параметров конфига под нагрузку, правильного железа и мониторинга tickrate. Palworld написан на Unreal Engine 5, и его серверная нагрузка растёт не столько от числа игроков, сколько от количества баз и палов, работающих на них. В этой статье разбираем, что именно грузит CPU, что делает каждый флаг запуска, какие параметры конфига снижают нагрузку и как измерять serverfps через REST API. Установку и базовую настройку не дублируем - для них есть отдельные материалы: установка Palworld dedicated server и настройка PalWorldSettings.ini.

Почему Palworld грузит CPU

Прежде чем крутить настройки, нужно понять, куда уходят такты процессора. У Palworld три главных потребителя CPU, и все они масштабируются нелинейно.

Radius load: чанки вокруг каждого игрока

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

AI палов на базах: главный убийца tickrate

Самый недооценённый источник лага - палы на базах. Каждый пал, назначенный на базу, - это отдельный AI-агент: он ищет работу, идёт к объекту, взаимодействует, ест, спит. Palworld просчитывает этих палов даже когда владелец базы оффлайн (если не включено автоудаление гильдий). Считаем: гильдия с 4 базами по 15 палов - это 60 постоянно тикающих AI. Десять таких гильдий на сервере - 600 AI-агентов, каждый со своим pathfinding по навмешу. Именно это, а не игроки в бою, чаще всего кладёт tickrate.

Однопоточность игрового тика

Даже с флагами многопоточности главный игровой тик (game thread) остаётся преимущественно однопоточным - так устроен Unreal Engine. Флаги выносят в отдельные потоки загрузку ассетов и часть вспомогательной работы, но симуляция мира упирается в производительность одного ядра. Отсюда правило: для Palworld важнее высокая частота ядра (single-thread performance), чем их количество. Ryzen 9 с высоким бустом обгонит многоядерный, но медленный Xeon.

Флаги запуска: что делает каждый

Рекомендованная строка запуска Palworld dedicated server:

./PalServer.sh -useperfthreads -NoAsyncLoadingThread -UseMultithreadForDS port=8211 players=32

Разберём по флагам.

ФлагЧто делаетЭффект
-useperfthreadsВключает пул потоков производительности UE, распределяя фоновые задачи (сериализация, задачи движка) по свободным ядрамСнижает пики нагрузки на главный поток
-NoAsyncLoadingThreadОтключает отдельный поток асинхронной подгрузки ассетов. На клиенте он полезен для плавности, на сервере создаёт лишние переключения контекстаУбирает конкуренцию за ядро с game thread
-UseMultithreadForDSКлючевой флаг именно для dedicated server (DS): разрешает движку задействовать несколько потоков для серверной симуляцииОсновной прирост tickrate

По замерам сообщества полный набор из трёх флагов даёт 15-30% прирост устойчивого tickrate при онлайне 16 и выше. Важный момент: флаги работают в связке. Если поставить только -UseMultithreadForDS без остальных, -NoAsyncLoadingThread не уберёт паразитный поток загрузки, и часть выигрыша съестся. Ставьте все три.

Флаги прописываются как в ручном запуске, так и в systemd-unit в строке ExecStart. Порядок флагов значения не имеет, но они должны идти до port= и players=.

Параметры конфига под нагрузку

Часть настроек PalWorldSettings.ini напрямую влияет на CPU и RAM. Полный разбор конфига - в статье про настройки Palworld, здесь только то, что касается производительности.

Дроп предметов

DropItemMaxNum=1500
DropItemMaxNum_UNKO=100
DropItemAliveMaxHours=1.000000

DropItemMaxNum (дефолт 3000) - это потолок числа предметов, лежащих на земле в мире. Каждый такой предмет - объект, который движок отслеживает и синхронизирует. На загруженном сервере снижение до 1500 заметно разгружает и CPU, и сеть. DropItemAliveMaxHours=1.0 заставляет дроп исчезать через час - без этого выкинутые вещи копятся и живут постоянным фоном. Для высокого онлайна можно поставить 0.5 (30 минут).

Ограничение баз и палов

BaseCampMaxNumInGuild=3
BaseCampWorkerMaxNum=15
BaseCampMaxNum=128
GuildPlayerMaxNum=20

BaseCampMaxNumInGuild (дефолт 4) - самый мощный рычаг. Уменьшение до 3, а на тяжёлых серверах до 2, режет число активных AI-палов линейно. BaseCampWorkerMaxNum (дефолт 15) - сколько палов работает на одной базе. Снижение до 10-12 уменьшает AI-нагрузку без большого ущерба для геймплея. BaseCampMaxNum=128 - глобальный потолок баз на весь сервер, страхует от бесконтрольного роста.

Автоудаление брошенных гильдий

bAutoResetGuildNoOnlinePlayers=True
AutoResetGuildTimeNoOnlinePlayers=168.000000

Это критично для долгоживущих серверов. Когда игрок бросает сервер, его базы и палы остаются в мире и продолжают тикать вечно, отъедая CPU. bAutoResetGuildNoOnlinePlayers=True включает автоудаление гильдий, все участники которых оффлайн дольше AutoResetGuildTimeNoOnlinePlayers часов. 168 часов = неделя. На активных серверах это единственный способ не дать миру зарасти мёртвыми базами. Учтите: настройка удаляет прогресс, предупреждайте игроков в правилах.

Прочие рычаги

PalSpawnNumRate=0.800000
bIsUseBackupSaveData=True

PalSpawnNumRate (дефолт 1.0) снижает плотность диких палов в мире - меньше спавнящихся AI. 0.8 почти незаметно для игры, но разгружает регионы. bIsUseBackupSaveData на нагрузку не влияет, но защищает от потери мира при крэше - держите включённым.

Pterohost - игровой хостинг на Ryzen 9 с высоким бустом ядра и NVMe, где Palworld держит стабильный tickrate. Промокод 4START даёт -20% на первый заказ. Арендовать Palworld сервер

Железо: CPU-affinity, приоритет и NVMe

Частота ядра важнее числа ядер

Как разобрали выше, главный тик Palworld однопоточный. При выборе железа смотрите на single-thread performance и частоту буста, а не на суммарное число ядер. Восемь ядер Ryzen 9 на 5+ ГГц обслужат Palworld лучше, чем 32 медленных ядра серверного Xeon прошлых поколений.

NVMe обязателен

Palworld сохраняет мир целиком, синхронно, каждые 30 секунд по умолчанию. Чем больше баз и палов - тем крупнее Level.sav (на населённом сервере он вырастает до сотен мегабайт). На HDD запись такого файла занимает 10-15 секунд, и всё это время сервер стоит - игроки видят фриз и резиновые перемещения. SATA SSD снимает большую часть проблемы, NVMe убирает её полностью: сейв укладывается в доли секунды. Для сервера от 16 игроков NVMe - не роскошь, а обязательное условие.

CPU-affinity и приоритет

На выделенном железе с несколькими сервисами имеет смысл закрепить процесс Palworld за конкретными ядрами и повысить приоритет. Это уменьшает миграцию потока между ядрами и потерю кэша.

# Запустить Palworld на ядрах 0-5 с повышенным приоритетом
taskset -c 0-5 nice -n -5 ./PalServer.sh -useperfthreads -NoAsyncLoadingThread -UseMultithreadForDS port=8211 players=32

В systemd-unit то же самое задаётся декларативно, без обёрток:

[Service]
CPUAffinity=0 1 2 3 4 5
Nice=-5

CPUAffinity привязывает процесс к ядрам 0-5, Nice=-5 даёт ему приоритет над фоновыми задачами. Не выделяйте под сервер все ядра до последнего - оставьте одно-два системе и ядру, иначе автосейв и сеть начнут конкурировать с игровым тиком.

Плановые рестарты против утечек RAM

Palworld-сервер медленно накапливает потребление RAM за счёт фрагментации и не всегда освобождаемых объектов - за сутки-двое аптайма память может вырасти на несколько гигабайт без роста онлайна. Одновременно постепенно проседает tickrate. Лечится плановым рестартом раз в сутки.

Скрипт с предупреждением игроков и корректным сейвом через RCON:

#!/bin/bash
RCON="rcon -a 127.0.0.1:25575 -p strong-admin-pass"
$RCON "Broadcast Scheduled_restart_in_5_minutes"
sleep 240
$RCON "Broadcast Restart_in_60_seconds"
sleep 50
$RCON "Broadcast Saving_world"
$RCON "Save"
sleep 5
$RCON "Shutdown 5 Restarting_now"

Cron на 6 утра, когда онлайн минимальный:

0 6 * * * /home/palworld/restart.sh

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

Как измерять tickrate через REST API

Без цифр оптимизация - это гадание. Palworld отдаёт метрики через REST API. Включаем его в PalWorldSettings.ini:

RESTAPIEnabled=True
RESTAPIPort=8212

Метрики берутся с эндпоинта GET /v1/api/metrics с Basic-авторизацией (логин admin, пароль - AdminPassword из конфига):

curl -s -u admin:strong-admin-pass http://127.0.0.1:8212/v1/api/metrics | jq

Пример ответа:

{
  "serverfps": 29,
  "currentplayernum": 14,
  "serverframetime": 34.5,
  "maxplayernum": 32,
  "uptime": 43200
}

Ключевое поле - serverfps, это и есть фактический tickrate сервера. Ориентиры:

serverfpsСостояние
28-30Здоровый сервер, потолок ванильного движка - 30
22-27Ощутимая нагрузка, палы двигаются рывками, стоит снизить число баз
ниже 20Перегрузка, заметные лаги AI и физики, нужна оптимизация железа или конфига

Для непрерывного мониторинга опрашивайте эндпоинт по cron или скармливайте в Prometheus - падение serverfps в динамике покажет, когда именно (после какого события, при каком онлайне) сервер начинает захлёбываться. Подробный разбор эндпоинтов - в материале про Palworld REST API.

Оптимизация против лечения лагов

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

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

Pterohost - Palworld-хостинг с NVMe, DDoS-защитой L3/L4 и мониторингом tickrate из коробки. Промокод 4START даёт -20% на первый заказ. Заказать Palworld сервер

Часто задаваемые вопросы

Что реально дают флаги запуска Palworld -useperfthreads -NoAsyncLoadingThread -UseMultithreadForDS?

Они включают многопоточную обработку тиков и убирают отдельный поток асинхронной загрузки, который на сервере только мешает. По замерам сообщества набор поднимает устойчивый tickrate на 15-30% при онлайне 16+ игроков. Ставить нужно все три сразу - по отдельности эффект слабее.

Почему Palworld так грузит CPU даже при небольшом онлайне?

Unreal Engine 5 подгружает чанки в радиусе вокруг каждого игрока (radius load) и просчитывает AI всех палов на всех базах, даже когда владелец оффлайн. Пять баз с 15 работающими палами каждая - это 75 активных AI-агентов, которые тикают постоянно. Именно базы, а не число игроков, чаще всего упирают сервер в одно ядро.

Как измерить tickrate (serverfps) Palworld-сервера?

Включите REST API (RESTAPIEnabled=True, порт 8212) и опросите GET /v1/api/metrics с Basic-авторизацией admin/AdminPassword. В ответе поле serverfps - это фактический tickrate. Ванильный потолок 30, стабильные 28-30 = здоровый сервер, падение ниже 20 означает перегрузку CPU.

Обязателен ли NVMe для Palworld-сервера?

Да. Автосейв мира с большим числом баз на HDD занимает 10-15 секунд и фризит весь сервер на это время, потому что запись синхронна. На NVMe тот же сейв укладывается в доли секунды. SATA SSD - минимум, NVMe - правильный выбор для 16+ игроков.

Помогают ли плановые рестарты от лагов в Palworld?

Плановый рестарт лечит утечку RAM и деградацию tickrate, накопленную за сутки аптайма, но не устраняет причину лага. Если сервер начинает тормозить уже через час после старта - дело в перегрузке (слишком много баз, дропа или мало ядер), и рестарт лишь маскирует проблему. Диагностику разовых лагов смотрите в отдельной статье.