Minecraft-serveroptimering

Minecraft-serveroptimering
På vår blogg har vi redan sa, hur du skapar din egen Minecraft-server, men 5 år har gått sedan dess och mycket har förändrats. Vi delar med dig av aktuella sätt att skapa och optimera serverdelen av ett så populärt spel.

Under sin 9-åriga historia (räknat från släppdatumet) har Minecraft fått ett fantastiskt antal fans och hatare bland både vanliga spelare och nördar. Det enkla konceptet med en värld gjord av block har utvecklats från en enkel form av underhållning till ett universellt medium för att kommunicera och skapa olika objekt från den verkliga världen.

Förutom konstruktion har spelet förmågan att skapa logik, som låter dig implementera fullfjädrade algoritmer i Minecraft. YouTube är fullt av mycket imponerande videor där människor, som har lagt ner en enorm ansträngning och spenderat mycket tid, har skapat en kopia av den eller den elektroniska enheten eller byggt en detaljerad kopia existerande и fiktiva arkitektoniska strukturer. Allt begränsas endast av spelarens fantasi och speluniversumets möjligheter.


Men låt oss inte prata mer om exakt vad spelarna skapar, utan låt oss titta på serverdelen av applikationen och lyfta fram de problem (ibland mycket komplexa) som kan uppstå under drift under belastning. Låt oss göra en reservation direkt att vi bara kommer att prata om Java Edition.

Typer av servrar

Det enklaste alternativet är en server inbyggd i spelklienten. Vi skapade en värld, tryckte på en knapp och servern blev tillgänglig över det lokala nätverket. Detta alternativ kan inte motstå någon allvarlig belastning, och därför kommer vi inte ens att överväga det.

Vanilla

Mojang Studios distribuerar serverdelen av spelet som en Java-applikation gratis på den officiella webbplatsen. Detta gör att du kan skapa din egen dedikerad server och personlig värld, vilket gör den tillgänglig för anslutning från var som helst på planeten. För dem som gör det här för första gången finns det en stor handledning, tillgänglig på motsvarande spelwiki.

Detta tillvägagångssätt har en allvarlig nackdel, nämligen bristen på färdiga möjligheter för att ansluta plugins som utökar serverns funktionalitet och tillåter inte bara att automatisera många processer, utan också att optimera prestanda. Dessutom har den officiella servern en ganska stor RAM-förbrukning för varje ansluten spelare.

bukkit

En serverapplikation skapad av entusiaster baserad på Vanilla-versionen bukkit utökade spelets kapacitet avsevärt genom att stödja plugins och modifieringar (modifieringar). Det tillät inte bara att lägga till nya block till spelet, utan också att utföra olika manipulationer som var otillgängliga för vaniljprogramvara. Intressant nog krävde denna applikation betydligt mindre minne.

Att installera Bukkit är inte svårt; motsvarande instruktioner finns på resursen GamePedia. Men detta är ingen mening, eftersom Bukkit-teamet har upplösts sedan 2014, projektutvecklarna har blivit anställda i Mojang Studios, och förvaret övergiven. Därmed är Bukkit faktiskt död, och det är vettigt att uppmärksamma de kommande två projekten.

SpigotMC

För att göra livet enklare för plugin-utvecklare fanns det ett behov av ett API för att interagera med spelvärlden. Det är just detta problem som skaparna löste. Tapp, tar Bukkit-kärnan och omarbetar den för att uppnå bättre tillförlitlighet och prestanda. Ändå, Git repository projektet blockerades på grund av Digital Millennium Copyright Act (DMCA), och det är omöjligt att ladda ner källkoden därifrån.

För närvarande utvecklas och används SpigotMC aktivt. Den stöder alla plugins som skapats för Bukkit, men är inte bakåtkompatibel med den. För att komma runt DMCA Takedown uppfanns en elegant metod som heter BuildTools. Detta verktyg eliminerar behovet av att distribuera en kompilerad applikation och tillåter användare att kompilera Spigot, CraftBukkit och Bukkit från källkoden. Allt detta gör DMCA-förbudet värdelöst.

PaperMC

Allt verkade coolt och Spigot blev ett bra alternativ. Men detta räckte inte för vissa entusiaster, och de skapade sin egen gaffel av Spigot "på steroider." På projektsida den viktigaste fördelen är att "det är dumt snabbt". Tagit fram gemenskap låter dig snabbt lösa nya problem, och det utökade API:et låter dig skapa intressanta plugins. Du kan starta PaperMC med ett enkelt kommando, givet in dokumentation.

PaperMC har utmärkt kompatibilitet, så plugins skrivna för SpigotMC kan enkelt fungera på PaperMC, men utan officiellt stöd. Bakåtkompatibilitet med SpigotMC finns också. Nu när vi har listat de olika alternativen för att skapa en server, låt oss gå vidare till de prestandaproblem som kan uppstå.

Problem och lösningar

Det viktigaste du behöver förstå är att allt relaterat till bearbetning av spelvärlden endast kommer att bearbetas på en datorkärna på den fysiska servern. Så om du plötsligt har en utmärkt server med ett dussin datorkärnor, kommer bara en att laddas. Alla andra kommer att vara praktiskt taget inaktiva. Det här är applikationens arkitektur och det finns inget du kan göra åt det. Så när du väljer en server bör du vara uppmärksam inte på antalet kärnor, utan på klockfrekvensen. Ju högre den är, desto bättre blir prestandan.

När det gäller frågan om RAM-kapacitet bör vi utgå från följande indikatorer:

  • planerat antal spelare;
  • planerat antal världar på servern;
  • storleken på varje värld.

Man bör komma ihåg att en Java-applikation alltid behöver en reserv av RAM. Om du räknar med en minnesförbrukning på 8 gigabyte så behöver du faktiskt ha 12. Siffrorna är relativa, men essensen förändras inte.

För att starta serverdelen rekommenderar vi att du använder flaggorna som anges i artikeln Justera JVM – G1GC Garbage Collector Flags för Minecraft. Denna "svarta magi" tillåter servern att korrekt konfigurera "sopsamlaren" och optimera användningen av RAM. Du bör inte allokera mer minne än vad servern faktiskt förbrukar under den maximala tillströmningen av spelare.

Generera en blockkarta

"Tror du verkligen att månen bara existerar när du tittar på den?" (Albert Einstein)

Helt ny server. Så snart spelaren lyckas ansluta för första gången, dyker spelkaraktären upp vid den allmänna samlingspunkten (spawn). Detta är det enda stället där spelvärlden är förgenererad av servern. I samma ögonblick tittar klientdelen på inställningarna, och nyckelparametern är ritningsavståndet. Det mäts i bitar (kartområdet är 16×16 och 256 block högt) Hur många bitar som anges är exakt hur många som kommer att begäras från servern.

Servern lagrar en global karta över världen, och om det inte finns några genererade block i den ännu när spelkaraktären dyker upp, genererar servern dem dynamiskt och lagrar dem. Detta kräver inte bara stora datorresurser, utan det ökar också hela tiden storleken på världskartan. På en av de äldsta anarkistiska servrarna 2b2t (2builders2tools) Kartans storlek har redan överskridit 8 Tb, och världens gräns ligger på cirka 30 miljoner block. Det finns tusentals berättelser förknippade med denna server och den förtjänar en egen artikel i serien.

Att skapa en värld runt en spelare är inget problem. Att skapa en värld runt hundratals spelare kommer att orsaka mindre servernedgångar under en kort tid, varefter belastningen kommer att minska. Att generera en värld på ett klientåtergivningsavstånd runt tusen spelare är redan kapabelt att "släppa" servern och kasta alla klienter ur den på grund av en timeout.

I servermjukvaran finns ett värde som t.ex TPS (Ticks per Server - ticks per second). Normalt är 1 klockcykel lika med 50 ms. (1 sekund av den verkliga världen är lika med 20 bockar av spelvärlden). Om bearbetningen av en bock ökar till 60 sekunder kommer serverapplikationen att stängas och alla spelare kastas ut.

Lösningen är att begränsa världen till vissa koordinater och utföra preliminär blockgenerering. Således tar vi bort behovet av dynamisk generering under spelets gång, och servern behöver bara läsa en befintlig karta. Båda problemen kan lösas med en enda plugin Världsgräns.

Det enklaste sättet är att sätta världsgränsen i form av en cirkel i förhållande till spawn-punkten (även om du kan göra den av vilken form som helst) med ett kommando:

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

Om spelarkaraktären försöker passera gränsen kommer han att tryckas tillbaka flera block. Om detta görs flera gånger inom en begränsad tid, kommer gärningsmannen att med tvång teleporteras till spawn-punkten. Förgenerering av världen görs ännu enklare, med kommandot:

/wb fill

Eftersom denna åtgärd potentiellt kan påverka spelare på servern, var noga med att bekräfta:

/wb confirm

Totalt tog det cirka 5000 timmar att generera en värld med en radie på 40 block (~2 miljarder block) på en Intel® Xeon® Gold 6240-processor. Därför, om du vill förgenerera en större karta, var medveten om att denna process kommer att ta en anständig tid och serverns TPS kommer att reduceras avsevärt. Kom också ihåg att även en radie på 5000 block kommer att kräva cirka 2 GB diskutrymme.

Trots att den senaste versionen av pluginet utvecklades för Minecraft version 1.14 fann man experimentellt att den fungerar utmärkt på efterföljande versioner. En komplett lista med kommandon med förklaringar finns tillgänglig på plugin-forumet.

Problemblock

Det finns ett stort utbud av block i Minecraft. Vi vill dock uppmärksamma läsarna på ett sådant block som TNT. Som namnet antyder är detta block ett sprängämne (redaktörens anmärkning - det här är ett spelobjekt från den virtuella världen och det här föremålet har inget med riktiga sprängämnen). Dess egenhet är sådan att tyngdkraften i aktiveringsögonblicket börjar verka på den. Detta tvingar servern att beräkna alla koordinater om blocket i detta ögonblick börjar falla.

Om det finns flera TNT-block, orsakar detonationen av ett block detonation och aktivering av gravitationen i angränsande block, vilket sprider dem i alla riktningar. All denna vackra mekanik på serversidan ser ut som många operationer för att beräkna banan för varje block, såväl som interaktion med närliggande block. Uppgiften är extremt resurskrävande, vilket vem som helst enkelt kan kontrollera. Generera och detonera en kub från TNT-block som är minst 30x30x30 i storlek. Och om du trodde att du hade en bra, kraftfull speldator så hade du fel 😉

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

Minecraft-serveroptimering
Ett liknande "experiment" på en server med Intel® Xeon® Gold 6240 ledde till ett allvarligt TPS-fall och 80 % CPU-belastning under hela blockdetonationstiden. Därför, om någon spelare kan göra detta, kommer prestandaproblemet att påverka alla spelare på servern.

Ett ännu tuffare alternativ - Kantkristaller. Om TNT trots allt exploderar sekventiellt, detonerar Edge Crystals alla samtidigt, vilket i teorin helt kan stoppa driften av serverapplikationen.

Detta scenario kan bara undvikas genom att helt förbjuda användningen av dessa block i spelvärlden. Till exempel genom att använda plugin WorldGuard. Observera att detta plugin i sig inte fungerar utan ett annat plugin WorldEdit. Så installera WorldEdit först och sedan WorldGuard.

Slutsats

Att hantera en spelserver på rätt sätt är ingen lätt uppgift. Svårigheter och minskad prestanda kommer att vänta dig vid varje tur, speciellt om du inte tar hänsyn till själva spelmekaniken. Det är omöjligt att förutse allt eftersom spelare ibland kan vara väldigt kreativa när de försöker tvinga servern att göra något som det inte var avsett för. Endast en rimlig balans mellan risker och etablerade restriktioner kommer att tillåta servern att fungera kontinuerligt och inte minska dess prestanda till kritiska värden.

Under karantänen missade några av våra anställda sina favoritkontor och bestämde sig för att återskapa dem i Minecraft. Du har också en chans att komma och besöka oss utan att riskera din hälsa eller slösa tid på vägen.

För att göra detta bjuder vi in ​​alla till vår server minecraft.selectel.ru (klientversion 1.15.2), där datacenterna Tsvetochnaya-1 och Tsvetochnaya-2 återskapades. Glöm inte att gå med på att ladda ner ytterligare resurser, de är nödvändiga för korrekt visning av vissa platser.

Uppdrag, kampanjkoder, påskägg och trevlig kommunikation väntar på dig.

Källa: will.com

Lägg en kommentar