Minecrafti serveri optimeerimine

Minecrafti serveri optimeerimine
Meie blogis oleme seda juba teinud rääkinud, kuidas luua oma Minecrafti server, kuid sellest on möödas 5 aastat ja palju on muutunud. Jagame teiega praeguseid viise sellise populaarse mängu serveriosa loomiseks ja optimeerimiseks.

Minecraft on oma 9-aastase ajaloo jooksul (alates väljalaskekuupäevast) pälvinud hämmastavalt palju fänne ja vihkajaid nii tavaliste mängijate kui ka geekide seas. Plokkidest koosneva maailma lihtne kontseptsioon on arenenud lihtsast meelelahutusvormist universaalseks meediumiks suhtlemiseks ja reaalsest maailmast erinevate objektide loomiseks.

Lisaks ehitusele on mängul ka loomise võimalus loogika, mis võimaldavad teil Minecraftis rakendada täieõiguslikke algoritme. YouTube on täis väga muljetavaldavaid videoid, kus inimesed on tohutult pingutanud ja palju aega kulutades loonud sellest või teisest elektroonilisest seadmest koopia või koostanud üksikasjaliku koopia. olemasolevad и väljamõeldud arhitektuursed struktuurid. Kõike piirab ainult mängija kujutlusvõime ja mänguuniversumi võimalused.


Kuid ärme räägi pikemalt sellest, mida mängijad täpselt loovad, vaid vaatame rakenduse serveriosa ja toome välja probleemid (mõnikord väga keerulised), mis võivad koormuse all töötamise ajal tekkida. Teeme kohe reservatsiooni, et räägime ainult Java väljaandest.

Serverite tüübid

Lihtsaim variant on mängukliendisse sisseehitatud server. Tegime maailma, vajutasime ühte nuppu ja server sai ligipääsetavaks üle kohaliku võrgu. See valik ei talu tõsist koormust ja seetõttu me seda isegi ei kaalu.

Vanilla

Mojang Studios levitab mängu serveriosa tasuta Java-rakendusena ametlikul veebisaidil. See võimaldab teil luua oma spetsiaalne server ja isiklik maailm, muutes selle ühenduse loomiseks juurdepääsetavaks kõikjalt planeedil. Neile, kes teevad seda esimest korda, on suurepärane võimalus õpetus, saadaval vastavas mänguwikis.

Sellel lähenemisviisil on üks tõsine puudus, nimelt valmisoleku puudumine pistikprogrammide ühendamiseks, mis laiendavad serveri funktsionaalsust ja võimaldavad mitte ainult automatiseerida paljusid protsesse, vaid ka optimeerida jõudlust. Lisaks on ametlikus serveris iga ühendatud mängija kohta üsna suur RAM-i tarbimine.

bukkit

Entusiastide poolt loodud serverirakendus Vanilla versiooni põhjal bukkit laiendas oluliselt mängu võimalusi, toetades pluginaid ja modifikatsioone (muudatusi). See võimaldas mitte ainult lisada mängule uusi plokke, vaid ka teha mitmesuguseid manipulatsioone, mis olid vanilje tarkvarale kättesaamatud. Huvitaval kombel nõudis see rakendus oluliselt vähem mälu.

Bukkiti installimine pole keeruline, vastavad juhised on ressursil GamePedia. Kuid sellel pole mõtet, sest alates 2014. aastast on Bukkiti meeskond laiali läinud, projekti arendajatest on saanud Mojang Studios töötajad ja hoidla mahajäetud. Seega on Bukkit sisuliselt surnud ja on mõttekas pöörata tähelepanu kahele järgmisele projektile.

SpigotMC

Pistikprogrammide arendajate elu hõlbustamiseks oli mängumaailmaga suhtlemiseks vaja API-d. See on täpselt see probleem, mille loojad lahendasid. Nukk, võttes Bukkiti tuuma ja töötades selle ümber, et saavutada parem töökindlus ja jõudlus. Sellegipoolest Giti hoidla projekt blokeeriti Ameerika Ühendriikide autorikaitse seaduse (Digital Millennium Copyright Act) tõttu (DMCA) ja sealt on võimatu lähtekoodi alla laadida.

Praegu arendatakse ja kasutatakse aktiivselt SpigotMC-d. See toetab kõiki Bukkiti jaoks loodud pistikprogramme, kuid ei ole sellega tagasiühilduv. DMCA eemaldamisest mööda pääsemiseks leiutati elegantne meetod nimega BuildTools. See tööriist välistab vajaduse kompileeritud rakendust levitada ja võimaldab kasutajatel kompileerida Spigoti, CraftBukkiti ja Bukkiti lähtekoodist. Kõik see muudab DMCA keelu kasutuks.

PaperMC

Kõik tundus lahe ja Spigot sai suurepäraseks võimaluseks. Kuid mõnele entusiastile sellest ei piisanud ja nad lõid oma Spigoti kahvli "steroidide peal". Peal projekti leht peamine eelis on see, et "kiire on rumal". Arenenud kogukond võimaldab kiiresti lahendada tekkivaid probleeme ja laiendatud API võimaldab luua huvitavaid pistikprogramme. Saate PaperMC käivitada ühe lihtsa käsuga, mis on antud dokumentatsioon.

PaperMC-l on suurepärane ühilduvus, nii et SpigotMC jaoks kirjutatud pistikprogrammid saavad PaperMC-s hõlpsasti töötada, kuid ilma ametliku toeta. Samuti on olemas tagasiühilduvus SpigotMC-ga. Nüüd, kui oleme serveri loomise erinevad võimalused loetlenud, liigume edasi tekkida võivate jõudlusprobleemide juurde.

Probleemid ja lahendused

Peamine asi, mida peate mõistma, on see, et kõike, mis on seotud mängumaailma töötlemisega, töödeldakse ainult füüsilise serveri ühes arvutustuumal. Nii et kui teil on äkki suurepärane server, millel on kümmekond arvutustuuma, laaditakse ainult üks. Kõik teised jäävad praktiliselt jõude. See on rakenduse arhitektuur ja te ei saa sellega midagi teha. Seega tuleks serverit valides pöörata tähelepanu mitte tuumade arvule, vaid taktsagedusele. Mida kõrgem see on, seda parem on jõudlus.

RAM-i mahu küsimuses peaksime lähtuma järgmistest näitajatest:

  • planeeritud mängijate arv;
  • planeeritud maailmade arv serveris;
  • iga maailma suurus.

Tuleb meeles pidada, et Java-rakendus vajab alati RAM-i reservi. Kui eeldate mälutarbimist 8 gigabaiti, siis tegelikult peab seda olema 12. Numbrid on suhtelised, kuid olemus ei muutu.

Serveriosa käivitamiseks soovitame kasutada artiklis märgitud lippe JVM – G1GC prügikoguja lippude häälestamine Minecrafti jaoks. See "must maagia" võimaldab serveril "prügikogujat" õigesti konfigureerida ja optimeerida RAM-i kasutamist. Te ei tohiks mängijate sissevoolu tippajal eraldada rohkem mälu, kui server tegelikult tarbib.

Plokikaardi genereerimine

"Kas sa tõesti arvad, et kuu eksisteerib ainult siis, kui sa seda vaatad?" (Albert Einstein)

Täiesti uus server. Niipea, kui mängija esimest korda edukalt ühenduse loob, ilmub mängutegelane üldisesse kogunemispunkti (spawn). See on ainus koht, kus server on mängumaailma eelnevalt genereerinud. Samal hetkel vaatab kliendiosa seadeid ja võtmeparameetriks on joonistuskaugus. Seda mõõdetakse juppides (kaardi pindala on 16×16 ja 256 plokki kõrge) Kui palju tükke seal on märgitud, on täpselt märgitud, kui palju neid serverilt küsitakse.

Server salvestab globaalse maailmakaardi ja kui selles pole mängutegelase ilmumise hetkel veel genereeritud plokke, siis server genereerib need dünaamiliselt ja salvestab. See mitte ainult ei nõua suuri arvutusressursse, vaid suurendab pidevalt ka maailmakaardi suurust. Ühes vanimas anarhistlikus serveris 2b2t (2builders2tools) Kaardi suurus on juba ületanud 8 Tb ja maailma piir on umbes 30 miljonit plokki. Selle serveriga on seotud tuhandeid lugusid ja see väärib sarjas oma artiklit.

Ühe mängija ümber maailma loomine pole probleem. Sadade mängijate ümber maailma loomine põhjustab lühikeseks ajaks väiksemaid serveri aeglustusi, misjärel koormus väheneb. Maailma genereerimine kliendi renderduskaugusel umbes tuhande mängijaga on juba võimeline serveri "kukkuma" ja kõik kliendid sellest ajalõpu tõttu välja viskama.

Serveritarkvaras on selline väärtus nagu TPS (Ticks per Server – tics per second). Tavaliselt võrdub 1 taktitsükkel 50 ms. (1 sekund reaalsest maailmast võrdub 20 mängumaailma linnukesega). Kui ühe linnukese töötlemine pikeneb 60 sekundini, suletakse serverirakendus, visates kõik mängijad välja.

Lahenduseks on piirata maailm teatud koordinaatidega ja teostada esialgne plokkide genereerimine. Seega eemaldame mängu ajal dünaamilise genereerimise vajaduse ja server peab lugema ainult olemasolevat kaarti. Mõlemat probleemi saab lahendada ühe pistikprogrammiga Maailmapiir.

Lihtsaim viis on määrata maailma piir kudemispunkti suhtes ringi kujul (kuigi saate teha selle mis tahes kujuga) ühe käsuga:

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

Kui mängija tegelane üritab piiri ületada, lükatakse ta mitu plokki tagasi. Kui seda tehakse mitu korda piiratud aja jooksul, teleporteeritakse kurjategija sunniviisiliselt kudemispunkti. Maailma eelgenereerimine toimub veelgi lihtsamalt, käsuga:

/wb fill

Kuna see toiming võib potentsiaalselt mõjutada mängijaid serveris, kinnitage kindlasti:

/wb confirm

Kokku kulus Intel® Xeon® Gold 5000 protsessoriga 40 ploki (~ 2 miljardit plokki) raadiusega maailma loomiseks umbes 6240 tundi. Seega, kui soovite eelgenereerida suuremat kaarti, pidage meeles, et see protsess võtab piisavalt aega ja serveri TPS väheneb tõsiselt. Samuti pidage meeles, et isegi 5000 ploki raadius nõuab umbes 2 GB kettaruumi.

Vaatamata asjaolule, et pistikprogrammi uusim versioon töötati välja Minecrafti versiooni 1.14 jaoks, leiti katseliselt, et see töötab järgmistes versioonides suurepäraselt. Saadaval on täielik käskude loend koos selgitustega pluginate foorumis.

Probleemsed plokid

Minecraftis on palju erinevaid plokke. Siiski juhime lugejate tähelepanu sellisele plokile nagu TNT. Nagu nimigi ütleb, on see plokk lõhkeaine (toimetaja märkus - see on virtuaalmaailma mänguartikkel ja sellel elemendil pole midagi tõeliste lõhkeainetega). Selle eripära on selline, et aktiveerimise hetkel hakkab sellele mõjuma gravitatsioonijõud. See sunnib serverit arvutama kõik koordinaadid, kui plokk hakkab sel hetkel langema.

Kui TNT plokke on mitu, siis ühe ploki lõhkamine põhjustab naaberplokkides detonatsiooni ja gravitatsiooni aktiveerumise, hajutades neid igas suunas. Kogu see ilus mehaanika serveri poolel näeb välja nagu palju toiminguid iga ploki trajektoori arvutamiseks, aga ka suhtlemist naaberplokkidega. Ülesanne on äärmiselt ressursimahukas, mida igaüks saab hõlpsasti kontrollida. Genereeri ja detoneeri TNT-plokkidest kuubik, mille suurus on vähemalt 30x30x30. Ja kui arvasid, et sul on hea võimas mänguarvuti, siis eksid väga 😉

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

Minecrafti serveri optimeerimine
Sarnane "katse" serveris Intel® Xeon® Gold 6240-ga tõi kaasa tõsise TPS-i languse ja 80% protsessori koormuse kogu ploki detonatsiooniaja jooksul. Seega, kui mõni mängija seda suudab, mõjutab jõudlusprobleem kõiki serveri mängijaid.

Veelgi karmim variant - Ääre kristallid. Kui TNT plahvatab siiski järjestikku, plahvatavad Edge Crystals kõik korraga, mis teoreetiliselt võib serverirakenduse töö täielikult peatada.

Seda stsenaariumi saab vältida ainult nende plokkide kasutamise täieliku keelamisega mängumaailmas. Näiteks pistikprogrammi kasutamine Maailmavalvur. Pange tähele, et see plugin iseenesest ei tööta ilma teise pluginata Worldedit. Nii et installige esmalt WorldEdit ja seejärel WorldGuard.

Järeldus

Mänguserveri korralik haldamine pole lihtne ülesanne. Raskused ja vähenenud jõudlus ootavad teid igal sammul, eriti kui te ei võta arvesse mängumehaanikat ennast. Kõike on võimatu ette näha, sest mängijad võivad mõnikord olla väga loomingulised, püüdes sundida serverit tegema midagi, mille jaoks see pole mõeldud. Ainult mõistlik tasakaal riskide ja kehtestatud piirangute vahel võimaldab serveril pidevalt töötada ja mitte vähendada oma jõudlust kriitiliste väärtusteni.

Karantiini ajal igatsesid mõned meie töötajad oma lemmikkontoreid ja otsustasid need Minecraftis uuesti luua. Samuti on teil võimalus tulla meile külla ilma oma tervisega riskimata või teel olles aega raiskamata.

Selleks kutsume kõiki oma serverisse minecraft.selectel.ru (kliendiversioon 1.15.2), kus taasloodi andmekeskused Tsvetotšnaja-1 ja Tsvetotšnaja-2. Ärge unustage nõustuda lisaressursside allalaadimisega, need on vajalikud mõne asukoha õigeks kuvamiseks.

Teid ootavad ülesanded, sooduskoodid, lihavõttemunad ja meeldiv suhtlus.

Allikas: www.habr.com

Lisa kommentaar