Optimumigo de Minecraft-servilo

Optimumigo de Minecraft-servilo
En nia blogo ni jam havas rakontis, kiel krei vian propran Minecraft-servilon, sed 5 jaroj pasis de tiam kaj multe ŝanĝiĝis. Ni dividas kun vi aktualajn manierojn krei kaj optimumigi la servilan parton de tia populara ludo.

Dum ĝia 9-jara historio (kalkulante de la eldondato), Minecraft gajnis mirindan nombron da adorantoj kaj malamantoj inter kaj ordinaraj ludantoj kaj geeks. La simpla koncepto de mondo farita el blokoj evoluis de simpla formo de distro al universala medio por komuniki kaj krei diversajn objektojn el la reala mondo.

Krom konstruo, la ludo havas la kapablon krei logiko, kiuj ebligas al vi efektivigi plenrajtajn algoritmojn ene de Minecraft. Jutubo estas plena de tre imponaj filmetoj, kie homoj, multe klopodante kaj pasigante multan tempon, kreis kopion de tiu aŭ alia elektronika aparato aŭ konstruis detalan kopion. ekzistanta и fikcia arkitekturaj strukturoj. Ĉio estas limigita nur de la imago de la ludanto kaj la eblecoj de la videoludada universo.


Sed ni ne plu parolu pri tio, kion precize kreas la ludantoj, sed ni rigardu la servilan parton de la aplikaĵo kaj reliefigu la problemojn (foje tre kompleksajn) kiuj povas aperi dum funkciado sub ŝarĝo. Ni faru tuj rezervo, ke ni parolos nur pri la Java Eldono.

Tipoj de serviloj

La plej simpla opcio estas servilo enkonstruita en la ludkliento. Ni kreis mondon, premis unu butonon, kaj la servilo fariĝis alirebla per la loka reto. Ĉi tiu opcio ne povas elteni ajnan gravan ŝarĝon, kaj tial ni eĉ ne konsideros ĝin.

vanilo

Mojang Studios distribuas la servilan parton de la ludo kiel Java-aplikaĵon senpage en la oficiala retejo. Ĉi tio ebligas al vi krei vian propran dediĉita servilo kaj persona mondo, farante ĝin alirebla por konekto de ie ajn sur la planedo. Por tiuj, kiuj faras ĉi tion por la unua fojo, estas bonega lernilo, havebla sur la responda videoludada Vikio.

Ĉi tiu aliro havas unu gravan malavantaĝon, nome la manko de ekster-kesto-kapabloj por konekti kromaĵojn, kiuj vastigas la funkciecon de la servilo kaj permesas ne nur aŭtomatigi multajn procezojn, sed ankaŭ optimumigi rendimenton. Krome, la oficiala servilo havas sufiĉe grandan RAM-konsumon por ĉiu konektita ludanto.

Bukkit

Servila aplikaĵo kreita de entuziasmuloj surbaze de la Vanilla versio Bukkit signife vastigis la kapablojn de la ludo subtenante kromaĵojn kaj modifojn (modifoj). Ĝi permesis ne nur aldoni novajn blokojn al la ludado, sed ankaŭ fari diversajn manipuladojn, kiuj estis nealireblaj al vanila programaro. Interese, ĉi tiu aplikaĵo postulis signife malpli da memoro.

Instali Bukkit ne estas malfacila; la respondaj instrukcioj estas sur la rimedo GamePedia. Sed ĉi tio ne havas sencon, ĉar ekde 2014 la Bukkit-teamo dissolviĝis, la projektprogramistoj fariĝis dungitoj de Mojang Studios, kaj deponejo forlasita. Tiel, Bukkit estas efike morta, kaj havas sencon atenti la venontajn du projektojn.

SpigotMC

Por faciligi la vivon al kromprogramoj, necesis API por interagi kun la ludmondo. Ĝuste ĉi tiu estas la problemo, kiun la kreintoj solvis. Spigot, prenante la Bukkit-kernon kaj reverkante ĝin por atingi pli bonan fidindecon kaj efikecon. Tamen, Git-deponejo la projekto estis blokita pro la Cifereca Jarmila Kopirajto-Leĝo (DMCA), kaj estas neeble elŝuti la fontkodon de tie.

Nuntempe, SpigotMC estas aktive evoluigita kaj uzata. Ĝi subtenas ĉiujn kromaĵojn kreitajn por Bukkit, sed ne estas malantaŭen kongrua kun ĝi. Por ĉirkaŭiri la DMCA Takedown, eleganta metodo nomata BuildTools estis inventita. Ĉi tiu ilo forigas la bezonon distribui kompilitan aplikaĵon kaj permesas al uzantoj kompili Spigot, CraftBukkit kaj Bukkit el fontkodo. Ĉio ĉi faras la DMCA-malpermeson senutila.

PaperMC

Ĉio ŝajnis malvarmeta, kaj Spigot fariĝis bonega eblo. Sed ĉi tio ne sufiĉis por iuj entuziasmuloj, kaj ili kreis sian propran forkon de Spigot "sur steroidoj". On projekto paĝo la ŝlosila avantaĝo estas ke "Estas stulta rapida". Evoluinta komunumo permesas vin rapide solvi emerĝantajn problemojn, kaj la etendita API permesas krei interesajn kromaĵojn. Vi povas lanĉi PaperMC per unu simpla komando, donita dokumentado.

PaperMC havas bonegan kongruecon, do kromaĵojn skribitaj por SpigotMC povas facile funkcii sur PaperMC, sed sen oficiala subteno. Malantaŭa kongruo kun SpigotMC ankaŭ ĉeestas. Nun kiam ni listigis la diversajn eblojn por krei servilon, ni pluiru al la agado-problemoj kiuj povas aperi.

Problemoj kaj Solvoj

La ĉefa afero, kiun vi devas kompreni, estas, ke ĉio rilata al prilaborado de la ludmondo estos prilaborita nur sur unu komputika kerno de la fizika servilo. Do se subite vi havas bonegan servilon kun dekduo da komputilaj kernoj, tiam nur unu estos ŝargita. Ĉiuj aliaj estos preskaŭ neaktivaj. Ĉi tio estas la arkitekturo de la aplikaĵo, kaj vi povas nenion fari pri ĝi. Do elektante servilon, vi devas atenti ne al la nombro da kernoj, sed al la horloĝfrekvenco. Ju pli alta ĝi estas, des pli bona estos la agado.

Koncerne la temon de RAM-kapacito, ni devus procedi de la sekvaj indikiloj:

  • laŭplana nombro da ludantoj;
  • planita nombro da mondoj sur la servilo;
  • la grandeco de ĉiu mondo.

Oni devas memori, ke Java aplikaĵo ĉiam bezonas rezervon de RAM. Se vi atendas memorkonsumon de 8 gigabajtoj, tiam vi efektive bezonas havi 12. La nombroj estas relativaj, sed la esenco ne ŝanĝiĝas.

Por komenci la servilon, ni rekomendas uzi la flagojn specifitajn en la artikolo Agordante la JVM - G1GC Rubokolektisto-Flagoj por Minecraft. Ĉi tiu "nigra magio" permesas al la servilo ĝuste agordi la "rubaĵkolektilon" kaj optimumigi la uzon de RAM. Vi ne devus asigni pli da memoro ol la servilo fakte konsumas dum la pinta enfluo de ludantoj.

Generado de blokmapo

"Ĉu vi vere pensas, ke la luno ekzistas nur kiam vi rigardas ĝin?" (Albert Einstein)

Tute nova servilo. Tuj kiam la ludanto sukcese konektiĝas por la unua fojo, la ludkaraktero aperas ĉe la ĝenerala kunvenpunkto (freno). Ĉi tiu estas la nura loko kie la ludmondo estas antaŭgenerita de la servilo. En la sama momento, la klienta parto rigardas la agordojn, kaj la ŝlosila parametro estas la desegna distanco. Ĝi estas mezurita en pecoj (la mapo-areo estas 16×16 kaj 256 blokoj alta). Kiom da pecoj estas indikitaj estas ekzakte kiom multaj estos petitaj de la servilo.

La servilo stokas tutmondan mapon de la mondo, kaj se ekzistas neniuj generitaj blokoj en ĝi ankoraŭ ĉe la punkto de apero de la ludfiguro, tiam la servilo dinamike generas ilin kaj stokas ilin. Ne nur tio postulas grandajn komputigajn rimedojn, sed ĝi ankaŭ konstante pliigas la grandecon de la mondmapo. Sur unu el la plej malnovaj anarkiismaj serviloj 2b2t (2builders2tools) La grandeco de la mapo jam superis 8 Tb, kaj la limo de la mondo estas ĉirkaŭ 30 milionoj da blokoj. Estas miloj da rakontoj asociitaj kun ĉi tiu servilo kaj ĝi meritas sian propran artikolon en la serio.

Generi mondon ĉirkaŭ unu ludanto ne estas problemo. Generado de mondo ĉirkaŭ centoj da ludantoj kaŭzos malrapidajn servilojn por mallonga tempo, post kio la ŝarĝo malpliiĝos. Generi mondon ĉe klienta bildiga distanco ĉirkaŭ mil ludantoj jam kapablas "faligi" la servilon kaj forĵeti ĉiujn klientojn el ĝi pro tempodaŭro.

En la servila programaro estas valoro kiel ekz TPS (Taksoj per Servilo - tiktakoj por sekundo). Normale, 1 horloĝciklo estas egala al 50 ms. (1 sekundo de la reala mondo egalas al 20 tiktakoj de la ludmondo). Se la pretigo de unu iksodo pliiĝas al 60 sekundoj, la servila aplikaĵo estos fermita, elĵetante ĉiujn ludantojn.

La solvo estas limigi la mondon al certaj koordinatoj kaj fari preparan blokgeneradon. Tiel, ni forigas la bezonon de dinamika generacio dum la ludo, kaj la servilo nur bezonos legi ekzistantan mapon. Ambaŭ aferoj povas esti solvitaj per unu sola kromaĵo Monda Limo.

La plej facila maniero estas agordi la mondan limon en la formo de cirklo rilate al la genera punkto (kvankam vi povas fari ĝin de ajna formo) per unu komando:

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

Se la rolanto provas transiri la limon, li estos repuŝita plurajn blokojn. Se tio estas farita plurajn fojojn ene de limigita tempo, la leĝrompinto estos perforte teletransportita al la genera punkto. Antaŭgenerado de la mondo estas farita eĉ pli simple, kun la komando:

/wb fill

Ĉar ĉi tiu ago eble povus influi ludantojn sur la servilo, nepre konfirmu:

/wb confirm

Entute, daŭris proksimume 5000 horojn por generi mondon kun radiuso de 40 blokoj (~2 miliardoj da blokoj) sur procesoro Intel® Xeon® Gold 6240. Tial, se vi volas antaŭgeneri pli grandan mapon, konsciu, ke ĉi tiu procezo prenos sufiĉe da tempo, kaj la servilo TPS estos grave reduktita. Ankaŭ memoru, ke eĉ radiuso de 5000 blokoj postulos proksimume 2 GB da diskospaco.

Malgraŭ la fakto, ke la plej nova versio de la kromaĵo estis evoluigita por Minecraft-versio 1.14, oni eksperimente trovis, ke ĝi funkcias bonege en postaj versioj. Kompleta listo de komandoj kun klarigoj estas havebla sur la aldonaĵforumo.

Problemaj blokoj

Estas granda vario de blokoj en Minecraft. Tamen ni ŝatus atentigi la legantojn pri tia bloko kiel TNT. Kiel la nomo sugestas, ĉi tiu bloko estas eksplodaĵo (noto de la redaktoro - ĉi tio estas ludaĵo de la virtuala mondo kaj ĉi tiu objekto havas nenion kun realaj eksplodaĵoj). Ĝia propreco estas tia, ke en la momento de aktivigo la gravitforto komencas agi sur ĝi. Ĉi tio devigas la servilon kalkuli ĉiujn koordinatojn se en ĉi tiu momento la bloko komencas fali.

Se ekzistas pluraj TNT-blokoj, tiam la detonacio de unu bloko kaŭzas detonacion kaj la aktivigon de gravito en najbaraj blokoj, disigante ilin en ĉiuj direktoj. Ĉiuj ĉi tiuj belaj mekanikoj ĉe la servilo aspektas kiel multaj operacioj por kalkuli la trajektorion de ĉiu bloko, kaj ankaŭ interagado kun najbaraj blokoj. La tasko estas ege rimeda intensiva, kiun ĉiu povas facile kontroli. Generu kaj eksplodigu kubon el TNT-blokoj, kiu estas almenaŭ 30x30x30 grandeco. Kaj se vi pensis, ke vi havas bonan, potencan videoludan komputilon, vi tre eraris 😉

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

Optimumigo de Minecraft-servilo
Simila "eksperimento" sur servilo kun Intel® Xeon® Gold 6240 kondukis al serioza TPS-falo kaj 80% CPU-ŝarĝo dum la tuta bloka detonacio. Sekve, se iu ludanto kapablas fari ĉi tion, tiam la rendimenta problemo influos ĉiujn ludantojn sur la servilo.

Eĉ pli malfacila opcio - Randaj Kristaloj. Se TNT tamen eksplodas sinsekve, tiam la Edge Crystals eksplodas ĉiuj samtempe, kio en teorio povas tute ĉesigi la funkciadon de la servila aplikaĵo.

Ĉi tiu scenaro povas esti evitita nur per tute malpermesante la uzon de ĉi tiuj blokoj en la ludmondo. Ekzemple, uzante la kromprogramon Mondgardisto. Bonvolu noti, ke ĉi tiu kromaĵo per si mem ne funkcias sen alia kromaĵo Worldedit. Do instalu WorldEdit unue, kaj poste WorldGuard.

konkludo

Ĝuste administri ludservilon ne estas facila tasko. Malfacilaĵoj kaj malpliigo de rendimento atendos vin ĉiuflanke, precipe se vi ne konsideras la ludmekanikojn mem. Estas neeble antaŭvidi ĉion, ĉar ludantoj foje povas esti tre kreemaj provante devigi la servilon fari ion por kio ĝi ne estis destinita. Nur akceptebla ekvilibro inter riskoj kaj establitaj limigoj permesos al la servilo funkcii kontinue kaj ne redukti sian rendimenton al kritikaj valoroj.

Dum kvaranteno, kelkaj el niaj dungitoj maltrafis siajn plej ŝatatajn oficejojn kaj decidis rekrei ilin en Minecraft. Vi ankaŭ havas ŝancon veni viziti nin sen riski vian sanon aŭ perdi tempon sur la vojo.

Por fari tion, ni invitas ĉiujn al nia servilo minecraft.selectel.ru (klienta versio 1.15.2), kie la datumcentroj Tsvetochnaya-1 kaj Tsvetochnaya-2 estis rekreitaj. Ne forgesu konsenti elŝuti pliajn rimedojn, ili estas necesaj por ĝusta montrado de iuj lokoj.

Serĉoj, reklamaj kodoj, paskaj ovoj kaj agrabla komunikado atendas vin.

fonto: www.habr.com

Aldoni komenton