Palworld Руководство

Утечка памяти на сервере Palworld: автоматический перезапуск и мониторинг

Решение проблемы утечек памяти в Palworld на движке Unreal Engine 5: мониторинг потребления RSS и автоматический перезапуск через RCON по порогу памяти.

Утечка памяти на сервере Palworld: автоматический перезапуск и мониторинг

Выделенный сервер Palworld на движке Unreal Engine 5 страдает от постепенной деградации оперативной памяти. Из-за незавершённой очистки выгруженных из памяти объектов, физических тел сброшенного лута и расчёта путей палов (AI navigation) процесс PalServer-Linux-Test непрерывно наращивает потребление RAM на протяжении 8–24 часов работы.

Если администратор не вмешивается, потребление памяти достигает 100% от объёма VPS, после чего ядро Linux активирует OOM Killer и принудительно убивает процесс сигналом SIGKILL (код возврата 137). Это приводит к повреждению базы данных Level.sav и откату прогресса игроков. Данное руководство разбирает настройку скрипта-сторожа (watchdog), который отслеживает порог заполнения памяти и выполняет мягкий перезапуск через RCON до падения сервера.

Механика утечки: почему Palworld требует регулярного перезапуска#

В архитектуре Unreal Engine 5 многие подсистемы спавна и физики предметов не возвращают аллоцированные страницы памяти обратно операционной системе. При активной игре 10–15 человек сервер Palworld потребляет от 16 до 32 ГБ оперативной памяти уже через 12 часов после старта.

Проверьте реальный объём резидентной памяти (RSS), занятой процессом Palworld:

bash
ps -o pid,rss,%mem,command -C PalServer-Linux-Test

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

Проверьте, не убивал ли OOM Killer процесс Palworld ранее:

bash
dmesg -T | grep -E "(Out of memory|killed process.*PalServer)"

Корректная последовательность сохранения через RCON#

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

Для безопасной остановки подключитесь к RCON и выполните двухэтапную процедуру:

bash
rcon -a 127.0.0.1:25575 -p "ADMIN_PASSWORD" "Save"
rcon -a 127.0.0.1:25575 -p "ADMIN_PASSWORD" "Shutdown 60 Server_restarting_due_to_memory_maintenance"

Команда Save принудительно сбрасывает транзакции мира на диск, а Shutdown 60 выводит предупреждение на экраны игроков и корректно финализирует процесс через 60 секунд.

Создание скрипта-сторожа (Watchdog) по порогу RAM#

Вместо того чтобы перезапускать сервер вслепую по расписанию раз в сутки (что может прервать игру в разгар рейда), создайте интеллектуальный скрипт мониторинга. Он сработает только тогда, когда потребление RAM превысит безопасный порог (например, 85%).

Создайте скрипт /opt/scripts/palworld-watchdog.sh:

bash
cat << 'EOF' | sudo tee /opt/scripts/palworld-watchdog.sh
#!/usr/bin/env bash
set -euo pipefail

THRESHOLD=85
CURRENT_MEM=$(free | awk '/Mem:/ {printf("%d"), $3/$2 * 100}')
RCON_PASS="ADMIN_PASSWORD"

if [ "$CURRENT_MEM" -gt "$THRESHOLD" ]; then
    echo "Memory usage at ${CURRENT_MEM}% exceeds ${THRESHOLD}%. Triggering graceful restart."
    rcon -a 127.0.0.1:25575 -p "$RCON_PASS" "Broadcast Server_restarting_in_60s_Memory_cleanup" || true
    rcon -a 127.0.0.1:25575 -p "$RCON_PASS" "Save" || true
    rcon -a 127.0.0.1:25575 -p "$RCON_PASS" "Shutdown 60" || true
    sleep 70
    sudo systemctl restart palworld
else
    echo "Memory usage normal: ${CURRENT_MEM}%."
fi
EOF
sudo chmod +x /opt/scripts/palworld-watchdog.sh

Настройка таймера systemd для регулярной проверки#

Запускайте проверку скрипта-сторожа каждые 15 минут с помощью системного таймера systemd.

Создайте юнит службы:

bash
cat << 'EOF' | sudo tee /etc/systemd/system/palworld-watchdog.service
[Unit]
Description=Palworld Memory Watchdog
After=network.target

[Service]
Type=oneshot
ExecStart=/opt/scripts/palworld-watchdog.sh
User=root
EOF

Создайте юнит таймера:

bash
cat << 'EOF' | sudo tee /etc/systemd/system/palworld-watchdog.timer
[Unit]
Description=Run Palworld Memory Watchdog every 15 minutes

[Timer]
OnBootSec=10min
OnUnitActiveSec=15min
Persistent=true

[Install]
WantedBy=timers.target
EOF

Активируйте таймер:

bash
sudo systemctl daemon-reload
sudo systemctl enable --now palworld-watchdog.timer
systemctl list-timers palworld-watchdog.timer

Теперь, если в часы пикового онлайна игра начнет заполнять оперативную память, сервер автоматически предупредит игроков, сохранит мир и выполнит чистый перезапуск за 60 секунд до того, как операционная система успеет аварийно завершить процесс.

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

Источники#