Optimisation du serveur Minecraft

Optimisation du serveur Minecraft
Dans notre blog, nous avons déjà ont raconté, comment créer son propre serveur Minecraft, mais depuis, 5 ans se sont écoulés et beaucoup de choses ont changé. Nous partageons avec vous des méthodes actuelles pour la création et l'optimisation de la partie serveur d'un jeu si populaire.

Au cours de ses 9 années d'histoire (si l'on compte depuis la date de sortie), Minecraft a attiré un nombre incroyable de fans et de détracteurs, tant parmi les joueurs ordinaires que les geeks. Le concept simple d'un monde en cubes s'est transformé d'un simple divertissement en un environnement universel pour l'interaction et la création d'objets tirés du monde réel.

En plus de la construction, le jeu permet de créer des circuits logiques, qui permettent de mettre en œuvre de véritables algorithmes au sein de Minecraft. YouTube regorge de vidéos impressionnantes où des gens, ayant consacré une énorme quantité d'efforts et de temps, ont créé une copie d'un appareil électronique ou construit une réplique détaillée de réelles et imaginaires architectures. Tout est limité par l'imagination du joueur et les possibilités de l'univers du jeu.

Lire la vidéo

Mais ne parlons pas plus avant de ce que les joueurs créent, regardons plutôt la partie serveur de l'application et abordons les problèmes (parfois assez complexes) qui peuvent survenir lors de l'exploitation sous charge. Nous préciserons dès le départ que nous parlerons uniquement de l'édition Java.

Types de serveurs

La solution la plus simple est un serveur intégré au client du jeu. Vous créez un monde, appuyez sur un bouton, et le serveur devient accessible sur le réseau local. Ce type de solution ne peut pas supporter de charge sérieuse, c'est pourquoi nous ne l'examinerons même pas.

Vanille

La société Mojang Studios distribue la partie serveur du jeu sous forme d'application Java gratuitement sur le site officiel. Cela permet de créer son propre serveur dédié et personnel monde, le rendant accessible pour une connexion depuis n'importe quel point de la planète. Pour ceux qui font cela pour la première fois, il existe un excellent tutoriel, disponible dans la wiki de jeu appropriée.

Cette approche présente un inconvénient majeur : le manque de possibilités « prêtes à l'emploi » 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 consomme une quantité assez importante de mémoire vive pour chaque joueur connecté.

Bukkit

Une application serveur créée par des passionnés à partir de la version Vanilla Bukkit étendait considérablement les possibilités du jeu grâce à la prise en charge des plugins et des mods (modifications). Elle permettait non seulement d'ajouter de nouveaux blocs au gameplay, mais aussi d'effectuer diverses manipulations impossibles avec le logiciel vanilla. Fait intéressant, cette application nécessitait beaucoup moins de mémoire.

Installer Bukkit n'est pas un problème, des instructions correspondantes sont disponibles sur le site GamePedia. Cependant, cela n'a pas de sens, car depuis 2014, l'équipe de Bukkit s'est dissoute, les développeurs du projet sont devenus employés de Mojang Studios, et dépôt a été abandonné. Ainsi, Bukkit est en fait mort, et il vaut la peine de se concentrer sur les deux projets suivants.

SpigotMC

Pour faciliter la vie des développeurs de plugins, il y avait un besoin d'API pour interagir avec le monde du jeu. C'est exactement cette tâche que les créateurs de Spigot, en se basant sur le noyau de Bukkit et en le retravaillant pour améliorer la fiabilité et les performances. Néanmoins, Le dépôt Git le projet a été bloqué en vertu de la Loi sur le droit d'auteur pour l'ère numérique (DMCA), et il est impossible de télécharger le code source à partir de là.

À l'heure actuelle, SpigotMC est en cours de développement actif et utilisé. Il prend en charge tous les plugins créés pour Bukkit, mais n'est pas compatible en retour. Pour contourner l'interdiction du DMCA Takedown, un moyen élégant a été inventé, appelé BuildTools. Cet outil élimine le besoin de distribuer une application compilée et permet aux utilisateurs de compiler Spigot, CraftBukkit et Bukkit à partir du code source. Tout cela rend l'interdiction DMCA inutile.

PaperMC

À première vue, tout semble génial, et Spigot est devenu une excellente option. Mais certains passionnés ont considéré cela comme insuffisant et ont créé leur propre fork de Spigot « sous stéroïdes ». À page du projet la caractéristique clé, il est indiqué que “It’s stupid fast”. Une communauté développée communauté permet de résoudre rapidement les problèmes qui surgissent, et l'API étendue permet de créer des plugins intéressants. Lancer PaperMC ne nécessite qu'une simple commande, présentée dans documentation.

La compatibilité de PaperMC est excellente, 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 énuméré les différentes options pour créer un serveur, passons aux problèmes de performance qui peuvent survenir.

Problèmes et solutions

La principale chose à comprendre est que tout ce qui concerne le traitement du monde de jeu ne sera géré que par un seul cœur de calcul du serveur physique. Ainsi, même si vous avez un excellent serveur avec une dizaine de cœurs de calcul, seul un sera utilisé. Tous les autres resteront en grande partie inoccupés. C'est ainsi que l'architecture de l'application fonctionne, et vous ne pouvez rien y faire. Donc, lors du choix d'un serveur, il faut se concentrer non pas sur le nombre de cœurs, mais sur la fréquence d'horloge. Plus elle est élevée, meilleure sera la performance.

En ce qui concerne la question de la mémoire vive, il convient de se baser sur les indicateurs suivants :

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

Il est important de se rappeler qu'une application Java a toujours besoin d'une marge de mémoire vive. Si vous estimez que la consommation de mémoire sera de 8 gigaoctets, vous devez en réalité disposer de 12. Ces chiffres sont indicatifs, mais le principe reste le même.

Pour lancer la partie serveur, nous recommandons d'utiliser les drapeaux indiqués dans l'article Tuning the JVM – G1GC Garbage Collector Flags for Minecraft. Cette « magie noire » permet au serveur d'ajuster correctement le « ramasse-miettes » et optimise l'utilisation de la mémoire vive. Il ne faut pas allouer plus de mémoire que celle réellement consommée par le serveur lors des pics de joueurs.

Génération de la carte des blocs

« Pensez-vous vraiment que la Lune existe seulement quand vous la regardez ? » (Albert Einstein)

Serveur entièrement nouveau. Lorsque le joueur se connecte pour la première fois, le personnage apparaît à un point de collecte commun (spawn). C'est le seul endroit où le monde du jeu est pré-généré par le serveur. À ce moment, le client consulte les paramètres, et un paramètre clé est la distance de rendu. Elle est mesurée en chunks (une zone de la carte de 16×16 et d'une hauteur de 256 blocs). Le nombre de chunks spécifié sera celui demandé au serveur.

Le serveur stocke la carte mondiale globale, et s'il n'y a pas encore de blocs générés au point d'apparition du personnage, le serveur les génère dynamiquement et les sauvegarde. Non seulement cela nécessite d'importantes ressources de calcul, mais cela augmente également constamment la taille de la carte mondiale. Sur l'un des serveurs anarchiques les plus anciens, 2b2t (2builders2tools), la taille de la carte a déjà dépassé 8 To, et la limite du monde se situe à 30 millions de blocs. Ce serveur est associé à des milliers d'histoires et mérite un article à lui seul, voire une série d'articles.

La génération du monde autour d'un joueur ne pose pas de problème. La génération du monde autour de centaines de joueurs provoquera de légers ralentissements du serveur pendant une courte période, après quoi la charge diminuera. La génération du monde à la distance de rendu autour de mille joueurs peut déjà « faire tomber » le serveur et faire expulser tous les clients par timeout.

Dans le logiciel serveur, il y a une valeur appelée TPS (Ticks par seconde). En règle générale, 1 tick équivaut à 50 ms. (1 seconde du monde réel correspond à 20 ticks du monde du jeu). Si le traitement d'un tick augmente jusqu'à 60 secondes, l'application serveur se fermera, expulsant tous les joueurs.

La solution consiste à limiter le monde à certaines coordonnées et à effectuer une pré-génération de blocs. Cela élimine le besoin de génération dynamique pendant le jeu, et le serveur aura simplement à lire la carte déjà existante. Les deux questions sont résolues par un seul plugin WorldBorder.

Il est le plus simple de définir la limite du monde sous la forme d'un cercle par rapport au point de spawn (bien que cela puisse être d'une autre forme) par une seule commande :

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

Si un personnage de jeu essaie de franchir la frontière, il sera repoussé de plusieurs blocs en arrière. Si cela se produit plusieurs fois dans un laps de temps limité, le contrevenant sera téléporté de force au point de réapparition. La génération préalable du monde se fait encore plus facilement avec la commande :

/wb fill

Puisque cette action peut potentiellement affecter les joueurs présents sur le serveur, n'oubliez pas de confirmer l'exécution :

/wb confirm

Au total, il a fallu environ 2 heures avec un processeur Intel® Xeon® Gold 6240 pour générer un monde d'un rayon de 5000 blocs (~40 milliards de blocs). Par conséquent, si vous souhaitez lancer la pré-génération d'une carte plus grande, gardez à l'esprit que ce processus prendra un temps considérable, et le TPS du serveur sera sérieusement réduit. De plus, rappelez-vous qu'un rayon de 5000 blocs nécessite environ 2 Go d'espace sur le disque.

Bien que la dernière version du plug-in ait été développée pour Minecraft version 1.14, il a été constaté qu'elle fonctionne également parfaitement sur les versions ultérieures. La liste complète des commandes avec explications est disponible sur le forum du plug-in.

Blocs problématiques

Il existe de nombreuses variétés de blocs dans Minecraft. Cependant, nous aimerions attirer l'attention des lecteurs sur un bloc particulier, à savoir TNT. Comme son nom l'indique, ce bloc est un explosif (note de la rédaction — il s'agit d'un objet de jeu virtuel et n'a rien à voir avec des explosifs réels). Sa particularité est qu'au moment de l'activation, il commence à subir l'effet de la gravité. Cela force le serveur à recalculer toutes les coordonnées si ce bloc commence à tomber.

S'il y a plusieurs blocs de TNT, la détonation d'un bloc déclenche la détonation et l'activation de la gravité pour les blocs voisins, les dispersant dans toutes les directions. Toute cette belle mécanique du côté du serveur ressemble à de nombreuses opérations pour calculer la trajectoire de chaque bloc, ainsi que l'interaction avec les blocs voisins. La tâche est extrêmement gourmande en ressources, ce que chacun peut facilement vérifier. Générez et faites exploser un cube de blocs de TNT d'au moins 30x30x30. Et si vous pensiez que votre ordinateur de jeu était puissant, vous vous trompiez sérieusement 😉

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

Optimisation du serveur Minecraft
Une telle « expérience » sur un serveur avec Intel® Xeon® Gold 6240 a entraîné une chute sérieuse du TPS et une charge CPU de 80 % pendant toute la durée de la détonation des blocs. Par conséquent, si l'un des joueurs parvient à faire quelque chose de semblable, le problème de performance touchera tous les joueurs présents sur le serveur.

Une variante encore plus sévère — Les Cristaux de l'End. Si la TNT explose effectivement de manière séquentielle, les Cristaux de l'End se détournent tous en même temps, ce qui théoriquement pourrait même arrêter l'application serveur.

Pour éviter ce scénario, il n'y a d'autre solution que d'interdire complètement l'utilisation de ces blocs dans le monde du jeu. Par exemple, à l'aide du plugin WorldGuard. Notez que ce plugin ne fonctionne pas sans un autre plugin, WorldEdit. Donc, installez d'abord WorldEdit, puis WorldGuard.

Conclusion

Gérer un serveur de jeu de manière compétente n'est pas une tâche simple. Des difficultés et une baisse de performance guettent à chaque pas, surtout si l'on ne prend pas en compte la mécanique du jeu elle-même. Prendre en compte tous les scénarios est impossible, car les joueurs peuvent parfois faire preuve d'une grande ingéniosité pour amener le serveur à accomplir des tâches pour lesquelles il n'est pas conçu. Seule une balance raisonnable entre les risques et les limitations imposées permettra au serveur de fonctionner en continu sans voir sa performance chuter à des valeurs critiques.

En quarantaine, certains de nos employés se sont ennuyés de leurs bureaux préférés et ont décidé de les recréer à l'intérieur de Minecraft. Vous avez aussi la possibilité de nous rendre visite, sans risquer votre santé ni perdre du temps en déplacement.

Pour cela, nous invitons tous ceux qui le souhaitent sur notre serveur minecraft.selectel.ru (version client 1.15.2), où les centres de données Flower-1 et Flower-2 ont été recréés. N'oubliez pas d'accepter le téléchargement de ressources supplémentaires, elles sont nécessaires pour un affichage correct de certaines zones.

Vous attendent des quêtes, des codes promo, des « easter eggs » et des échanges agréables.

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster