空岛灵境

幻兽帕鲁服务器内存泄漏:越跑越卡的成因与定时重启方案

《幻兽帕鲁》服务端有已知的内存泄漏,内存只涨不降、跑几天就崩,加内存治不了本。唯一有效的是定时重启:多久一次、哪些设定在加速泄漏、怎么做到不丢存档。

一台《幻兽帕鲁》专用服务器的典型一生是这样的:开服第一天很顺,一周后开始偶尔卡一下,第二周半夜全员掉线一次,之后掉线越来越勤,直到某天早上发现存档打不开了。这不是配置没调好,是这个游戏的服务端有一个已知的、至今没有修掉的内存泄漏:进程占用的内存只涨不降,跑得越久越接近物理上限,最后被系统杀掉。

这篇讲清楚它是怎么发生的、哪些设定在给它加速、为什么光加内存没有用,以及唯一真正有效的办法——按固定节奏重启——该怎么自动化。想先确认自己的机器配置够不够,先看开服要什么配置。

先确认是不是这个问题

三个信号同时出现,基本就是它:

信号怎么看
内存占用一直在涨,人下线了也不回落top / htop 里看服务端进程的 RES;Windows 看任务管理器
卡顿随运行时间加重,重启后立刻恢复重启是最好的诊断:重启就好 = 泄漏,重启也不好 = 机器本身不够
进程无声消失,全员同时掉线Linux 上 dmesg 里有 OOM killer 的记录

中间那一条也是用来排除的:重启后没有任何改善就不是泄漏,要么机器本身不够,要么大家感觉到的根本不是服务端。从谁在卡一路问到服务端自己的帧率,顺序写在服务器卡:先分清是哪一种卡。

最后一条是最伤的一种:进程被系统杀掉的那一刻可能正在写存档,写到一半的 Level.sav 会在下次启动时暴露出来。这就是为什么泄漏问题要和备份一起看。

内存去哪了

帕鲁服务端的内存由四块组成,其中三块只增不减:

  1. 基础占用。服务端一启动就占着的部分,1.0 之后更多,这是底。
  2. 在线玩家。每个人的视距加载与探索范围。人下线后这一块会回落一部分,但不是全部。
  3. 世界里累积的东西。据点、建筑、工作中的帕鲁、地上的掉落物——玩家下线后它们照样留在内存里被模拟。这是占大头的一块,而且只增不减:退坑的人不会把据点带走。
  4. 泄漏残差。引擎没有回收干净的部分,随运行时间线性增长。哪怕世界一动不动,这一块也在涨。

前三块决定了你需要多少内存,第四块决定了你多久必须重启一次。分清这两件事,后面的取舍就很清楚了。

1.0 让这个问题比抢先体验时期更重:海上据点带来了新的游泳与飞行寻路计算,天空岛和世界树是额外的加载区域,重做后的袭击一次生成的实体更多。同一个世界,1.0 之后需要的内存比以前明显更多。

哪些设定在给泄漏加速

四项设定直接对上泄漏速度,全都在 PalWorldSettings.ini 那一行里(改法见世界设定详解):

设定默认建议为什么
bEnableInvaderEnemyTrueFalse据点袭击是公认最大的泄漏源:一次袭击生成大量 AI 实体和寻路网格,打退之后引擎回收不干净。关掉后同一世界的内存占用大约减半
BaseCampWorkerMaxNum15保持默认每只工作帕鲁都在跑自己的行为模拟,据点多的服把它调到 50 是最快把单核吃满的方式
DropItemAliveMaxHours1.00.5地上无主掉落物的存活时长(小时)。缩短一半,实体回收得更快
AutoSaveSpan30保持默认,最多放宽到 60自动存档间隔,单位是秒。间隔越短写盘越频繁,磁盘慢的机器每次存档都会顿一下;但别超过 60 秒——崩溃时丢的进度就是这个间隔

第一项值得单独说。关掉 bEnableInvaderEnemy 只关掉脚本触发的据点袭击,野生帕鲁路过据点打架照旧,PvP 不受影响。对经常离线的固定队伍来说,袭击本来就发生在没人在线的时候,回来只看到一地废墟——关掉它多数人不会觉得少了什么,却换来一半的内存余量。

加内存为什么治不了本

这是最常见的误判。内存加倍,得到的不是「不崩了」,是「崩溃从三天一次变成六天一次」。泄漏会填满任何容量,只是时间问题。

加内存买到的是两次重启之间的间隔更长,这本身有价值——它决定了你能不能把重启安排在凌晨而不是每四小时一次。但它不能替代重启。

反过来,有几件事不要做:

  • 不要关掉 bIsUseBackupSaveData。存档备份不是泄漏来源,关了它只会在崩溃那天少一条退路。
  • 不要把 ServerReplicatePawnCullDistance 调到 5000 以下。这是帕鲁同步距离的官方下限,再低玩家看到的是站着不动的帕鲁。
  • 不要在同一台机器上跑两个帕鲁服务端。两份泄漏叠在一起,OOM 来得更快。

多久重启一次

没有一个能从配置单上直接读出来的间隔。它取决于你的世界吃掉余量有多快,而这又看建了多少东西、袭击开没开、是不是全天都有人在线。先从每天一次开始,再按实测调整:

重启前一刻怎么做
余量还很充足每天凌晨一次就够
剩下不到两成先关掉袭击,再缩短间隔
两次重启之间进程被杀过马上缩短间隔,并确认最近一次存档能正常读取

对固定队伍的服,实用的答案很简单:关掉袭击、每天凌晨重启一次。凌晨四点的重启对绝大多数人是不可见的。公共服、全天有人的服再考虑缩短到每几小时一次。

判断间隔够不够,看重启前一刻的内存占用离上限还有多远。余量少于 20% 就该关掉袭击或缩短间隔;加内存也能把间隔拉开。

怎么做到不丢存档的自动重启

直接 kill 掉进程等于每天制造一次崩溃。正确的重启是四步:提前发全服公告 → 强制存档 → 停止 → 启动,全部通过官方 REST 接口完成(RCON 已被官方弃用,别再往它上面写脚本)。

先在 PalWorldSettings.ini 里开接口,并且只监听本机:

RESTAPIEnabled=True
RESTAPIPort=8212
AdminPassword="一个足够长的密码"

接口用 HTTP Basic 认证,用户名固定是 admin,密码就是 AdminPassword。官方文档明确说过它不设计为直接暴露公网,所以防火墙上不要放行 8212。

Linux 上一份能直接用的脚本:

#!/bin/bash
# /home/palserver/restart.sh —— 公告、存档、重启
PW='一个足够长的密码'
API='http://127.0.0.1:8212/v1/api'

curl -s -u "admin:$PW" -X POST "$API/announce" \
     -H 'Content-Type: application/json' \
     -d '{"message":"Server restarts in 5 minutes for maintenance"}'
sleep 240
curl -s -u "admin:$PW" -X POST "$API/announce" \
     -H 'Content-Type: application/json' \
     -d '{"message":"Saving and restarting in 60 seconds"}'
sleep 60
curl -s -u "admin:$PW" -X POST "$API/save"
sleep 10
sudo systemctl restart palworld

挂到 cron,每天凌晨四点:

0 4 * * * /home/palserver/restart.sh >> /home/palserver/restart.log 2>&1

前提是服务端已经按开服教程注册成了 systemd 服务。Restart=on-failure 只负责崩溃后拉起,管不了内存爬升;开机自启、崩溃自动拉起、定时重启这三件事各挡一种状况、怎么配齐,见24 小时不关机:开机自启、崩溃自动重启、定时重启。

Windows 上思路完全一样:PowerShell 里用 Invoke-RestMethod 依次调 announce 和 save,再 Stop-Process 掉 PalServer-Win64-Shipping 并重新拉起 PalServer.exe,然后交给「任务计划程序」每天定时跑。

上面那套脚本,在托管上是哪一项

公告 → 强制存档 → 停 → 起这四步,空岛灵境 的《幻兽帕鲁》专用服务器会在你定的时刻代你走一遍。脚本、管理密码、cron 都在我们这一侧,会员中心里它就是每日定时重启这一项,要填的只有时刻。时间快到时服务器先在游戏里发全服公告、走完倒计时、强制存档一次,之后才优雅停机并重新拉起。

顺手把更新也接进去

游戏一更新,服务端不跟着更就全员进不去;既然每天都要停一次,在 systemd 单元里加一行 ExecStartPre 跑 SteamCMD、让它每次启动前先对一遍版本,几乎是零成本。但这一行不会在更新前备份,它和 TimeoutStartSec 的坑、以及官方发版当天的完整顺序,见服务器更新教程:版本不一致与不掉存档的顺序。

常见问题

帕鲁服务器为什么内存越用越多?

三个来源叠在一起:世界里的据点、帕鲁和掉落物在玩家下线后照样留在内存里被模拟,只增不减;引擎自身有回收不干净的已知泄漏;据点袭击事件每次都会留下一批回收不掉的实体。前两个决定了你需要多少内存,最后一个可以直接关掉。

关掉袭击事件会失去什么?

只失去脚本触发的据点袭击。野生帕鲁的日常骚扰、PvP、Boss 都不受影响。换来的是同一个世界内存占用大约减半。

帕鲁服务器多久重启一次合适?

固定队伍、关掉袭击的服,从每天凌晨一次开始。判据是重启前一刻还剩多少内存余量:少于两成的话,袭击还开着就先关掉,再缩短间隔。

加内存能解决帕鲁服务器崩溃吗?

不能根治。泄漏会填满任何容量,加内存只是把两次崩溃的间隔拉长。它的价值是让你能把重启安排在凌晨而不是每几小时一次,但重启本身省不掉。

这件事在托管上是一个开关

上面整套方案的难点不在任何一步,在于它要长期无人值守地跑对:脚本要有人写、密码要有人管、cron 要有人盯、崩溃要有人半夜爬起来。写完的第一周它是好的,三个月后没人记得它还在不在。

空岛灵境 的《幻兽帕鲁》专用服务器把这些收成了会员中心里的几项:每日定时重启是一个开关加一个时刻,勾上「开启每日定时重启」选个凌晨的时间就完事;进程崩溃由系统自动拉起;存档按固定间隔自动备份,每次备份前先通过接口强制存档一次;袭击事件、据点帕鲁数这些设定在游戏配置面板里直接改,不用碰 ini。想弄清每一项设定的含义,世界设定详解里逐项写了。

不想自己维护?

选好游戏和套餐就能开服,机器独享,备份、版本更新和到期提醒都由我们盯着。

查看套餐