Optimizacija strežnika Minecraft

Optimizacija strežnika Minecraft
Na našem blogu smo že povedal, kako ustvariti svoj Minecraft strežnik, vendar je od takrat minilo 5 let in veliko se je spremenilo. Z vami delimo trenutne načine za ustvarjanje in optimizacijo strežniškega dela tako priljubljene igre.

V svoji 9-letni zgodovini (šteto od datuma izdaje) si je Minecraft prislužil neverjetno število oboževalcev in sovražnikov med navadnimi igralci in geeki. Preprost koncept sveta iz kock se je iz preproste oblike zabave razvil v univerzalni medij za komuniciranje in ustvarjanje različnih predmetov iz realnega sveta.

Poleg gradnje ima igra možnost ustvarjanja logika, ki vam omogočajo implementacijo polnopravnih algoritmov znotraj Minecrafta. YouTube je poln zelo impresivnih videoposnetkov, kjer so ljudje, ki so vložili ogromno truda in porabili veliko časa, ustvarili kopijo te ali one elektronske naprave ali sestavili podrobno kopijo obstoječih и izmišljeno arhitekturne strukture. Vse je omejeno le z igralčevo domišljijo in možnostmi igričarskega vesolja.


A ne bomo več govorili o tem, kaj točno ustvarjajo igralci, ampak poglejmo strežniški del aplikacije in izpostavimo težave (včasih zelo zapletene), ki se lahko pojavijo med delovanjem pod obremenitvijo. Takoj rezervirajmo, da bomo govorili samo o različici Java.

Vrste strežnikov

Najenostavnejša možnost je strežnik, vgrajen v odjemalca igre. Ustvarili smo svet, pritisnili en gumb in strežnik je postal dostopen preko lokalnega omrežja. Ta možnost ne more prenesti resne obremenitve, zato je ne bomo niti upoštevali.

Vanilla

Mojang Studios brezplačno distribuira strežniški del igre kot aplikacijo Java na uradni spletni strani. To vam omogoča, da ustvarite svoje namenski strežnik in osebni svet, zaradi česar je dostopen za povezavo od koder koli na planetu. Za tiste, ki to počnejo prvič, je super vadnica, ki je na voljo na ustreznem igralnem Wikiju.

Ta pristop ima eno resno pomanjkljivost, in sicer pomanjkanje že pripravljenih zmogljivosti za povezovanje vtičnikov, ki razširjajo funkcionalnost strežnika in omogočajo ne le avtomatizacijo številnih procesov, temveč tudi optimizacijo delovanja. Poleg tega ima uradni strežnik precej veliko porabo RAM-a za vsakega povezanega igralca.

bukkit

Strežniška aplikacija, ki so jo ustvarili navdušenci na podlagi različice Vanilla bukkit znatno razširil zmogljivosti igre s podporo za vtičnike in modifikacije (spremembe). Omogočil je ne samo dodajanje novih blokov v igranje, ampak tudi izvajanje različnih manipulacij, ki so bile nedostopne programski opremi vanilla. Zanimivo je, da je ta aplikacija zahtevala bistveno manj pomnilnika.

Namestitev Bukkita ni težavna, ustrezna navodila so na viru GamePedia. Vendar to nima smisla, saj je od leta 2014 ekipa Bukkit razpadla, razvijalci projekta so postali zaposleni v Mojang Studios in repozitorij zapuščen. Tako je Bukkit dejansko mrtev in smiselno je biti pozoren na naslednja dva projekta.

SpigotMC

Da bi razvijalcem vtičnikov olajšali življenje, je bil potreben API za interakcijo s svetom iger. Prav to je problem, ki so ga ustvarjalci rešili. Spigot, pri čemer vzame jedro Bukkit in ga predela, da doseže večjo zanesljivost in zmogljivost. Kljub temu, Git repozitorij projekt je bil blokiran zaradi zakona o avtorskih pravicah v digitalnem tisočletju (DMCA) in od tam ni mogoče prenesti izvorne kode.

Trenutno se SpigotMC aktivno razvija in uporablja. Podpira vse vtičnike, ustvarjene za Bukkit, vendar ni združljiv za nazaj z njim. Da bi se izognili odstranitvi DMCA, je bila izumljena elegantna metoda, imenovana BuildTools. To orodje odpravlja potrebo po distribuciji prevedene aplikacije in uporabnikom omogoča prevajanje Spigot, CraftBukkit in Bukkit iz izvorne kode. Zaradi vsega tega je prepoved DMCA neuporabna.

PaperMC

Vse se je zdelo kul in Spigot je postal odlična možnost. Toda nekaterim navdušencem to ni bilo dovolj in ustvarili so lastne vilice Spigota »na steroidih«. Vklopljeno stran projekta ključna prednost je, da je "hitro neumno". Razvita skupnosti vam omogoča hitro reševanje nastajajočih težav, razširjeni API pa vam omogoča ustvarjanje zanimivih vtičnikov. PaperMC lahko zaženete z enim preprostim ukazom dokumentacijo.

PaperMC ima odlično združljivost, zato lahko vtičniki, napisani za SpigotMC, zlahka delujejo na PaperMC, vendar brez uradne podpore. Prisotna je tudi povratna združljivost s SpigotMC. Zdaj, ko smo našteli različne možnosti za ustvarjanje strežnika, pojdimo k težavam z zmogljivostjo, ki se lahko pojavijo.

Problemi in rešitve

Glavna stvar, ki jo morate razumeti, je, da bo vse, kar je povezano z obdelavo sveta igre, obdelano samo v enem računalniškem jedru fizičnega strežnika. Če torej nenadoma imate odličen strežnik z ducatom računalniških jeder, bo naloženo samo eno. Vsi drugi bodo tako rekoč mirovali. Takšna je arhitektura aplikacije in glede tega ne morete storiti ničesar. Torej pri izbiri strežnika ne bodite pozorni na število jeder, temveč na frekvenco ure. Višja kot je, boljša bo zmogljivost.

V zvezi z vprašanjem zmogljivosti RAM-a bi morali izhajati iz naslednjih kazalnikov:

  • načrtovano število igralcev;
  • načrtovano število svetov na strežniku;
  • velikost vsakega sveta.

Ne smemo pozabiti, da aplikacija Java vedno potrebuje rezervo RAM-a. Če pričakujete porabo pomnilnika 8 gigabajtov, jih morate dejansko imeti 12. Številke so relativne, a bistvo se ne spremeni.

Za zagon strežniškega dela priporočamo uporabo zastavic, navedenih v članku Nastavitev JVM – G1GC Garbage Collector Flags za Minecraft. Ta "črna magija" omogoča strežniku, da pravilno konfigurira "zbiralnik smeti" in optimizira uporabo RAM-a. Med največjim prihodom igralcev ne smete dodeliti več pomnilnika, kot ga strežnik dejansko porabi.

Ustvarjanje zemljevida blokov

"Ali res mislite, da luna obstaja samo, ko jo pogledate?" (Albert Einstein)

Popolnoma nov strežnik. Takoj, ko se igralec prvič uspešno poveže, se lik igre pojavi na splošni zbirni točki (spawn). To je edino mesto, kjer je svet igre vnaprej ustvarjen s strani strežnika. V istem trenutku odjemalski del pogleda nastavitve, ključni parameter pa je razdalja risanja. Meri se v kosih (območje zemljevida je 16×16 in visoko 256 blokov). Koliko kosov je označenih, je točno toliko, kolikor jih bo zahteval strežnik.

Strežnik shrani globalni zemljevid sveta in če v njem še ni ustvarjenih blokov na točki pojava igralnega lika, jih strežnik dinamično ustvari in shrani. Ne samo, da to zahteva velike računalniške vire, ampak tudi nenehno povečuje velikost zemljevida sveta. Na enem najstarejših anarhističnih strežnikov 2B2T (2builders2tools) Velikost zemljevida je že presegla 8 Tb, meja sveta pa je na okoli 30 milijonih blokov. S tem strežnikom je povezanih na tisoče zgodb in zasluži si svoj članek v seriji.

Ustvariti svet okoli enega igralca ni problem. Ustvarjanje sveta okrog sto igralcev bo povzročilo manjše upočasnitve strežnika za kratek čas, nato pa se bo obremenitev zmanjšala. Generiranje sveta na razdalji upodabljanja odjemalca okoli tisoč igralcev je že sposobno "spustiti" strežnik in iz njega vrziti vse odjemalce zaradi časovne omejitve.

V strežniški programski opremi je vrednost, kot je npr TPS (Tikov na strežnik - tikov na sekundo). Običajno je 1 urni cikel enak 50 ms. (1 sekunda resničnega sveta je enaka 20 tikam sveta igre). Če se obdelava ene kljukice poveča na 60 sekund, se strežniška aplikacija zapre in izloči vse igralce.

Rešitev je omejiti svet na določene koordinate in izvesti predhodno generiranje blokov. Tako odstranimo potrebo po dinamičnem generiranju med igro in strežnik bo moral samo prebrati obstoječ zemljevid. Obe težavi je mogoče rešiti z enim samim vtičnikom Svetovna meja.

Najlažji način je, da nastavite mejo sveta v obliki kroga glede na točko drstitve (čeprav jo lahko naredite poljubne oblike) z enim ukazom:

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

Če igralčev lik poskuša prestopiti mejo, bo potisnjen nekaj blokov nazaj. Če se to stori večkrat v omejenem času, bo storilec prisilno teleportiran na točko drstišča. Predgeneracija sveta je narejena še preprosteje, z ukazom:

/wb fill

Ker bi to dejanje lahko vplivalo na igralce na strežniku, ne pozabite potrditi:

/wb confirm

Skupno je trajalo približno 5000 uri za ustvarjanje sveta s polmerom 40 blokov (~2 milijard blokov) na procesorju Intel® Xeon® Gold 6240. Če torej želite vnaprej ustvariti večji zemljevid, upoštevajte, da ta postopek bo trajal dostojno količino časa, TPS strežnika pa se bo resno zmanjšal. Ne pozabite tudi, da bo celo radij 5000 blokov zahteval približno 2 GB prostora na disku.

Kljub dejstvu, da je bila najnovejša različica vtičnika razvita za Minecraft različico 1.14, je bilo eksperimentalno ugotovljeno, da odlično deluje na naslednjih različicah. Na voljo je celoten seznam ukazov z razlagami na forumu vtičnikov.

Problemski bloki

V Minecraftu je veliko različnih blokov. Vendar bi radi bralce opozorili na tak blok, kot je TNT. Kot že ime pove, je ta blok eksploziv (opomba urednika - to je igralni element virtualnega sveta in ta predmet nima pravega eksploziva). Njegova posebnost je takšna, da v trenutku aktivacije nanj začne delovati sila težnosti. To prisili strežnik, da izračuna vse koordinate, če v tem trenutku blok začne padati.

Če je blokov TNT več, potem detonacija enega bloka povzroči detonacijo in aktiviranje gravitacije v sosednjih blokih, ki jih razprši v vse smeri. Vsa ta čudovita mehanika na strani strežnika je videti kot veliko operacij za izračun trajektorije vsakega bloka, pa tudi kot interakcija s sosednjimi bloki. Naloga je izjemno zahtevna, kar lahko vsak zlahka preveri. Ustvarite in detonirajte kocko iz blokov TNT, ki je velika vsaj 30x30x30. In če ste mislili, da imate dober, zmogljiv igričarski računalnik, ste se močno zmotili 😉

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

Optimizacija strežnika Minecraft
Podoben »eksperiment« na strežniku z Intel® Xeon® Gold 6240 je povzročil resen padec TPS in 80-odstotno obremenitev CPU med celotnim časom detonacije bloka. Torej, če je kateri koli igralec sposoben to narediti, bo težava z zmogljivostjo vplivala na vse igralce na strežniku.

Še težja možnost - Robni kristali. Če TNT kljub temu eksplodira zaporedno, potem eksplodirajo robni kristali vsi hkrati, kar lahko teoretično popolnoma prekine delovanje strežniške aplikacije.

Temu scenariju se je mogoče izogniti le s popolno prepovedjo uporabe teh blokov v svetu iger. Na primer z uporabo vtičnika WorldGuard. Upoštevajte, da ta vtičnik sam po sebi ne deluje brez drugega vtičnika WorldEdit. Zato najprej namestite WorldEdit in nato WorldGuard.

Zaključek

Pravilno upravljanje igralnega strežnika ni lahka naloga. Težave in zmanjšana zmogljivost vas bodo čakale na vsakem koraku, še posebej, če ne upoštevate same mehanike igranja. Vsega je nemogoče predvideti, saj so igralci včasih lahko zelo ustvarjalni, ko poskušajo strežnik prisiliti, da naredi nekaj, čemur ni bil namenjen. Samo razumno ravnotežje med tveganji in uveljavljenimi omejitvami bo strežniku omogočilo neprekinjeno delovanje in njegovo delovanje ne bo zmanjšalo na kritične vrednosti.

Med karanteno so nekateri naši zaposleni pogrešali svoje najljubše pisarne in so se odločili, da jih poustvarijo v Minecraftu. Prav tako imate možnost, da nas obiščete, ne da bi tvegali svoje zdravje ali izgubljali čas na poti.

V ta namen vabimo vse na naš strežnik minecraft.selectel.ru (različica odjemalca 1.15.2), kjer sta bila poustvarjena podatkovna centra Cvetočnaja-1 in Cvetočnaja-2. Ne pozabite se strinjati s prenosom dodatnih virov, potrebni so za pravilen prikaz nekaterih lokacij.

Čakajo vas naloge, promocijske kode, velikonočna jajca in prijetna komunikacija.

Vir: www.habr.com

Dodaj komentar