Optimisation du serveur Minecraft



Dans notre blog, nous avons déjà parlé de la façon de créer votre propre serveur Minecraft, cependant, 5 ans se sont écoulés depuis et beaucoup de choses ont changé. Nous partageons avec vous les moyens actuels de créer et d'optimiser le côté serveur d'un jeu aussi populaire.



Au cours de ses 9 ans d'histoire (à compter de la date de sortie), Minecraft a gagné un nombre étonnant de fans et de haters parmi les joueurs occasionnels et les geeks. Le concept simple d'un monde cubique a évolué d'un simple divertissement à un environnement universel pour la communication et la création de divers objets du monde réel.



En plus de la construction, le jeu a la capacité de créer des circuits logiques qui vous permettent de mettre en œuvre des algorithmes à part entière dans Minecraft. YouTube regorge de vidéos très impressionnantes, où les gens, avec énormément d'efforts et dépensant beaucoup de temps, ont créé une copie d'un appareil électronique ou construit une copie détaillée de structures architecturales existantes et fictives . Tout n'est limité que par la fantaisie du joueur et les possibilités de l'univers du jeu.





Mais ne parlons pas plus loin de ce que les joueurs créent exactement, mais regardons le côté serveur de l'application et soulignons les problèmes (parfois très complexes) qui peuvent survenir lors d'un travail en charge. Faisons une réservation tout de suite que nous ne parlerons que de Java Edition.



Types de serveurs



L'option la plus simple est le serveur intégré au client du jeu. Nous avons créé un monde, appuyé sur un bouton, et maintenant le serveur est devenu disponible sur le réseau local. Cette option ne peut résister à aucune charge sérieuse, et par conséquent, nous ne l'envisagerons même pas.



Vanille



Mojang Studios distribue gratuitement la partie serveur du jeu en tant qu'application Java sur le site officiel . Cela vous permet de créer votre propre serveur dédié et votre monde personnel, le rendant disponible pour une connexion de n'importe où dans le monde. Pour ceux qui font cela pour la première fois, il existe un excellent tutoriel disponible sur le wiki du jeu respectif.



Cette approche présente un inconvénient majeur, à savoir le manque d'opportunités "out of the box" pour connecter des plugins qui étendent les fonctionnalités du serveur et permettent non seulement d'automatiser de nombreux processus, mais aussi d'optimiser les performances. De plus, le serveur officiel a une consommation assez importante de RAM pour chaque joueur connecté.



Bukkit



Créée par des passionnés sur la base de la version Vanilla, l'application serveur Bukkit a considérablement élargi les capacités du jeu en prenant en charge les plugins et les mods (modifications). Cela permettait non seulement d'ajouter de nouveaux blocs au gameplay, mais aussi d'effectuer diverses manipulations inaccessibles aux logiciels vanilla. Fait intéressant, cette application nécessitait beaucoup moins de mémoire.



Il n'est pas difficile d'installer Bukkit, les instructions correspondantes se trouvent sur la ressource GamePedia . Mais cela n'a pas de sens, puisque depuis 2014 l'équipe de Bukkit a été dissoute, les développeurs du projet sont devenus des employés de Mojang Studios et le référentiel est abandonné. Donc Bukkit est en fait mort et il est logique de prêter attention aux deux prochains projets.



SpigotMC



Pour faciliter la vie des développeurs de plugins, une API était nécessaire pour interagir avec le monde du jeu. C'est exactement ce que les créateurs de Spigot ont résolu en prenant le noyau Bukkit comme base et en le retravaillant pour obtenir une meilleure fiabilité et de meilleures performances. Cependant, le référentiel Git du projet a été verrouillé en raison du Digital Millennium Copyright Act ( DMCA ) et les sources ne peuvent pas être téléchargées à partir de là.



À l'heure actuelle, SpigotMC est activement développé et utilisé. Il prend en charge tous les plugins construits pour Bukkit, mais n'est pas rétrocompatible avec lui. Pour contourner l'interdiction DMCA Takedown, une méthode élégante a été inventée appelée BuildTools. Cet outil élimine le besoin de distribuer une application compilée et permet aux utilisateurs de compiler Spigot, CraftBukkit et Bukkit à partir des sources. Tout cela rend l'interdiction du DMCA inutile.



PaperMC



Tout semblait cool et Spigot était une excellente option. Mais certains passionnés n'ont pas trouvé cela assez, et ils ont écrit leur propre fourchette de Spigot «sous stéroïdes». Sur la page du projet, le principal avantage est que «c'est stupide vite». Une communauté développée vous permet de résoudre rapidement les problèmes émergents, et une API étendue vous permet de créer des plugins intéressants. Vous pouvez démarrer PaperMC avec une simple commande de la documentation .



Tout va bien avec la compatibilité de PaperMC, donc les plugins écrits pour SpigotMC fonctionneront facilement sur PaperMC, mais sans support officiel. La rétrocompatibilité avec SpigotMC est également présente. Maintenant que nous avons répertorié les différentes options de création d'un serveur, passons aux problèmes de performances qui peuvent survenir.



Problèmes et solutions



L'essentiel à comprendre est que tout ce qui concerne le traitement du monde du jeu ne sera traité que sur un seul cœur de calcul du serveur physique. Donc si du coup vous avez un excellent serveur avec une douzaine de cœurs de calcul, alors un seul sera chargé. Tout le reste sera pratiquement inactif. Il s'agit de l'architecture de l'application et vous ne pouvez rien y faire. Ainsi, lors du choix d'un serveur, vous devez faire attention non pas au nombre de cœurs, mais à la fréquence d'horloge. Plus il est élevé, meilleures seront les performances.



Quant à la question de la quantité de RAM, il convient de partir des indicateurs suivants:



  • nombre prévu de joueurs;
  • le nombre prévu de mondes sur le serveur;
  • la taille de chaque monde.


N'oubliez pas qu'une application Java a toujours besoin d'une marge de RAM. Si vous comptez sur une consommation de mémoire de 8 gigaoctets, vous devez en fait en avoir 12. Les chiffres sont relatifs, mais l'essentiel ne change pas.



Pour démarrer le côté serveur, nous vous recommandons d'utiliser les indicateurs spécifiés dans l'article Tuning the JVM - G1GC Garbage Collector Flags for Minecraft . Cette "magie noire" permet au serveur de configurer intelligemment le ramasse-miettes et optimise l'utilisation de la RAM. Cela ne vaut pas la peine d'allouer plus de mémoire que ce que le serveur consomme réellement pendant l'afflux maximal de joueurs.



Générer une carte de bloc

"Pensez-vous vraiment que la lune n'existe que lorsque vous la regardez?" (Albert Einstein)
Tout nouveau serveur. Dès que le joueur se connecte avec succès pour la première fois, le personnage du jeu apparaît à un point de rassemblement commun (spawn). C'est le seul endroit où le monde du jeu est pré-généré par le serveur. Au même moment, la pièce cliente examine les paramètres et le paramètre clé est la distance de dessin. Il est mesuré en morceaux (la zone de la carte mesure 16x16 et 256 blocs de haut). Combien de morceaux y sont indiqués, c'est exactement combien sera demandé au serveur.



Une carte globale du monde est stockée sur le serveur, et s'il n'y a pas de blocs générés dedans au point d'apparition du personnage du jeu, alors le serveur les génère dynamiquement et les stocke. Non seulement cela nécessite de grandes ressources informatiques, mais cela augmente également constamment la taille de la carte du monde. Sur l'un des plus anciens serveurs anarchistes 2b2t(2builders2tools) la taille de la carte a déjà dépassé 8 To, et la frontière mondiale est à la marque de 30 millions de blocs. Des milliers d'histoires sont associées à ce serveur et mérite son propre article dans une série d'articles.



Créer un monde autour d'un joueur n'est pas un problème. Générer un monde autour de centaines de joueurs entraînera des freins mineurs du serveur pendant une courte période, après quoi la charge diminuera. La génération du monde à distance de dessiner un client autour d'un millier de joueurs est déjà capable de «laisser tomber» le serveur et de rejeter tous les clients de celui-ci par timeout.

Le logiciel serveur a une valeur telle que TPS (Ticks per Server - ticks par seconde). En règle générale, 1 cycle d'horloge est égal à 50 ms. (1 seconde du monde réel équivaut à 20 mesures du monde du jeu). Si le traitement d'une horloge passe à 60 secondes, l'application serveur sera fermée, jetant tous les joueurs.
La solution consiste à limiter le monde à certaines coordonnées et à effectuer une génération de bloc préliminaire. Ainsi, nous supprimons le besoin de génération dynamique pendant le jeu, et le serveur n'aura plus qu'à lire la carte existante. Les deux problèmes sont traités par un seul plugin WorldBorder .



Le moyen le plus simple est de définir la frontière du monde sous la forme d'un cercle par rapport au point d'apparition (bien que vous puissiez lui donner n'importe quelle forme) avec une seule commande:



/wb set <  > spawn


Si le personnage du joueur tente de traverser la frontière, il sera renvoyé de quelques blocs. Si cela est fait plusieurs fois dans un temps limité, l'intrus sera téléporté de force au point d'apparition. La pré-génération du monde est encore plus facile avec la commande:



/wb fill


Cette action pouvant potentiellement affecter les joueurs sur le serveur, n'oubliez pas de confirmer l'exécution:



/wb confirm


Au total, il a fallu environ 2 heures sur un processeur Intel® Xeon® Gold 6240 pour générer un monde avec un rayon de 5000 blocs (~ 40 milliards de blocs). Par conséquent, si vous souhaitez commencer la pré-génération d'une carte plus grande, gardez à l'esprit que ce processus prendra un temps décent , et le TPS du serveur sera sérieusement réduit. N'oubliez pas non plus que même un rayon de 5 000 blocs nécessitera environ 2 Go d'espace disque.



Malgré le fait que la version extrême du plugin a été développée pour Minecraft version 1.14, il a été expérimentalement constaté qu'elle fonctionne très bien sur les versions ultérieures. Une liste complète des commandes avec des explications est disponible sur le forum du plugin .



Blocs de problèmes



Il existe de nombreux types de blocs dans Minecraft. Cependant, nous aimerions attirer l'attention des lecteurs sur un bloc tel que TNT . Comme son nom l'indique, ce bloc est un explosif (la note de l'éditeur est un objet jouable du monde virtuel et cet objet n'a rien avec de vrais explosifs) . Sa particularité est qu'au moment de l'activation, la force de gravité commence à agir sur elle. Cela force le serveur à calculer toutes les coordonnées, si à ce moment le bloc commence à tomber.



S'il y a plusieurs blocs TNT, alors la détonation d'un bloc provoque la détonation et l'inclusion de la gravité dans les blocs voisins, les dispersant dans toutes les directions. Toute cette belle mécanique côté serveur ressemble à beaucoup d'opérations de calcul de la trajectoire de chacun des blocs, ainsi qu'aux interactions avec les blocs voisins. La tâche est extrêmement gourmande en ressources, ce que tout le monde peut facilement vérifier. Générez et explosez un cube de blocs TNT d'au moins 30x30x30. Et si vous pensiez que vous aviez un bon ordinateur de jeu puissant, alors vous vous êtes grandement trompé;)



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




Une «expérience» similaire sur un serveur avec Intel® Xeon® Gold 6240 a conduit à un grave «drawdown» du TPS et une charge de 80% sur le CPU pendant toute la durée de la détonation de bloc. Par conséquent, si l'un des joueurs peut faire cela, alors le problème de performance affectera tous les joueurs sur le serveur.



Une option encore plus difficile est les cristaux de la fin . Si le TNT explose néanmoins séquentiellement, alors les Cristaux de la Fin explosent tous en même temps, ce qui en théorie peut complètement arrêter le fonctionnement de l'application serveur.



Ce scénario ne peut être évité qu'en interdisant complètement l'utilisation de ces blocs dans le monde du jeu. Par exemple, en utilisant le plugin WorldGuard . Veuillez noter que ce plugin lui-même ne fonctionne pas sans un autre plugin WorldEdit. Installez d'abord WorldEdit, puis WorldGuard.



Conclusion



Une gestion de serveur de jeu compétente n'est pas une tâche facile. Des difficultés et des performances réduites vous attendront à chaque tour, surtout si vous ne tenez pas compte de la mécanique même du gameplay. Il est impossible de tout prévoir, car les joueurs sont parfois très créatifs en essayant de forcer le serveur à faire quelque chose pour lequel il n'était pas destiné. Seul un équilibre raisonnable entre les risques et les limites établies permettra au serveur de fonctionner en mode continu et ne réduira pas ses performances à des valeurs critiques.



En quarantaine, certains de nos employés ont raté leurs bureaux préférés et ont décidé de les recréer à l'intérieur de Minecraft. Vous avez également la possibilité de nous rendre visite sans risquer votre santé et perdre du temps sur la route.

minecraft.selectel.ru ( 1.15.2), - -1 -2. , .



, , «» .



All Articles