幻兽帕鲁服务器内存泄漏:越跑越卡的成因与定时重启方案
《幻兽帕鲁》服务端有已知的内存泄漏,内存只涨不降、跑几天就崩,加内存治不了本。唯一有效的是定时重启:多久一次、哪些设定在加速泄漏、怎么做到不丢存档。
一台《幻兽帕鲁》专用服务器的典型一生是这样的:开服第一天很顺,一周后开始偶尔卡一下,第二周半夜全员掉线一次,之后掉线越来越勤,直到某天早上发现存档打不开了。这不是配置没调好,是这个游戏的服务端有一个已知的、至今没有修掉的内存泄漏:进程占用的内存只涨不降,跑得越久越接近物理上限,最后被系统杀掉。
这篇讲清楚它是怎么发生的、哪些设定在给它加速、为什么光加内存没有用,以及唯一真正有效的办法——按固定节奏重启——该怎么自动化。想先确认自己的机器配置够不够,先看开服要什么配置。
先确认是不是这个问题
三个信号同时出现,基本就是它:
| 信号 | 怎么看 |
|---|---|
| 内存占用一直在涨,人下线了也不回落 | top / htop 里看服务端进程的 RES;Windows 看任务管理器 |
| 卡顿随运行时间加重,重启后立刻恢复 | 重启是最好的诊断:重启就好 = 泄漏,重启也不好 = 机器本身不够 |
| 进程无声消失,全员同时掉线 | Linux 上 dmesg 里有 OOM killer 的记录 |
中间那一条也是用来排除的:重启后没有任何改善就不是泄漏,要么机器本身不够,要么大家感觉到的根本不是服务端。从谁在卡一路问到服务端自己的帧率,顺序写在服务器卡:先分清是哪一种卡。
最后一条是最伤的一种:进程被系统杀掉的那一刻可能正在写存档,写到一半的 Level.sav 会在下次启动时暴露出来。这就是为什么泄漏问题要和备份一起看。
内存去哪了
帕鲁服务端的内存由四块组成,其中三块只增不减:
- 基础占用。服务端一启动就占着的部分,1.0 之后更多,这是底。
- 在线玩家。每个人的视距加载与探索范围。人下线后这一块会回落一部分,但不是全部。
- 世界里累积的东西。据点、建筑、工作中的帕鲁、地上的掉落物——玩家下线后它们照样留在内存里被模拟。这是占大头的一块,而且只增不减:退坑的人不会把据点带走。
- 泄漏残差。引擎没有回收干净的部分,随运行时间线性增长。哪怕世界一动不动,这一块也在涨。
前三块决定了你需要多少内存,第四块决定了你多久必须重启一次。分清这两件事,后面的取舍就很清楚了。
1.0 让这个问题比抢先体验时期更重:海上据点带来了新的游泳与飞行寻路计算,天空岛和世界树是额外的加载区域,重做后的袭击一次生成的实体更多。同一个世界,1.0 之后需要的内存比以前明显更多。
哪些设定在给泄漏加速
四项设定直接对上泄漏速度,全都在 PalWorldSettings.ini 那一行里(改法见世界设定详解):
| 设定 | 默认 | 建议 | 为什么 |
|---|---|---|---|
bEnableInvaderEnemy | True | False | 据点袭击是公认最大的泄漏源:一次袭击生成大量 AI 实体和寻路网格,打退之后引擎回收不干净。关掉后同一世界的内存占用大约减半 |
BaseCampWorkerMaxNum | 15 | 保持默认 | 每只工作帕鲁都在跑自己的行为模拟,据点多的服把它调到 50 是最快把单核吃满的方式 |
DropItemAliveMaxHours | 1.0 | 0.5 | 地上无主掉落物的存活时长(小时)。缩短一半,实体回收得更快 |
AutoSaveSpan | 30 | 保持默认,最多放宽到 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。想弄清每一项设定的含义,世界设定详解里逐项写了。