幻獸帕魯伺服器記憶體洩漏:越跑越卡的成因與定時重啟方案
《幻獸帕魯》伺服器端有已知的記憶體洩漏,記憶體只升不降、跑幾天就當機,加記憶體治不了本。唯一有效的是定時重啟:依記憶體大小多久一次、哪些設定在加速洩漏、怎麼做到不掉存檔。
一台《幻獸帕魯》專用伺服器的典型一生是這樣的:開服第一天很順,一週後開始偶爾頓一下,第二週半夜全員斷線一次,之後斷線越來越頻繁,直到某天早上發現存檔打不開。這不是設定沒調好,是遊戲伺服器端有一個已知的、至今沒修掉的記憶體洩漏:程式佔用的記憶體只升不降,跑得越久越接近實體上限,最後被系統砍掉。
這篇講清楚它怎麼發生、哪些設定在給它加速、為什麼光加記憶體沒用,以及唯一真正有效的辦法,依固定節奏重啟,該怎麼自動化。想先確認機器規格夠不夠,先看開服要什麼規格。
先確認是不是這個問題
三個訊號同時出現,基本上就是它:
| 訊號 | 怎麼看 |
|---|---|
| 記憶體佔用一直在漲,人下線了也不回落 | top / htop 裡看伺服器端程式的 RES;Windows 看工作管理員 |
| 卡頓隨運行時間加重,重啟後立刻恢復 | 重啟是最好的診斷:重啟就好 = 洩漏,重啟也不好 = 機器本身不夠 |
| 程式無聲消失,全員同時斷線 | Linux 上 dmesg 裡有 OOM killer 的記錄 |
最後一條最傷:程式被系統砍掉的那一刻可能正在寫存檔,寫到一半的 Level.sav 會在下次啟動時暴露出來。這就是為什麼洩漏問題要和備份一起看。
記憶體去哪了
帕魯伺服器端的記憶體由四塊組成,其中三塊只增不減:
- 基礎佔用。1.0 之後冷啟動就要 4 GB 上下,這是底。
- 線上玩家。每個人的視距載入與探索範圍,大約每人 1.5 GB。人下線後這一塊會回落一部分,但不是全部。
- 世界裡累積的東西。據點、建築、工作中的帕魯、地上的掉落物,玩家下線後它們照樣留在記憶體裡被模擬。這是佔大頭的一塊,而且只增不減:退坑的人不會把據點帶走。
- 洩漏殘差。引擎沒有回收乾淨的部分,隨運行時間線性增長。哪怕世界一動不動,這一塊也在漲。
前三塊決定了你需要多少記憶體,第四塊決定了你多久必須重啟一次。分清這兩件事,後面的取捨就很清楚。
1.0 讓這個問題比搶先體驗時期更重:海上據點帶來了新的游泳與飛行尋路計算,天空島和世界樹是額外的載入區域,重做後的襲擊一次生成的實體更多。以前 8 GB 撐得住的世界,1.0 之後要按 16 GB 起算。
哪些設定在給洩漏加速
四項設定直接對上洩漏速度,全都在 PalWorldSettings.ini 那一行裡(改法見世界設定詳解):
| 設定 | 預設 | 建議 | 為什麼 |
|---|---|---|---|
bEnableInvaderEnemy | True | False | 據點襲擊是公認最大的洩漏來源:一次襲擊生成大量 AI 實體和尋路網格,打退之後引擎回收不乾淨。關掉後同一世界的記憶體佔用大約減半 |
BaseCampWorkerMaxNum | 15 | 保持預設 | 每隻工作帕魯都在跑自己的行為模擬,據點多的伺服器把它調到 50 是最快把單核心吃滿的方式 |
DropItemAliveMaxHours | 1.0 | 0.5 | 地上無主掉落物的存活時長(小時)。縮短一半,實體回收得更快 |
AutoSaveSpan | 30 | 保持預設,最多放寬到 60 | 自動存檔間隔,單位是秒。間隔越短寫入越頻繁,硬碟慢的機器每次存檔都會頓一下;但別超過 60 秒,當機時丟的進度就是這個間隔 |
第一項值得單獨說。關掉 bEnableInvaderEnemy 只關掉腳本觸發的據點襲擊,野生帕魯路過據點打架照舊,PvP 不受影響。對經常離線的固定隊伍來說,襲擊本來就發生在沒人上線的時候,回來只看到一地廢墟,關掉它多數人不會覺得少了什麼,卻換來一半的記憶體餘量。
加記憶體為什麼治不了本
這是最常見的誤判。記憶體從 16 GB 加到 32 GB,得到的不是「不當機了」,是「當機從三天一次變成六天一次」。洩漏會填滿任何容量,只是時間問題。
加記憶體買到的是兩次重啟之間的間隔更長,這本身有價值,它決定了你能不能把重啟安排在凌晨而不是每四小時一次。但它不能取代重啟。
反過來,有幾件事不要做:
- 不要關掉
bIsUseBackupSaveData。存檔備份不是洩漏來源,關了它只會在當機那天少一條退路。 - 不要把
ServerReplicatePawnCullDistance調到 5000 以下。這是帕魯同步距離的官方下限,再低玩家看到的是站著不動的帕魯。 - 不要在同一台機器上跑兩個帕魯伺服器端。兩份洩漏疊在一起,OOM 來得更快。
多久重啟一次
依機器記憶體和是否開襲擊決定,下面是實際運作中站得住的區間:
| 機器記憶體 | 襲擊事件 | 重啟間隔 |
|---|---|---|
| 8 GB | 開著 | 每 1–2 小時 |
| 8 GB | 關掉 | 每 2–4 小時 |
| 16 GB 及以上 | 開著 | 每 2–4 小時 |
| 16 GB 及以上 | 關掉 | 每 4–6 小時 |
對固定隊伍的伺服器,實際上更實用的答案是:16 GB 以上、關掉襲擊、每天凌晨重啟一次。這個組合下一天之內洩漏漲不到危險線,而凌晨四點的重啟對絕大多數人是無感的。公開伺服器、全天有人的伺服器再考慮縮短到每幾小時一次。
判斷間隔夠不夠的方法很簡單:看重啟前一刻的記憶體佔用離實體上限還有多遠。餘量少於 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 只負責當機後拉起,它管不了記憶體爬升,兩者要一起用。
Windows 上思路完全一樣:PowerShell 裡用 Invoke-RestMethod 依序呼叫 announce 和 save,再 Stop-Process 掉 PalServer-Win64-Shipping 並重新拉起 PalServer.exe,然後交給「工作排程器」每天定時跑。
順手把更新也接進去
遊戲一更新,伺服器端不跟著更就全員進不去。既然每天都要停一次,把版本校驗放進重啟流程是零成本的:
# palworld.service 的 [Service] 段裡加一行
ExecStartPre=/usr/games/steamcmd +force_install_dir /home/palserver/palworld +login anonymous +app_update 2394010 validate +quit
每次啟動前先對一遍版本,有更新就順手裝上。代價是啟動多花一兩分鐘,換來的是「官方發版當天早上伺服器已經是新版本」。記得更新前那次備份要留好,存檔格式偶爾會跟著版本變。
常見問題
幻獸帕魯伺服器為什麼記憶體越用越多?
三個來源疊在一起:世界裡的據點、帕魯和掉落物在玩家下線後照樣留在記憶體裡被模擬,只增不減;引擎自身有回收不乾淨的已知洩漏;據點襲擊事件每次都會留下一批回收不掉的實體。前兩個決定了你需要多少記憶體,最後一個可以直接關掉。
關掉襲擊事件會失去什麼?
只失去腳本觸發的據點襲擊。野生帕魯的日常騷擾、PvP、Boss 都不受影響。換來的是同一個世界記憶體佔用大約減半。
幻獸帕魯伺服器多久重啟一次合適?
16 GB 以上且關掉襲擊的伺服器,每天凌晨一次就夠;8 GB 或開著襲擊的伺服器要縮短到每 2–4 小時。判據是重啟前一刻的記憶體離實體上限還剩多少,少於兩成就該縮短間隔。
加記憶體能解決幻獸帕魯伺服器當機嗎?
不能根治。洩漏會填滿任何容量,加記憶體只是把兩次當機的間隔拉長。它的價值是讓你能把重啟安排在凌晨而不是每幾小時一次,但重啟本身省不掉。
這件事在託管上是一個開關
上面整套方案的難點不在任何一步,在於它要長期無人看守地跑對:腳本要有人寫、密碼要有人管、cron 要有人盯、當機要有人半夜爬起來。寫完的第一週它是好的,三個月後沒人記得它還在不在。
KeepWorlds 的《幻獸帕魯》專用伺服器把這些收成了會員中心裡的幾項:每日定時重新啟動是一個開關加一個時刻,勾上「開啟每日定時重新啟動」選個凌晨的時間就完事;程式當機由系統自動拉起;存檔按固定間隔自動備份,每次備份前先透過介面強制存檔一次;襲擊事件、據點帕魯數這些設定在遊戲設定面板裡直接改,不用碰 ini。想弄清每一項設定的含義,世界設定詳解裡逐項寫了。
其他語言版本
不想自己維護?
選好遊戲與方案就能開伺服器,整機獨享,備份、遊戲更新與期限提醒都由我們盯著。
看看支援的遊戲