Optimalizace Minecraft serveru

Optimalizace Minecraft serveru
Na našem blogu jsme již psali, jak vytvořit svůj server Minecraft, ale od té doby uběhlo 5 let a mnoho se změnilo. Sdílíme s vámi aktuální způsoby, jak vytvářet a optimalizovat serverovou část této populární hry.

Během své 9leté historie (pokud počítáme od data vydání) si Minecraft získal úžasné množství fanoušků i odpůrců jak mezi běžnými hráči, tak mezi geeky. Jednoduchý koncept světa z kostek se proměnil z obyčejné zábavy v univerzální prostředí pro komunikaci a tvorbu různých objektů z reálného světa.

Kromě stavění je ve hře možnost vytvářet logické obvody, které umožňují realizaci plnohodnotných algoritmů uvnitř Minecraftu. Na YouTube je spousta velmi působivých videí, kde lidé, přičemž vynaložili obrovské množství sil a strávili nespočet hodin, vytvořili kopii nějakého elektronického zařízení nebo podrobně postavili kopii existujících a fiktivních architektonických děl. Všechno je omezeno pouze fantazí hráče a možnostmi herního univerza.

Přehrát video

Ale nebudeme dále hovořit o tom, co hráči vytvářejí, a zaměříme se na serverovou část aplikace a osvětlíme problémy (někdy velmi složité), které mohou nastat při zátěži. Hned na začátek si ujasníme, že se budeme bavit pouze o Java Edition.

Typy serverů

Nejjednodušší variantou je server integrovaný do klienta hry. Vytvořili jste svět, stiskli jste jedno tlačítko a server je nyní dostupný v lokální síti. Taková varianta nevydrží žádnou vážnou zátěž, proto se o ní nebavíme.

Vanilla

Společnost Mojang Studios distribuuje serverovou část hry jako Java aplikaci zdarma na oficiálních stránkách. To umožňuje vytvořit si vlastní vyhrazený server a osobní svět, který je přístupný pro připojení z jakéhokoli místa na planetě. Pro ty, kteří to dělají poprvé, je k dispozici skvělý tutoriál, dostupný v příslušné herní Wiki.

Tento přístup má jeden vážný nedostatek, a to je nedostatek možností pro snadné připojení pluginů, které by rozšiřovaly funkce serveru a umožnily automatizaci mnoha procesů a optimalizaci výkonu. Kromě toho oficiální server spotřebovává poměrně hodně operační paměti na každého připojeného hráče.

Bukkit

Serverová aplikace vytvořená nadšenci založená na Vanilla verzi Bukkit zásadně rozšířila možnosti hry tím, že podporovala pluginy a mody (modifikace). Umožnilo to nejen přidávat do herního zážitku nové bloky, ale také provádět různé manipulace, které byly standardnímu softwaru nedostupné. Co je zajímavé, tato aplikace vyžadovala výrazně méně paměti.

Nainstalovat Bukkit není žádný velký problém, odpovídající návod je k dispozici na zdroji GamePedia. To však nedává smysl, protože od roku 2014 se tým Bukkit rozpadl, vývojáři projektu se stali zaměstnanci Mojang Studios, a repuzitáře byl opuštěn. Tím pádem, Bukkit je v podstatě mrtvý a má smysl se zaměřit na dva následující projekty.

SpigotMC

Pro usnadnění života vývojářů pluginů byla potřeba API pro interakci s herním světem. Právě tuto úlohu vyřešili tvůrci Spigot, kteří vzali za základ jádro Bukkit a přepracovali ho pro zajištění lepší spolehlivosti a výkonu. Nicméně, Git repozitáře projekt byl zablokován podle Zákona o autorských právech v digitálním věku (DMCA), a stažení zdrojových kódů odtud není možné.

V současnosti je SpigotMC aktivně vyvíjen a používán. Podporuje všechny pluginy vytvořené pro Bukkit, ale není s nimi zpětně kompatibilní. Aby se obcházelo omezení DMCA Takedown, byl vynalezen elegantní způsob nazvaný BuildTools. Tento nástroj eliminuje potřebu distribuce zkompilované aplikace a umožňuje uživatelům provést kompilaci Spigot, CraftBukkit a Bukkit ze zdrojového kódu. To vše činí omezení DMCA k ničemu.

PaperMC

Mohlo by se zdát, že všechno je skvělé, a Spigot se stal vynikající volbou. Ale některým nadšencům se to zdálo málo, a tak vytvořili svou vlastní verzi Spigot "na steroidech". Na stránce projektu klíčové přednosti je uvedeno, že "Je to hloupě rychlé". Rozvinuté komunita umožňuje rychle řešit vznikající otázky a rozšířené API – vytvářet zajímavé pluginy. Spuštění PaperMC lze provést jedním jednoduchým příkazem, který je uveden v dokumentaci.

S kompatibilitou je u PaperMC vše v pořádku, takže pluginy napsané pro SpigotMC snadno fungují i na PaperMC, i když bez oficiální podpory. Zároveň je zajištěna zpětná kompatibilita se SpigotMC. Nyní, když jsme uvedli různé možnosti vytvoření serveru, přejděme k problémům s výkonem, které mohou nastat.

Problémy a řešení

Hlavní, co je třeba chápat, je, že vše, co se týká zpracování herního světa, bude zpracováváno pouze na jednom výpočetním jádře fyzického serveru. Takže pokud máte skvělý server s desítkami výpočetních jader, bude využito pouze jedno. Všechna ostatní budou ve skutečnosti nečinná. Taková je architektura aplikace a nic s tím neuděláte. Při výběru serveru byste se tedy měli zaměřit ne na počet jader, ale na taktovací frekvenci. Čím vyšší, tím lepší výkon.

Pokud jde o otázku objemu operační paměti, zde bychom měli vycházet z následujících ukazatelů:

  • plánovaný počet hráčů;
  • plánovaný počet světů na serveru;
  • velikost každého světa.

Je třeba si pamatovat, že Java aplikaci vždy potřebuje rezervu v operační paměti. Pokud očekáváte spotřebu paměti 8 gigabajtů, fakticky byste měli mít 12. Čísla jsou orientační, ale podstata se tím nemění.

Pro spuštění serverové části doporučujeme využít flagy uvedené v článku Tuning the JVM – G1GC Garbage Collector Flags for Minecraft. Tato „černá magie“ umožňuje serveru správně nastavit „sběrač odpadu“ a optimalizuje využití operační paměti. Není dobré přidělovat více paměti, než kolik server skutečně spotřebovává při vrcholném provozu hráčů.

Generování mapy bloků

„Opravdu si myslíte, že Luna existuje jen tehdy, když se na ni díváte?“ (Albert Einstein)

Úplně nový server. Jakmile se hráč poprvé úspěšně připojí, herní postava se objeví na společném sběrném bodu (spawnu). Toto je jediné místo, kde je herní svět předem generován serverem. V tu chvíli se klientská část dívá na nastavení, přičemž klíčovým parametrem je vzdálenost vykreslování. Měří se ve chunks (oblast mapy 16×16 a výškou 256 bloků). Kolik chunks je tam uvedeno, tolik bude požadováno od serveru.

Na serveru je uložena globální mapa světa a pokud v ní ještě nejsou generované bloky na místě spuštění herní postavy, server je dynamicky generuje a ukládá je k sobě. Není to jenom otázka velkých výpočetních zdrojů, ale také to neustále zvyšuje velikost mapy světa. Na jednom z nejstarších anarchických serverů, 2b2t (2builders2tools) je již velikost mapy přes 8 TB a hranice světa prochází na úrovni 30 milionů bloků. S tímto serverem je spojeno tisíce příběhů a zaslouží si vlastní článek v sérii článků.

Generace světa kolem jednoho hráče není problém. Generace světa kolem stovky hráčů způsobí jen mírné zpomalení serveru na krátkou dobu, po které zátěž klesne. Generace světa na vzdálenost vykreslování klienta kolem tisíce hráčů už dokáže 'zhodit' server a vyhodit všechny klienty kvůli timeoutu.

V serverovém softwaru existuje taková hodnota jako TPS (Ticks per Server – takty za sekundu). Standardně 1 takt trvá 50 ms. (1 sekunda skutečného světa odpovídá 20 taktům herního světa). Pokud zpracování jednoho taktu vzroste na 60 sekund – serverová aplikace se uzavře a vyhodí všechny hráče.

Řešením je omezit svět určitými souřadnicemi a provést předběžnou generaci bloků. Tím se eliminuje potřeba dynamické generace během hraní a serveru stačí přečíst již existující mapu. Obě otázky jsou řešitelné jedním jediným pluginem, WorldBorder.

Nejjednodušší je definovat hranice světa ve tvaru kruhu vztahujícímu se k bodu spawnu (ačkoli ji lze vytvořit v jakémkoli tvaru) jedním příkazem:

/wb set <радиус в блоках> spawn

Pokud se herní postava pokusí překročit hranici, bude odhozeno zpět o několik bloků. Pokud to udělají několikrát v omezeném čase, pachatel bude nuceně teleportován na spawnovací místo. Předběžná generace světa se provádí ještě jednodušeji příkazem:

/wb fill

Protože tato akce může potenciálně ovlivnit hráče na serveru, nezapomeňte potvrdit provedení:

/wb confirm

Celkově trvalo přibližně 2 hodiny procesoru Intel® Xeon® Gold 6240 vygenerovat svět o poloměru 5000 bloků (~40 miliard bloků). Takže pokud chcete spustit pre-generaci větší mapy, počítejte s tím, že tento proces zabere značný čas a TPS serveru bude vážně sníženo. Kromě toho pamatujte, že i poloměr 5000 bloků vyžaduje přibližně 2 GB místa na pevném disku.

I když byla konečná verze pluginu vyvinuta pro verzi Minecraft 1.14, bylo empiricky zjištěno, že funguje skvěle i na dalších verzích. Úplný seznam příkazů s vysvětleními je k dispozici na fóru pluginu.

Problémové bloky

Druhů bloků v Minecraftu je nespočet. Rádi bychom však upozornili čtenáře na blok, jako je TNT. Jak název naznačuje, tento blok představuje výbušninu (poznámka redakce — toto je herní položka virtuálního světa a nemá nic společného s reálnými výbušninami). Jeho zvláštností je, že v okamžiku aktivace na něj začíná působit síla gravitace. To nutí server vypočítat všechny souřadnice, pokud blok začne padat.

Pokud je bloků TNT několik, detonace jednoho bloku způsobí detonaci a aktivaci gravitace u sousedních bloků, které rozprskávají všude kolem. Celá tato krásná mechanika na straně serveru vypadá jako množství operací pro výpočet trajektorií každého z bloků a jejich interakci se sousedními bloky. Úkol je extrémně náročný na zdroje, co může každý snadno ověřit. Vygenerujte a odpálení kostku z bloků TNT o velikosti alespoň 30x30x30. A pokud jste si mysleli, že máte dobrý výkonný herní počítač, tak jste se hodně mýlili 😉

/fill ~ ~ ~ ~30 ~30 ~30 minecraft:tnt

Optimalizace Minecraft serveru
Podobný „experiment“ na serveru s Intel® Xeon® Gold 6240 vedl k výraznému poklesu TPS a 80% zatížení CPU po celou dobu detonace bloků. To znamená, že pokud někdo z hráčů dokáže něco podobného, problém s výkonem se dotkne všech hráčů na serveru.

Ještě přísnější varianta — Křišťály Kraje. Pokud TNT skutečně exploduje sekvenčně, Křišťály Kraje detonují všechny současně, což teoreticky může úplně zastavit fungování serverové aplikace.

Tomu lze zabránit pouze úplným zákazem používání těchto bloků ve herním světě. Například pomocí pluginu WorldGuard. Všimněte si, že tento plugin sám o sobě nefunguje bez jiného pluginu WorldEdit. Takže nejdříve nainstalujte WorldEdit a potom WorldGuard.

Závěr

Odpovědné řízení herního serveru není jednoduchý úkol. Obtíže a pokles výkonu na vás čekají na každém kroku, zejména pokud nezohledníte samotnou mechaniku hry. Vše předvídat nelze, protože hráči jsou někdy velmi vynalézaví ve snaze donutit server k provedení toho, k čemu nebyl určen. Pouze rozumná rovnováha mezi riziky a nastavenými omezeními umožní serveru pracovat v nepřetržitém režimu a nezhoršovat jeho výkon na kritické hodnoty.

Na karanténě se někteří naši zaměstnanci stýskali po svých oblíbených kancelářích a rozhodli se je znovu vytvořit uvnitř Minecraftu. I vy máte šanci nás navštívit, aniž byste riskovali své zdraví a ztráceli čas na cestu.

K tomu zveme všechny zájemce na náš server minecraft.selectel.ru verze klienta 1.15.2, kde byly znovu vytvořeny datové centra Květinová-1 a Květinová-2. Nezapomeňte souhlasit se stažením dalších zdrojů, jsou nezbytné pro správné zobrazení některých lokalit.

Čekají vás questy, promo kódy, „velikonoční vajíčka“ a příjemná konverzace.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster