Optimalisatie van de Minecraft-server

Optimalisatie van de Minecraft-server
Op onze blog hebben we al twee jaar geleden verteld, en in november 2018 gebeurde er een zeer interessante (wat betreft beveiliging) gebeurtenis. Kort samengevat, het team van CyberArk Software Ltd. slaagde erin het te hacken: ze kregen de mogelijkheid om commando's buiten de containers uit te voeren, d.w.z. op het host-systeem. Een prachtige illustratie van het beveiligingsprobleem in Docker, nietwaar? Over alle details van wat er gebeurde, lees je, hoe je je eigen Minecraft-server kunt maken, maar sindsdien zijn er 5 jaar verstreken en is er veel veranderd. We delen met jullie de actuele manieren om de serverkant van dit populaire spel te creëren en te optimaliseren.

In zijn 9-jarige geschiedenis (als we vanaf de releasedatum rekenen) heeft Minecraft een indrukwekkend aantal fans en haters verzameld, zowel onder gewone spelers als onder nerds. Het eenvoudige concept van een wereld van kubussen is veranderd van een gewoon tijdverdrijf in een veelzijdige omgeving voor communicatie en het creëren van verschillende objecten uit de echte wereld.

Naast bouwen, biedt het spel de mogelijkheid om logische schakelingen, die volledige algoritmes binnen Minecraft mogelijk maken. Op YouTube zijn er talloze indrukwekkende video's te vinden waarin mensen, na veel moeite en tijd, een kopie van een elektronisch apparaat hebben gemaakt of een gedetailleerde replica hebben gebouwd van bestaande en fictieve architectonische structuren. Alles is slechts beperkt door de verbeelding van de gamer en de mogelijkheden van de spelwereld.

Video afspelen

Maar laten we niet verder praten over wat spelers creëren, laten we kijken naar de serverkant van de applicatie en de problemen (soms behoorlijk complex) die kunnen ontstaan tijdens het werken onder belasting. We willen meteen duidelijk maken dat we alleen over de Java Edition zullen praten.

Soorten servers

De eenvoudigste optie is de server die ingebouwd is in de gameclient. Je creëert een wereld, drukt op een knop, en voilà, de server is beschikbaar op het lokale netwerk. Deze optie kan geen serieuze belasting aankunnen, dus we zullen het er niet verder over hebben.

Vanille

Mojang Studios verspreidt de servercomponent van het spel gratis als een Java-applicatie op de officiële website. Dit maakt het mogelijk om je eigen is een dedicated server en persoonlijke wereld te creëren, die toegankelijk is voor verbinding vanaf elke plek ter wereld. Voor degenen die dit voor het eerst doen, is er een uitstekende tutorial, beschikbaar in de betreffende game Wiki.

Dit benadering heeft één ernstig nadeel, namelijk het ontbreken van mogelijkheden om ‘uit de doos’ plugins toe te voegen die de functionaliteit van de server uitbreiden en het mogelijk maken om veel processen te automatiseren en de prestaties te optimaliseren. Bovendien heeft de officiële server een behoorlijk hoog geheugenverbruik per verbonden speler.

Bukkit

Een servertoepassing ontwikkeld door enthousiasten op basis van de Vanilla-versie Bukkit breidde de speelmogelijkheden aanzienlijk uit dankzij de ondersteuning van plugins en mods (modificaties). Het stelde gebruikers niet alleen in staat om nieuwe blokken aan het spel toe te voegen, maar ook om verschillende manipulaties uit te voeren die niet beschikbaar waren in de vanilla software. Interessant genoeg vereiste deze applicatie aanzienlijk minder geheugen.

Het installeren van Bukkit is niet moeilijk, er is een bijbehorende instructie beschikbaar op de site GamePedia. Maar dat heeft geen zin, aangezien het Bukkit-team in 2014 uiteenviel, de ontwikkelaars van het project medewerkers werden van Mojang Studios, en repository het is opgegeven. Dus is Bukkit feitelijk dood, en het is logisch om aandacht te besteden aan de volgende twee projecten.

SpigotMC

Om het leven van plugin-ontwikkelaars te vergemakkelijken, was er behoefte aan een API voor interactie met de spelwereld. Dit probleem werd opgelost door de makers van Spigot, die de Bukkit-kern als basis namen en deze herwerkten voor betere betrouwbaarheid en prestaties. Niettemin, Git-repository het project werd geblokkeerd in verband met de Digital Millennium Copyright Act (DMCA), en het is onmogelijk om de broncode daar te downloaden.

Op dit moment wordt SpigotMC actief ontwikkeld en gebruikt. Het ondersteunt alle plugins die voor Bukkit zijn gemaakt, maar is niet terugwaarts compatibel. Om het DMCA Takedown verbod te omzeilen, werd een elegante oplossing bedacht genaamd BuildTools. Deze tool maakt distributie van de gecompileerde applicatie overbodig en stelt gebruikers in staat om Spigot, CraftBukkit en Bukkit vanuit de broncode te compileren. Dit maakt het DMCA verbod nutteloos.

PaperMC

Het lijkt erop dat alles geweldig is, en Spigot is een uitstekende optie geworden. Maar sommige enthousiastelingen vonden dit niet genoeg, en ze hebben hun eigen fork van Spigot ‘op steroïden’ gemaakt. Bij de projectpagina is als belangrijkste voordeel aangegeven dat “Het is belachelijk snel”. De uitgebreide gemeenschap maakt het mogelijk om snel vragen op te lossen, en de uitgebreide API maakt het mogelijk om interessante plugins te maken. PaperMC kan worden opgestart met één eenvoudig commando, zoals vermeld in de documentatie.

Met PaperMC is de compatibiliteit prachtig, zodat de geschreven plug-ins voor SpigotMC eenvoudig op PaperMC zullen functioneren, maar zonder officiële ondersteuning. Er is ook achterwaartse compatibiliteit met SpigotMC. Nu we de verschillende opties voor het opzetten van een server hebben opgesomd, laten we overgaan naar de prestatieproblemen die zich kunnen voordoen.

Problems and solutions

Het belangrijkste om te begrijpen is dat alles met betrekking tot de verwerking van de spelwereld alleen op één rekenkern van de fysieke server zal worden afgehandeld. Dus als je een geweldige server met een dozijn rekenkernen hebt, zal er maar één worden belast. Alle andere zullen feitelijk stilstaan. Dat is de architectuur van de applicatie en daar kun je niets aan doen. Dus bij het kiezen van een server moet je letten op de kloksnelheid, niet op het aantal kernen. Hoe hoger deze is, hoe beter de prestaties zullen zijn.

Wat betreft de hoeveelheid RAM, moet je rekening houden met de volgende factoren:

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

Houd er rekening mee dat een Java-applicatie altijd een reserve voor RAM nodig heeft. Als je een geheugenverbruik van 8 gigabyte verwacht, heb je eigenlijk 12 nodig. Die cijfers zijn indicatief, maar de essentie blijft hetzelfde.

Voor het starten van het servergedeelte raden we aan om de vlaggen te gebruiken die in het artikel worden vermeld Tuning the JVM – G1GC Garbage Collector Flags for Minecraft. Deze ‘zwarte magie’ stelt de server in staat om de ‘garbage collector’ correct in te stellen en optimaliseert het gebruik van RAM. Het is niet nodig om meer geheugen toe te wijzen dan de server daadwerkelijk verbruikt bij een piekbelasting van spelers.

Blokkaartgeneratie

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

Een volkomen nieuwe server. Zodra de speler voor de eerste keer succesvol verbinding maakt, verschijnt het speelpersonage op het gezamenlijke verzamelpunt (spawn). Dit is de enige plek waar de spelwereld vooraf door de server wordt gegenereerd. Op dat moment kijkt de client naar de instellingen, en een cruciale parameter is de renderafstand. Deze wordt gemeten in chunks (een gebied van 16×16 met een hoogte van 256 blokken). Hoeveel chunks daar zijn opgegeven, dat aantal zal van de server worden opgevraagd.

Op de server wordt een wereldkaart opgeslagen, en als er nog geen gegenereerde blokken zijn op het spawnpunt van de speler, genereert de server deze dynamisch en slaat ze op. Dit vereist niet alleen veel rekenkracht, maar vergroot ook voortdurend de omvang van de wereldkaart. Op een van de oudste anarchistische servers 2b2t (2builders2tools) is de kaart al meer dan 8 Tb groot, en de wereldgrens ligt op 30 miljoen blokken. Er zijn duizenden verhalen verbonden aan deze server, en hij verdient een apart artikel of een serie artikelen.

Het genereren van de wereld rondom één speler is geen probleem. Het genereren van de wereld rond honderd spelers zal leiden tot enige vertraging op de server voor een korte tijd, waarna de belasting zal afnemen. Het genereren van de wereld over de renderafstand van de client rond duizend spelers kan de server echter 'crashen' en alle clients eruit gooien wegens time-out.

In de serversoftware is er een waarde genaamd TPS (Ticks per Server — ticks per seconde). Standaard staat 1 tick gelijk aan 50 ms. (1 seconde in de echte wereld is gelijk aan 20 ticks in de gamewereld). Als de verwerking van één tick 60 seconden wordt, zal de serverapplicatie worden afgesloten en worden alle spelers eruit gegooid.

Een oplossing is om de wereld te beperken tot bepaalde coördinaten en een voorafgaande generatie van blokken uit te voeren. Op die manier verminderen we de noodzaak voor dynamische generatie tijdens het spel, en is het voor de server voldoende om de al bestaande kaart te lezen. Beide problemen kunnen worden opgelost met één enkele plugin. WorldBorder.

De eenvoudigste manier om de grenzen van de wereld in de vorm van een cirkel rond het spawnpunt te stellen (ook al kan deze elke vorm hebben) is met één commando:

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

Als de speler de grens probeert over te steken, wordt hij enkele blokken teruggeduwd. Als dit meerdere keren binnen een beperkte tijd gebeurt, zal de overtreder gedwongen worden teruggeteleporteerd naar het spawnpunt. De voorafgaande generatie van de wereld kan nog eenvoudiger worden uitgevoerd met het commando:

/wb fill

Aangezien deze actie mogelijk invloed kan hebben op spelers die al op de server zijn, vergeet niet de uitvoering te bevestigen:

/wb confirm

In totaal kostte het ongeveer 2 uur om een wereld met een radius van 5000 blokken (~40 miljard blokken) te genereren op een Intel® Xeon® Gold 6240-processor. Houd er dus rekening mee dat als je een grotere kaart wilt pre-genereren, dit proces aanzienlijke tijd zal kosten en de TPS van de server aanzienlijk zal dalen. Vergeet ook niet dat zelfs een radius van 5000 blokken ongeveer 2 GB aan schijfruimte vereist.

Hoewel de laatste versie van de plugin is ontwikkeld voor Minecraft versie 1.14, is geconstateerd dat deze ook goed werkt op latere versies. Een complete lijst met commando's en uitleg is beschikbaar op het pluginforum..

Probleemblokken

Er zijn vele soorten blokken in Minecraft. Maar we willen de aandacht van de lezers vestigen op een blok, namelijk TNT.Zoals de naam al aangeeft, is dit blok een explosief. (opmerking van de redactie - dit is een spelitem uit de virtuele wereld en heeft niets met echte explosieven te maken). Het bijzondere is dat, op het moment van activatie, de kracht van de zwaartekracht op het blok gaat werken. Dit dwingt de server om alle coördinaten te berekenen wanneer het blok begint te vallen.

Als er meerdere TNT-blokken zijn, zal de detonatie van één blok de detonatie en activering van de zwaartekracht voor de aangrenzende blokken veroorzaken, waardoor ze in alle richtingen worden verspreid. Deze mooie mechanica aan de serverzijde lijkt op veel bewerkingen voor het berekenen van de trajecten van elk van de blokken, evenals de interacties met de aangrenzende blokken. De taak is extreem resource-intensief en dat kan iedereen gemakkelijk verifiëren. Genereer en laat een kubus van TNT-blokken ontploffen, met een grootte van minimaal 30x30x30. En als je dacht dat je een goede krachtige gamingcomputer had, dan had je het mis 😉.

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

Optimalisatie van de Minecraft-server
Een soortgelijke ‘experiment’ op een server met een Intel® Xeon® Gold 6240 leidde tot een ernstige ‘dip’ in de TPS en 80% CPU-belasting gedurende de hele detonatietijd van de blokken. Dit betekent dat als een van de spelers zoiets kan uitvoeren, de prestatieproblemen iedereen op de server zullen beïnvloeden.

Een nog extremere variant - De End Crystals.Als TNT toch achtereenvolgens ontploft, detoneren de End Crystals allemaal tegelijk, wat in theorie de werking van de serverapplicatie volledig kan stopzetten.

Dit scenario kan alleen worden vermeden door het gebruik van deze blokken in de game volledig te verbieden. Bijvoorbeeld met behulp van de plugin WorldGuard. Houd er rekening mee dat deze plugin op zich niet werkt zonder een andere plugin, WorldEdit. Dus installeer eerst WorldEdit en daarna WorldGuard.

Conclusie

Goed serverbeheer is geen gemakkelijke taak. Problemen en prestatievermindering liggen om de hoek, vooral als we de spelmechaniek zelf niet in aanmerking nemen. Het is onmogelijk om alles te voorzien, want spelers kunnen soms zeer vindingrijk zijn in hun pogingen om de server dingen te laten doen waarvoor deze niet bedoeld is. Alleen een verstandige balans tussen risico's en opgelegde beperkingen zal de server in staat stellen om continu te functioneren zonder zijn prestaties tot kritieke waarden te verlagen.

Tijdens de quarantainetijd hebben sommige van onze medewerkers hun geliefde kantoren gemist en besloten ze binnen Minecraft opnieuw te creëren. Ook jij hebt de kans om ons een bezoekje te brengen, zonder je gezondheid in gevaar te brengen of tijd te verspillen aan reizen.

Daarom nodigen we iedereen uit op onze server minecraft.selectel.ru (clientversie 1.15.2), waar de datacentra Bloem-1 en Bloem-2 zijn nagebouwd. Vergeet niet akkoord te gaan met het downloaden van extra bronnen, deze zijn noodzakelijk voor een correcte weergave van sommige locaties.

Je kunt rekenen op quests, promotiecodes, 'easter eggs' en prettig contact.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster