Minecraft 伺服器優化指南(適用 1.16+)

注意事項

本篇優化指南僅供參考,實際設定需要依照各伺服器做適當的調整,才能完美達到優化與遊玩體驗最佳化,本人並非專業的伺服器架設者、相關研究人員,指南上可能會有些錯誤,歡迎聯絡我指正問題 >w<
以下的指南適用於插件伺服器,對於原版的官方伺服器(Vanilia)將不適用。

核心的選擇

隨著高版本的 Minecraft 伺服器所使用的資源越來越多,但是官方伺服器的優化並未有效提升,選擇一款優化的核心將會是一項重點,在這裡將會建議使用 Paper 或是其分叉的核心(EX: Purpur)。他們之中的差異又是如何?

Paper 作為目前插件伺服器最多人使用的核心,擁有適當的優化並且改善了眾多原版的漏洞(特性),以及一個大型的社群,他幾乎適用於所有的伺服器當中,衝突性相對也較小。
PufferFish 作為 Paper 的分支,提供了更多的優化設定與調整,如果想選擇更多的優化可以選擇此。
Purpur 作為 Paper 的分支核心,並結合了 Pufferfish,最主要提供了非常多的遊戲設定可做調整,更改許多的遊戲機制。

Paper:https://papermc.io
Pufferfish:https://github.com/pufferfish-gg/Pufferfish
Purpur:https://purpurmc.org

優化前我應該了解什麼

市面上宣稱的優化插件,並沒有太大的實際效用,甚至是反向的讓伺服器變得更卡,因為需要會有更多的事件需要處理,例如說:LaggRemover,所以架設伺服器時應該避免安裝這類型的插件。

優化不是單單的參照指南上的設定進行更改,部分設定可能犧牲到了遊玩的體驗,應該要根據伺服器做一個適當的更改,這也是我一直所強調的,優化是個長遠的路要走,而不是設定完就完美,隨著時間的推移,伺服器的負擔相對會變重,這時又需要對伺服器進行一次的優化作業,優化應要隨著時間的更動而有所改變。

由於許多的優化設定涉及到了許多原版的遊戲玩法,在設定前應該先了解這些機制,避免影響遊戲體驗過大,但也不用過度擔心,在指南中我會粗略的介紹這些機制,但如果想要詳細的了解這些細部的資訊,可以至官方 wiki 查詢相關資料,我會先透過各個相關的類型進行編寫,然後才會將其他無法分類的依照各檔案進行編寫,如此一來應該能更方便的設定。

地圖生成

Minecraft 伺服器地圖生成是個很看重效能處理程序,然而這是生存伺服器會遇到的事情,但是可以利用預先生成地圖來解決這項問題,透過預先跑圖,玩家進入到已經生成的地圖中,所使用的資源將會大幅度的減少,透過 Chunky 這款插件就能來完成預先生成地圖的功能,建議可以先預先生成個1萬格左右的距離,當然也能夠透過邊界的限縮,限制地圖的大小,避免一直不斷地讓玩家去生成新區塊,但也請記得預先生成地圖會占用一定大小的儲存空間,請確認好主機有空間可以存放。

記得生成之後的區塊未來更新伺服器版本,地圖不會跟著更新喔,至於你又想怎讓玩家覺得有新地形,這就交給你去想了喔。

區塊設置

在看下面的設定之前,先讓我們來了解關於區塊的一些小知識 simulation-distance view-distance 模擬距離與視野距離的差異。

simulation-distance(模擬距離):這是代表玩家附近應要有多少的區塊處於活躍的狀態。
view-distance(視野距離):這是代表玩家能看到多遠的距離,但是超過模擬區塊的區塊不處於活躍的狀態。

模擬距離是對於伺服器資源有著極大的負擔,因此應該根據伺服器進行減少,降低資源的使用,以原版的 minecraft 而言,預設的距離設定為 10,網路上的眾多紅石設施、農場設施大多是以此基準建設,所以這對於生存伺服器調整並不是一個好選擇,但是如果是對於一些副本RPG或是小遊戲伺服器會是一個好選擇,但是不建議調整得過低,因為可能會讓玩家覺得活動的區塊過少導致一些遊戲上體驗的影響。

視野距離能讓玩家看得更遠的地形,但是該區塊將不會處理大多事件(例如:植物的生長、熔爐運作),而消耗的性能比模擬距離減少需多,但是會消耗較多的記憶體使用量(RAM),提高時應注意記憶體是否充足。

載入區塊的公式:[(距離+2)*2+1]^2

server.properties

simulation-distance

模擬距離,以玩家為中心的區塊將會載入並活躍執行的區塊。

  • 預設值:10
  • 推薦值:10(保持原版玩法)

view-distance

視野距離,以玩家為中心的區塊將會載入但不活躍的區塊,也就是只會載入地形。

調整時的注意,視野距離應要大於或等於模擬距離,如果不這麼做,如果沒有大於模擬距離,實際的模擬距離將會是視野距離,因此就會受到限制。

儘管視野距離相比模擬距離消耗的資源來的少,但一旦將數值調整過高依舊會造成伺服器的一定資源負擔,在設定時請自行參考自己的伺服器狀況。

  • 預設值:10
  • 推薦值:10(保持原版玩法)

spigot.yml

view-distance

將此保持預設值,如果變更,它將覆蓋 server.properties 的值,因此為了保持設定方便,無須變更。

生物設置

在生物設置這部分的優化設定前,先讓我們了解Minecraft的生物機制,先了解才不會因為設定過多導致問題,我相信各個伺服器還是希望以盡量跟原版玩法一致。

以玩家為中心
0~24格 生物不會生成,生物會正常移動
24~32格 生物會在此生成,也會在此正常移動
32~128格 生物會在此生成,但不會在此正常移動
128格外 生物會直接消失(當然不包含命名生物)

bukkit.yml

spawn-limits

這個設定是指整個伺服器的生物上限,生物的生成與生物的運算算是伺服器需求較大資源的事件之一。但應該設定的得宜,整個生物上限的算式會是[玩家數量]*[生物上限],但由於限制問題會導致分配不均,應在 paper.ymlper-player-mob-spawn 設定為 true 屆時生物將會分布較平均。

類型生物種類
monster烈焰使者、洞穴蜘蛛、苦力怕、沉屍、遠古守衛者、終界龍、終界使者、終界蟎、喚魔者、地獄幽靈、巨人、深海守衛、豬布獸、屍殼、幻術師、岩漿史萊姆、夜魅、豬布林、豬布林蠻兵、劫毀獸、掠奪者、界伏蚌、蠹魚、骷髏、史萊姆、蜘蛛、流浪者、惱鬼、衛道士、女巫、凋靈、凋靈骷髏、殭屍殭屍、殭屍、殭屍村民、殭屍化豬布林
animals
creature
蜜蜂、貓、雞、牛、驢、狐狸、山羊、馬、駱駝、騾、哞菇、豹貓、熊貓、鸚鵡、豬、北極熊、兔子、羊、骷髏馬、熾足獸、商人駱駝、海龜、流浪商人、狼、殭屍馬
ambient蝙蝠
water-animals
water_creature
魷魚和海豚
water-ambient鱈魚、河豚、鮭魚、熱帶魚
water-underground-creature
underground_water_creature
螢光魷魚
axolotl六角恐龍(蠑螈、墨西哥蠑螈)
預設值:
spawn-limits:
  monsters: 70
  animals: 10
  water-animals: 5
  water-ambient: 20
  water-underground-creature: 5
  axolotls: 5
  ambient: 15
推薦值:
spawn-limits:
  monsters: 30
  animals: 10
  water-animals: 3
  water-ambient: 5
  water-underground-creature: 5
  axolotls: 5
  ambient: 1

ticks-per

此設定將指每次生物嘗試生成時的間隔(以 tick 為單位),可以藉由此來減少生物生成所運算的性能,但不要設置的過高,否則會導致每次生成的時間很長,導致類似沒有生物一樣,但部分生物是可以拉長的,像是水或是環境生物,這些是大多玩家較為不去理會的生物。

預設值:
ticks-per:
  animal-spawns: 400
  monster-spawns: 1
  water-spawns: 1
  water-ambient-spawns: 1
  water-underground-creature-spawns: 1
  axolotl-spawns: 1
  ambient-spawns: 1
  autosave: 6000
建議值:
ticks-per:
  animal-spawns: 200
  monster-spawns: 10
  water-spawns: 400
  water-ambient-spawns: 400
  water-underground-creature-spawns: 400
  axolotl-spawns: 400
  ambient-spawns: 400
  autosave: 6000

spigot.yml

max-tick-time

在伺服器到下一個任務之前實體操作可以消耗的計算時間。

  • 預設:50
  • 建議:1000(禁用)

mob-spawn-range

此設定指的是生物距離玩家的生成範圍(以區塊 chunk 為單位),設定時請將數值小於或等於視野距離,並且不高於生物強制消失範圍(128格)。

  • 預設:8
  • 建議:6

entity-activation-range

這個設置將會影響到實體與玩家的多遠距離才會動作,也就是距離玩家多近實體才會運動,否則就會是無 AI 的狀態,謹慎設置這將有可能會影響到許多設備的運作,例如:鐵人塔。

預設值:
    entity-activation-range:
      animals: 32
      monsters: 32
      raiders: 48
      misc: 16
      water: 16
      villagers: 32
      flying-monsters: 32
建議值:
    entity-activation-range:
      animals: 16
      monsters: 24
      raiders: 48
      misc: 16
      water: 16
      villagers: 32
      flying-monsters: 32

tick-inactive-villagers

此設定將允許控制村民是否在激活範圍之外被激活,關閉與正常村民一樣進行,僅是影響到激活範圍。雖然禁用功能有助於性能,但是可能會導致部分問題,例如說鐵人塔與村民補貨。

  • 預設:true
  • 建議:true(保持原版)

nerf-spawner-mobs

關閉將讓生怪磚所生成的生物沒有 AI,也就是不會主動的移動與做任何事情,通常生怪磚會被玩家改裝為刷怪塔,沒有必要讓生物有 AI 做攻擊或是主動的移動。

  • 預設:false
  • 建議:true

paper.yml

despawn-ranges

這將調整實體消失的範圍(以區塊 chunk 為單位),降低數值可以更快地清除遠離玩家的實體。您應該保持軟範圍為30並將硬範圍調整為比您的實際模擬距離大一點,因此當玩家剛剛超過正在加載的塊點時,生物不會立即消失。當一個實體超出硬範圍時,它會立即消失。在軟硬範圍之間時,它會有隨機消失的機會。你的硬範圍應該大於你的軟範圍。應該根據您的視距進行調整(模擬距離*16)+8。這部分解釋了玩家訪問它們後尚未卸載的塊。

預設值:
    despawn-ranges:
      monster:
        soft: 32
        hard: 128
      creature:
        soft: 32
        hard: 128
      ambient:
        soft: 32
        hard: 128
      axolotls:
        soft: 32
        hard: 128
      underground_water_creature:
        soft: 32
        hard: 128
      water_creature:
        soft: 32
        hard: 128
      water_ambient:
        soft: 32
        hard: 64
      misc:
        soft: 32
        hard: 128

per-player-mob-spawns

這將可以為生物的生成平均的分散在玩家附近,而不是因為一個設施導致所有生物集中生成在某個區域內,因而達到上限限制其他區域都無法生成生物,這應該與 bukkit.ymlspawn-limits 兩者做互相制衡設置。

  • 預設:true
  • 建議:true

max-entity-collisions

此設定會覆蓋 spigot.yml 的同名設置,這會影響到生物每次推擠可以推擠多少生物,設為 0 時,就不會有推擠了,另外要注意的是,如果 gamerule 的 maxEntityCramming 超過此配置的數值,將會讓這個設定沒有任何作用。

  • 預設:8
  • 建議:4

update-pathfinding-on-block-update

關閉此將減少生物所消耗的尋路資源,這的確會讓生物有些遲鈍他們會每 5 ticks(0.25 秒)被動更新他們的路徑。

  • 預設:true
  • 建議:true

fix-climbing-bypassing-cramming-rule

將此設定開啟會使攀爬類的生物(蜘蛛)不會受到活塞的推動而影響攀爬,也可以防止大量生物擠在一個小空間內。

  • 預設:false
  • 建議:true

armor-stands-do-collision-entity-lookups

將此關閉後可以讓盔甲架停止碰撞。

  • 預設:true
  • 建議:false

tick-rates

這會影響到指定行為和感應在固定 tick 的頻率,就以 acquirepoi 是村民最重要的行為,如果村民無法正常尋路,請嘗試降低。

如果啟用了 pufferfish.yml 的 DAB 建議不要更改數值,保持初始值。

預設值:
    tick-rates:
      sensor:
        villager:
          secondarypoisensor: 40
      behavior:
        villager:
          validatenearbypoi: -1
建議值:
    tick-rates:
      sensor:
        villager:
          secondarypoisensor: 80
      behavior:
        villager:
          validatenearbypoi: 60

pufferfish.yml

dab

DAB(Dynamic Activation of Brain 大腦動態激活)這會根據實體與玩家的距離來動態激活實體動作,但 DAB 也不是完全利用距離遠處理,而是根據 activation-dist-mod 影響的計算結果,減少實體被激活的數量。我不會很建議啟動它,尤其是你想保持農場機器正常情況下。

  • 預設:true
  • 建議:false(如果你想盡可能地保留原版玩法)

max-tick-freq

定義距離玩家最遠的實體將被激活的最慢時間。增加此值可能會提高遠離視野的實體的性能,但可能會破壞紅石農場設備或大大削弱掠奪者軍團的行為。如果啟用 DAB 會破壞農場設施,請嘗試減小此值。

  • 預設:20
  • 建議:20

activation-dist-mod

控制生物被激活的頻率。降低此值將激活更靠近玩家的 DAB,提高 DAB 的性能增益,但會影響實體與周圍環境的交互方式,並可能破壞農場設施。如果啟用 DAB 會破壞農場設施,請嘗試增加此值。

  • 預設:8
  • 建議:8

purpur.yml

aggressive-towards-villager-when-lagging

啟用後如果 TPS 低於 purpur.ymllagging-threshold 值,那殭屍將不會去瞄準村民攻擊,降低運算量。

  • 預設:true
  • 建議:false

entities-can-use-portals

此選項可以禁用除玩家之外的所有實體的傳送門使用。這可以防止實體通過更改在主線程上處理的世界來加載塊。但這具有實體無法通過傳送門的缺點。

  • 預設:true
  • 建議:true(如果你想盡可能地保留原版玩法)

villager.brain-ticks

此選項可以設置村民大腦(工作和 poi)的頻率(以 tick 為單位)。高於3已確認會使村民不一致/錯誤。

  • 預設:1
  • 建議:2

雜項

server.properties

allow-flight

為甚麼該開啟飛行,因為原版的偵測機制很容易誤判飛行,有時候站在船上、騎馬都會被認為飛行,因而將玩家踢出伺服器,然而這個偵測其實沒必要關閉,多少能減輕點負擔。

  • 預設:false
  • 建議:true

spigot.yml

merge-radius

透過此設定可以決定多少間隔的物品或經驗球會合併在一起,這樣能減少在地面上的實體計算,但也不該設置的過高,可能會破壞一些農場設施的正常運作。他只會在物品或經驗球掉落時計算,不會在間隔一段時間才合併,因此不必擔心合併時的計算影響效能。

預設值:
    merge-radius:
      item: 2.5
      exp: 3.0
建議值:
    merge-radius:
      item: 3.0
      exp: 4.0

paper.yml

alt-item-despawn-rate

透過此設定可以決定部分物品掉落在地面為吸取的消失的時間,部分物品沒有必要可以將它縮短,例如竹子。(以 tick 為單位)

預設值:
    alt-item-despawn-rate:
      enabled: false
      items:
        cobblestone: 300

redstone-implementation

利用更快的紅石系統取代原有的紅石系統,透過此減少了區塊更新,也減少了伺服器所需要計算量,但如果引入非原版系統可能會導致高技術性紅石設施會有些問題,但提高的性能遠遠超過那些小問題,除非是生電紅石專門服。這還有可能修復部分由CraftBukkit所造成的紅石問題。

  • 預設:vanilla
  • 建議:alternate-current

mob-spawner-tick-rate

這可以設定生怪磚生成生物的頻率,設定過高會導致效率過低。

  • 預設:1
  • 建議:2

optimize-explosions

開啟此選項將能更改演算法來優化 TNT 所造成的爆炸的事件,通常影響不會過大。

  • 預設:false
  • 建議:true

grass-spread-tick-rate

調整此來設定草地、菌絲土等會傳播的方塊頻率,通常可以提高一些,代價是大片土地需要花更長的時間去生長完全部。

  • 預設:1
  • 建議:4

non-player-arrow-despawn-rate

設定由非玩家的所投出的實體,例如箭矢、雪球的消失時間,因為玩家是不能撿起這些東西的,所以通常影響不大。

  • 預設:-1
  • 建議:100

creative-arrow-despawn-rate

同上意思,但是是創造模式的玩家所投出的實體。

  • 預設:-1
  • 建議:100

JVM Flags

使用優化的 JVM Flags 將有效優化伺服器,在這裡可以參考 Aikar 所製作的指南 (https://aikar.co/mcflags.html)這邊我整理了以下幾點重點出來。

  • 如果可以參數最好 Xms=Xmx,這就能讓 JVM 完全的控制所分配之 RAM
  • Pterodactyl Panel 使用者不要設置 Xms=Xmx,Xms 應調低點,否則可能會導致 Out Of Memory 進而導致的停機

避免使用的插件

不要使用市面上絕大多數的優化插件,通常這些插件並不是幫助伺服器而是造成更大的負擔,例如說 ClearLagg,這僅僅是在增加伺服器處理更多的事件,使用原版的設定不好嗎?

MobStacker 生物堆疊插件,雖然這塊似乎在台灣伺服器沒什麼出現,大多都是在國外伺服器,這類的插件聽起來是個很好的想法,但實際上他僅是讓伺服器不斷的生成生物,是否都忘了生成生物也會消耗資源,且堆疊後就不會讓生物的數量達到伺服器所設置的上限。

Lagassist 很好,但不要把它當作優化插件,應該只把它的分析功能啟動,而不是使用它的優化功能。

不要使用來路不明的插件,尤其是 BlackSpigot、DirectLeak 等網站所提供的付費洩漏插件,無法保證他是否會在插件內安裝後門的病毒插件,不要因為省了幾百元或幾千元,喪失了整個伺服器的安全,向作者購買也是一種尊重,如果能最好選擇活躍的開發人員所開發的插件。

一些關於伺服器的迷思

分配越多的 RAM 不代表獲得更好的效能
由於 Java 的特性,給越多資源只是讓它堆更多垃圾也會導致部分的卡頓,這不是一個好方法。

不應該只從 TPS 評斷伺服器的順暢度
由於大多數的 TPS 數值都是顯示平均值,會有浮動的現象,當突然的 TPS 急降一秒依舊會讓玩家感受到卡頓,更好的方式應該是看 MSPT 的數值,應要保持在 50 以下才是順暢。

大量的記憶體使用可能是 Memory Leak 但也不一定是
這種時候最好利用 Paper 或 Spark 的 Heap Dump 輸出數據並使用 Eclipse Memory Analyzer 或其他類似工具來分析問題的所在。

CPU 的頻率不直接代表 CPU 的性能
這裡可以參考 兆赫神話,頻率不會是影響 CPU 性能的單一因素,還需要牽扯到 CPU 的其他因素。

伺服器核心越多不代表伺服器可以使用那麼多,適量給予才是王道
由於 Minecraft 伺服器從以前一直以來存在的問題,大多數事件都僅會在單一線程上運行,而其他線程並不太會有很大的運作,但如果有安裝插件或其他額外的東西,我會建議可以提供約4個線程使用,會讓伺服器有更好的效能,但也不需要給到一台伺服器16核心,除非是跑圖否則基本上根本不可能使用那麼多。
當伺服器玩家達到50以上甚至100以上,那就應該考慮如何利用分流來紓解壓力,再好的電腦配備高版本依舊無法撐上那麼多玩家在一台伺服器中,考慮用分流吧。

特別感謝

@ming-yue 介紹了關於伺服器的迷思與部分生成建議

參考資料

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *