
På vores blog har vi allerede , hvordan man opretter sin egen Minecraft-server, men siden da er der gået 5 år, og meget er ændret. Vi deler de mest aktuelle metoder til oprettelse og optimering af serverdelen af dette populære spil med dig.
I løbet af sin 9-årige historie (hvis man tæller fra udgivelsesdatoen) har Minecraft tjent et fantastisk antal tilhængere og kritikere blandt både almindelige spillere og nørder. Den enkle koncept af en verden af blokke er blevet forvandlet fra almindelig underholdning til et universelt miljø for interaktion og skabelse af forskellige objekter fra den virkelige verden.
Udover byggeri har spillet muligheden for at skabe , som gør det muligt at implementere fuldgyldige algoritmer indenfor Minecraft. Der er masser af imponerende videoer på YouTube, hvor folk, efter at have lagt en enorm mængde arbejde og tid, har skabt en kopi af en eller anden elektronisk enhed eller bygget en detaljeret kopi af og arkitektoniske strukturer. Alt er begrænset kun af spillerens fantasi og spilleverdenens muligheder.

Men lad os ikke længere tale om, hvad spillerne skaber, og se nærmere på serverdelen af applikationen og belyse de problemer (nogle gange meget komplekse), som kan opstå under belastning. Vi nævner straks, at vi kun vil tale om Java Edition.
Typer af servere
Den enkleste mulighed er en server, der er indbygget i spilklienten. Skab en verden, klik på en knap, og nu er serveren tilgængelig via det lokale netværk. En sådan mulighed kan ikke håndtere nogen alvorlig belastning, så vi vil ikke engang overveje den.
Vanilla
Mojang Studios distribuerer serverdelen af spillet som en gratis Java-applikation. Det giver mulighed for at oprette sin egen personlige verden og gøre den tilgængelig for forbindelse fra enhver del af kloden. For dem, der gør det for første gang, er der en fremragende , som er tilgængelig i den relevante spil-Wiki.
Denne tilgang har en alvorlig ulempe, nemlig manglen på „out-of-the-box“ muligheder for at tilslutte plugins, der udvider serverens funktionalitet og muliggør automatisering af mange processer samt optimering af ydeevnen. Derudover har den officielle server et ret stort forbrug af hukommelse pr. tilsluttet spiller.
Bukkit
Det serverprogram, der er skabt af entusiaster baseret på Vanilla-versionen, , udvidede betydeligt spillets muligheder ved at støtte plugins og mods (modifikationer). Det gjorde det muligt ikke kun at tilføje nye blokke til gameplayet, men også at udføre forskellige manipulationer, der ikke er tilgængelige i det vanille program. Interessant nok krævede denne applikation betydeligt mindre hukommelse.
At installere Bukkit er ikke særligt besværligt; der er vejledninger til det på ressourcen . Men det giver ikke mening, da Bukkit-teamet blev opløst i 2014, og udviklerne blev ansat hos Mojang Studios, og projektet er blevet forladt. Derfor er Bukkit faktisk død, og det giver mening at fokusere på de to næste projekter.
SpigotMC
For at lette livet for plugin-udviklere var der behov for et API til at interagere med spilverdenen. Dette problem blev løst af skaberne af , der tog udgangspunkt i Bukkit-kernen og omarbejdede den for at opnå bedre pålidelighed og ydeevne. Ikke desto mindre, projektet blev blokeret i henhold til Digital Millennium Copyright Act (), og det er ikke muligt at downloade kildekoden derfra.
I øjeblikket udvikles SpigotMC aktivt og anvendes. Det understøtter alle plugins, der er skabt til Bukkit, men det er ikke bagudkompatibelt. For at omgå DMCA Takedown-forbuddet blev der udviklet en elegant løsning kaldet BuildTools. Dette værktøj fjerner behovet for distribution af den kompilerede applikation og tillader brugere at kompilere Spigot, CraftBukkit og Bukkit fra kildekoden. Alt dette gør DMCA-forbuddet nytteløst.
PaperMC
Det ser ud til, at alt er fantastisk, og Spigot er blevet et fremragende valg. Men nogle entusiaster mente, at det var for lidt, og de lavede deres egen fork af Spigot „på steroider“. På den vigtigste styrke er angivet, at “It’s stupid fast.” Et udviklet giver dig mulighed for hurtigt at løse opståede problemer, og det udvidede API gør det muligt at lave interessante plugins. Du kan starte PaperMC med en enkel kommando, som angivet i .
Med hensyn til kompatibilitet fungerer PaperMC fint, så de plugins, der er skrevet til SpigotMC, vil let fungere på PaperMC, men uden officiel support. Bagudkompatibilitet med SpigotMC er også til stede. Nu hvor vi har opregnet forskellige måder at oprette en server på, lad os gå videre til de ydeevneproblemer, der kan opstå.
Problemer og løsninger
Det vigtigste at forstå er, at alt, hvad der drejer sig om behandling af spilverdener, kun vil blive behandlet på en enkelt fysisk serverkerne. Så hvis du har en fantastisk server med et dusin beregningskerner, vil kun én være aktiv. Alle de andre vil rent faktisk være inaktive. Sådan er applikationens arkitektur, og der er ikke noget, du kan gøre ved det. Når du vælger server, bør du derfor ikke fokusere på antallet af kerner, men på clockfrekvensen. Jo højere den er, desto bedre bliver ydeevnen.
Når det kommer til spørgsmålet om RAM-størrelse, bør du tage udgangspunkt i følgende faktorer:
- det planlagte antal spillere;
- det planlagte antal verdener på serveren;
- størrelsen af hver verden.
Det er vigtigt at huske, at Java-applikationer altid har brug for et overskud af RAM. Hvis du forventer et forbrug på 8 gigabyte, skal du faktisk have 12. Tallene er vejledende, men essensen ændres ikke.
Til opstart af serverdelen anbefaler vi at benytte de flag, der er angivet i artiklen . Denne 'mørke magi' giver serveren mulighed for at indstille 'garbage collector' korrekt og optimerer brugen af RAM. Det er ikke en god idé at tildele mere hukommelse, end serveren reelt bruger ved spidsbelastning.
Generering af blokkort
“Tror du virkelig, at Månen kun eksisterer, når du ser på den?” (Albert Einstein)
En helt ny server. Når en spiller første gang forbinder sig, vises spillekarakteren på det fælles samlingspunkt (spawn). Dette er det eneste sted, hvor spillets verden forudgenereres af serveren. Samtidig kigger klientdelen i indstillingerne, og en nøgleværdi er synsafstanden. Den måles i chunks (et område på kortet på 16x16 og 256 blokke højt). Hvor mange chunks der er angivet, vil serveren anmode om.
Serveren opbevarer det globale verdenskort, og hvis der endnu ikke er genererede blokke på punktet, hvor spillekarakteren spawner, vil serveren dynamisk generere dem og gemme dem. Ikke nok med at dette kræver store beregningsressourcer, det øger også konstant størrelsen på verdenskortet. På en af de ældste anarkistiske servere (2builders2tools) har kortets størrelse allerede overskredet 8 Tb, og verdensgrænsen går ved 30 millioner blokke. Denne server er forbundet med tusindvis af historier og fortjener en særskilt artikel eller serie af artikler.
Verdensgenerering omkring én spiller er ikke et problem. Verdensgenerering omkring hundrede spillere vil forårsage små forsinkelser i serveren i en kort periode, hvorefter belastningen vil falde. Verdensgenerering på synsafstanden omkring tusinde spillere kan allerede 'kollapse' serveren og smide alle klienter af ved timeout.
I serverprogramvaren findes der en værdi kaldet TPS (Ticks per Server — ticks pr. sekund). Som standard svarer 1 tick til 50 ms. (1 sekund i den virkelige verden svarer til 20 ticks i spillets verden). Hvis behandlingen af et tick vokser til 60 sekunder, lukkes serverapplikationen, og alle spillere smides af.
Løsningen er at begrænse verden inden for bestemte koordinater og udføre forudgående generering af blokke. På den måde undgår vi behovet for dynamisk generering under gameplay, og serveren behøver kun at læse det eksisterende kort. Begge problemer løses med et enkelt plugin .
Det bedste er at angive verdensgrænsen som en cirkel omkring spawnpunktet (selvom den kan laves i enhver form) med en enkelt kommando:
/wb set <радиус в блоках> spawnHvis en spillkarakter forsøger at krydse grænsen, vil den blive sendt tilbage flere blokke. Hvis dette gøres flere gange inden for en begrænset tid, vil forseeren blive tvunget til at teleportere til spawnpunktet. Forudgenerering af verden udføres endnu simplere med kommandoen:
/wb fillDa denne handling potentielt kan påvirke spillere, der er på serveren, glem ikke at bekræfte udførelsen:
/wb confirmI alt tog det cirka 2 timer at generere en verden med en radius på 5000 blokke (~40 mia. blokke) på en Intel® Xeon® Gold 6240-processor. Derfor, hvis du ønsker at starte prægenereringen af et større kort, skal du tage højde for, at denne proces vil tage en betydelig tid, og TPS for serveren vil blive alvorligt nedsat. Husk også, at selv en radius på 5000 blokke vil kræve omkring 2 GB plads på harddisken.
Selvom den seneste version af pluginnet blev udviklet til Minecraft version 1.14, er det erfaret, at det fungerer glimrende på efterfølgende versioner. En fuld liste over kommandoer med forklaringer findes .
Problemer med blokke
Der findes et væld af bloktyper i Minecraft. Men vi vil gerne fokusere læserens opmærksomhed på en blok som TNT. Som navnet antyder, er denne blok en sprængstof (redaktionens bemærkning — dette er en spili genstand i den virtuelle verden og har intet at gøre med virkelige eksplosiver). Dens særlige egenskab er, at når den aktiveres, begynder tyngdekraften at påvirke den. Dette tvinger serveren til at beregne alle koordinaterne, hvis blokken begynder at falde på dette tidspunkt.
Hvis der er flere TNT-blokke, vil detonationen af en blok forårsage detonationen og aktiveringen af tyngdekraften hos nærliggende blokke, hvilket spreder dem i alle retninger. Hele denne smukke mekanik på serverens side ser ud som mange operationer til at beregne hver af blokkens baner samt interaktion med nærliggende blokke. Opgaven er ekstremt ressourcekrævende, hvilket alle nemt kan bekræfte. Generer og spræng en kube af TNT-blokke, der er mindst 30x30x30. Og hvis du troede, at du havde en god kraftfuld gamingcomputer, så tog du meget fejl 😉
/fill ~ ~ ~ ~30 ~30 ~30 minecraft:tnt 
Et lignende "eksperiment" på en server med Intel® Xeon® Gold 6240 førte til en alvorlig "nedgang" i TPS og 80% CPU-belastning under hele blokdetonationen. Hvis nogen af spillerne lykkes med at gøre det samme, vil præstationsproblemet påvirke alle spillere, der er på serveren.
En endnu mere striks version — Endestenskristaller. Hvis TNT detonerer sekventielt, detonerer Endestenskristallerne alle på én gang, hvilket teoretisk kan stoppe serverapplikationen helt.
Denne situation kan undgås ved helt at forbyde brugen af disse blokke i spillet. For eksempel ved hjælp af pluginet . Vær opmærksom på, at dette plugin ikke fungerer uden et andet plugin, . Så installer først WorldEdit, og derefter WorldGuard.
Konklusion
Korrekt administration af en spilserver er ikke en nem opgave. Udfordringer og fald i ydeevnen vil vente på hvert skridt, især hvis man ikke tager hensyn til selve spilmekanikken. Det er umuligt at forudse alt, da spillere nogle gange er meget opfindsomme i deres forsøg på at få serveren til at udføre det, den ikke var designet til. Kun en fornuftig balance mellem risici og pålagte begrænsninger vil gøre det muligt for serveren at fungere kontinuerligt uden at sænke ydeevnen til kritiske niveauer.
Under karantænen længtes nogle af vores medarbejdere efter deres elskede kontorer og besluttede at genskabe dem i Minecraft. Du har også mulighed for at besøge os uden at risikere dit helbred og uden at spilde tid på transport.
Vi inviterer derfor alle interesserede til vores server minecraft.selectel.ru (klientversion 1.15.2), hvor datacentrerne Flower-1 og Flower-2 er genskabt. Husk at acceptere download af ekstra ressourcer, da de er nødvendige for korrekt visning af nogle lokationer.
Du kan se frem til quests, rabatkoder, "påskeæg" og hyggelig samtale.
Kilde: habr.com
