Optimalisatie van Minecraft-servers

Optimalisatie van Minecraft-servers
Op onze blog hebben we dat al gedaan vertelde, hoe je je eigen Minecraft-server kunt maken, maar sindsdien zijn er 5 jaar verstreken en is er veel veranderd. We delen huidige manieren met u om het servergedeelte van zo'n populair spel te maken en te optimaliseren.

Gedurende zijn 9-jarige geschiedenis (gerekend vanaf de releasedatum) heeft Minecraft een verbazingwekkend aantal fans en haters verdiend onder zowel gewone spelers als nerds. Het eenvoudige concept van een wereld gemaakt van blokken is geëvolueerd van een eenvoudige vorm van entertainment naar een universeel medium voor communicatie en het creëren van verschillende objecten uit de echte wereld.

Naast constructie heeft de game ook de mogelijkheid om te creëren logica, waarmee u volwaardige algoritmen in Minecraft kunt implementeren. YouTube staat vol met zeer indrukwekkende video's waarin mensen, na enorm veel moeite en tijd te hebben gestoken, een kopie van dit of dat elektronische apparaat hebben gemaakt of een gedetailleerde kopie hebben gebouwd bestaande и fictief architecturale structuren. Alles wordt alleen beperkt door de verbeeldingskracht van de gamer en de mogelijkheden van het gaminguniversum.


Maar laten we niet verder praten over wat de spelers precies maken, maar laten we naar het servergedeelte van de applicatie kijken en de problemen benadrukken (soms zeer complex) die kunnen optreden tijdens gebruik onder belasting. Laten we meteen reserveren dat we het alleen over de Java-editie zullen hebben.

Soorten servers

De eenvoudigste optie is een server die in de gameclient is ingebouwd. We creëerden een wereld, drukten op één knop en de server werd toegankelijk via het lokale netwerk. Deze optie is niet bestand tegen een ernstige belasting en daarom zullen we er niet eens over nadenken.

Vanille

Mojang Studios distribueert het servergedeelte van het spel gratis als Java-applicatie op de officiële website. Hierdoor kunt u uw eigen creëren toegewijde server en persoonlijke wereld, waardoor deze overal ter wereld toegankelijk is voor verbinding. Voor degenen die dit voor de eerste keer doen, is er een geweldig zelfstudie, beschikbaar op de overeenkomstige gaming-wiki.

Deze aanpak heeft één ernstig nadeel, namelijk het ontbreken van kant-en-klare mogelijkheden om plug-ins aan te sluiten die de functionaliteit van de server uitbreiden en niet alleen veel processen kunnen automatiseren, maar ook de prestaties kunnen optimaliseren. Bovendien heeft de officiële server een vrij groot RAM-verbruik voor elke aangesloten speler.

bukkit

Een serverapplicatie gemaakt door enthousiastelingen op basis van de Vanilla-versie bukkit heeft de mogelijkheden van het spel aanzienlijk uitgebreid door plug-ins en mods (aanpassingen) te ondersteunen. Het maakte het niet alleen mogelijk om nieuwe blokken aan de gameplay toe te voegen, maar ook om verschillende manipulaties uit te voeren die niet toegankelijk waren voor gewone software. Interessant is dat deze applicatie aanzienlijk minder geheugen nodig had.

Het installeren van Bukkit is niet moeilijk; de bijbehorende instructies staan ​​op de bron GamePedia. Maar dit heeft geen zin, aangezien sinds 2014 het Bukkit-team is ontbonden, de projectontwikkelaars werknemers zijn geworden van Mojang Studios, en opslagplaats verlaten. Bukkit is dus feitelijk dood en het is logisch om aandacht te besteden aan de volgende twee projecten.

SpigotMC

Om het leven van plug-inontwikkelaars gemakkelijker te maken, was er behoefte aan een API voor interactie met de gamewereld. Dit is precies het probleem dat de makers hebben opgelost. zwikje, door de Bukkit-kern te nemen en deze te herwerken om betere betrouwbaarheid en prestaties te bereiken. Hoe dan ook, Git-opslagplaats het project werd geblokkeerd vanwege de Digital Millennium Copyright Act (DMCA), en het is onmogelijk om de broncode vanaf daar te downloaden.

Momenteel wordt SpigotMC actief ontwikkeld en gebruikt. Het ondersteunt alle plug-ins die voor Bukkit zijn gemaakt, maar is er niet achterwaarts compatibel mee. Om de DMCA Takedown te omzeilen, is een elegante methode genaamd BuildTools uitgevonden. Deze tool elimineert de noodzaak om een ​​gecompileerde applicatie te distribueren en stelt gebruikers in staat Spigot, CraftBukkit en Bukkit te compileren vanuit de broncode. Dit alles maakt het DMCA-verbod nutteloos.

PapierMC

Alles leek cool en Spigot werd een geweldige optie. Maar dit was voor sommige enthousiastelingen niet genoeg, en ze creëerden hun eigen vork van Spigot ‘op steroïden’. Op projectpagina het belangrijkste voordeel is dat "het stom snel is". Ontwikkeld gemeenschap Hiermee kunt u opkomende problemen snel oplossen en met de uitgebreide API kunt u interessante plug-ins maken. U kunt PaperMC starten met één eenvoudig commando, gegeven in documentatie.

PaperMC heeft uitstekende compatibiliteit, dus plug-ins die voor SpigotMC zijn geschreven, kunnen gemakkelijk op PaperMC werken, maar zonder officiële ondersteuning. Achterwaartse compatibiliteit met SpigotMC is ook aanwezig. Nu we de verschillende opties voor het maken van een server hebben opgesomd, gaan we verder met de prestatieproblemen die zich kunnen voordoen.

Problemen en oplossingen

Het belangrijkste dat u moet begrijpen, is dat alles wat met de verwerking van de spelwereld te maken heeft, slechts op één computerkern van de fysieke server wordt verwerkt. Dus als je plotseling een uitstekende server hebt met een tiental rekenkernen, dan wordt er maar één geladen. Alle anderen zullen vrijwel inactief zijn. Dit is de architectuur van de applicatie en u kunt er niets aan doen. Let bij het kiezen van een server dus niet op het aantal kernen, maar op de klokfrequentie. Hoe hoger deze is, hoe beter de prestaties zullen zijn.

Wat de kwestie van de RAM-capaciteit betreft, moeten we uitgaan van de volgende indicatoren:

  • gepland aantal spelers;
  • gepland aantal werelden op de server;
  • de grootte van elke wereld.

Houd er rekening mee dat een Java-applicatie altijd een RAM-reserve nodig heeft. Verwacht je een geheugengebruik van 8 gigabyte, dan heb je er eigenlijk 12 nodig. De cijfers zijn relatief, maar de essentie verandert niet.

Om het servergedeelte te starten, raden we aan de vlaggen te gebruiken die in het artikel zijn gespecificeerd De JVM afstemmen – G1GC Garbage Collector-vlaggen voor Minecraft. Deze “zwarte magie” zorgt ervoor dat de server de “garbage collector” correct kan configureren en het gebruik van RAM kan optimaliseren. U moet niet meer geheugen toewijzen dan de server daadwerkelijk verbruikt tijdens de piekinstroom van spelers.

Het genereren van een blokkaart

“Denk je echt dat de maan alleen bestaat als je ernaar kijkt?” (Albert Einstein)

Compleet nieuwe server. Zodra de speler voor de eerste keer succesvol verbinding maakt, verschijnt het spelpersonage op het algemene verzamelpunt (spawn). Dit is de enige plaats waar de spelwereld vooraf wordt gegenereerd door de server. Op hetzelfde moment kijkt het klantgedeelte naar de instellingen en de belangrijkste parameter is de tekenafstand. Het wordt gemeten in chunks (het kaartgebied is 16×16 en 256 blokken hoog). Hoeveel chunks daar worden aangegeven, is precies hoeveel er bij de server wordt opgevraagd.

De server slaat een globale kaart van de wereld op, en als er nog geen gegenereerde blokken in zitten op het moment dat het spelpersonage verschijnt, genereert de server deze dynamisch en slaat deze op. Dit vereist niet alleen grote computerbronnen, maar vergroot ook voortdurend de omvang van de wereldkaart. Op een van de oudste anarchistische servers 2b2t (2builders2tools) De grootte van de kaart is al groter dan 8 Tb en de grens van de wereld ligt op ongeveer 30 miljoen blokken. Er zijn duizenden verhalen verbonden aan deze server en deze verdient een eigen artikel in de serie.

Het genereren van een wereld rond één speler is geen probleem. Het genereren van een wereld rond honderden spelers zal korte tijd kleine serververtragingen veroorzaken, waarna de belasting zal afnemen. Het genereren van een wereld op clientweergaveafstand van ongeveer duizend spelers is al in staat om de server te 'laten vallen' en alle clients eruit te gooien vanwege een time-out.

In de serversoftware is er een waarde zoals TPS (Tikken per server - tikken per seconde). Normaal gesproken is 1 klokcyclus gelijk aan 50 ms. (1 seconde van de echte wereld is gelijk aan 20 tikken van de spelwereld). Als de verwerking van één tik toeneemt tot 60 seconden, wordt de serverapplicatie gesloten en worden alle spelers weggegooid.

De oplossing is om de wereld te beperken tot bepaalde coördinaten en een voorlopige blokgeneratie uit te voeren. Zo elimineren we de noodzaak voor dynamische generatie tijdens het spel, en hoeft de server alleen een bestaande kaart te lezen. Beide problemen kunnen met één enkele plug-in worden opgelost Wereldgrens.

De eenvoudigste manier is om de wereldgrens in de vorm van een cirkel in te stellen ten opzichte van het spawnpunt (hoewel je deze elke vorm kunt geven) met één commando:

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

Als het personage van de speler de grens probeert over te steken, wordt hij verschillende blokken teruggeduwd. Als dit binnen een beperkte tijd meerdere keren wordt gedaan, wordt de overtreder met geweld naar het spawnpunt geteleporteerd. Het vooraf genereren van de wereld gaat nog eenvoudiger, met het commando:

/wb fill

Aangezien deze actie mogelijk gevolgen kan hebben voor spelers op de server, moet u het volgende bevestigen:

/wb confirm

In totaal duurde het ongeveer 5000 uur om een ​​wereld met een straal van 40 blokken (~2 miljard blokken) te genereren op een Intel® Xeon® Gold 6240-processor. Als u dus vooraf een grotere kaart wilt genereren, houd er dan rekening mee dat dit proces zal een behoorlijke hoeveelheid tijd in beslag nemen en de TPS van de server zal ernstig worden verminderd. Bedenk ook dat zelfs een straal van 5000 blokken ongeveer 2 GB schijfruimte nodig heeft.

Ondanks het feit dat de nieuwste versie van de plug-in is ontwikkeld voor Minecraft versie 1.14, is experimenteel gebleken dat deze uitstekend werkt in volgende versies. Er is een volledige lijst met opdrachten met uitleg beschikbaar op het plug-inforum.

Probleem blokken

Er is een grote verscheidenheid aan blokken in Minecraft. We willen echter de aandacht van de lezers vestigen op een dergelijk blok als TNT. Zoals de naam al doet vermoeden, is dit blok een explosief (Noot van de redactie - dit is een game-item van de virtuele wereld en dit item heeft niets met echte explosieven). Het bijzondere is dat op het moment van activering de zwaartekracht erop begint te werken. Dit dwingt de server om alle coördinaten te berekenen als op dit moment het blok begint te vallen.

Als er meerdere TNT-blokken zijn, veroorzaakt de ontploffing van één blok ontploffing en activering van de zwaartekracht in aangrenzende blokken, waardoor deze in alle richtingen worden verspreid. Al deze prachtige mechanismen aan de serverzijde lijken op veel bewerkingen om het traject van elk blok te berekenen, evenals de interactie met aangrenzende blokken. De taak vergt extreem veel middelen, wat iedereen gemakkelijk kan controleren. Genereer en laat een kubus van TNT-blokken tot ontploffing komen die minimaal 30x30x30 groot is. En als je dacht dat je een goede, krachtige spelcomputer had, dan heb je het flink mis 😉

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

Optimalisatie van Minecraft-servers
Een soortgelijk ‘experiment’ op een server met Intel® Xeon® Gold 6240 leidde tot een ernstige TPS-daling en 80% CPU-belasting gedurende de gehele blokdetonatietijd. Als een speler dit kan, zal het prestatieprobleem dus gevolgen hebben voor alle spelers op de server.

Een nog moeilijkere optie - Randkristallen. Mocht TNT toch opeenvolgend ontploffen, dan ontploffen de Edge Crystals allemaal tegelijk, wat in theorie de werking van de serverapplicatie volledig kan stilleggen.

Dit scenario kan alleen worden vermeden door het gebruik van deze blokken in de spelwereld volledig te verbieden. Gebruik bijvoorbeeld de plug-in wereldwacht. Houd er rekening mee dat deze plug-in op zichzelf niet werkt zonder een andere plug-in Wereld. Installeer dus eerst WorldEdit en daarna WorldGuard.

Conclusie

Het goed beheren van een gameserver is geen gemakkelijke taak. Moeilijkheden en verminderde prestaties zullen je bij elke beurt te wachten staan, vooral als je geen rekening houdt met de gameplay-mechanica zelf. Het is onmogelijk om alles te voorzien, omdat spelers soms heel creatief kunnen zijn in het proberen de server te dwingen iets te doen waarvoor deze niet bedoeld is. Alleen een redelijk evenwicht tussen risico's en vastgestelde beperkingen zorgt ervoor dat de server continu kan functioneren en de prestaties niet tot kritische waarden kan terugbrengen.

Tijdens de quarantaine misten sommige van onze medewerkers hun favoriete kantoren en besloten ze deze opnieuw te creëren in Minecraft. U heeft ook de kans om ons te bezoeken zonder uw gezondheid te riskeren of tijd te verspillen onderweg.

Om dit te doen, nodigen wij iedereen uit op onze server minecraft.selectel.ru (clientversie 1.15.2), waar de datacenters Tsvetochnaya-1 en Tsvetochnaya-2 opnieuw zijn gemaakt. Vergeet niet akkoord te gaan met het downloaden van extra bronnen, deze zijn nodig voor de correcte weergave van sommige locaties.

Quests, promotiecodes, paaseieren en prettige communicatie wachten op u.

Bron: www.habr.com

Voeg een reactie