Optimisation du serveur Minecraft

Optimisation du serveur Minecraft
Sur notre blog, nous avons déjà dit, comment créer votre propre serveur Minecraft, mais 5 ans se sont écoulés depuis et beaucoup de choses ont changé. Nous partageons avec vous les méthodes actuelles pour créer et optimiser la partie serveur d'un jeu aussi populaire.

Au cours de ses 9 années d'histoire (à compter de la date de sortie), Minecraft a gagné un nombre incroyable de fans et de haineux parmi les joueurs ordinaires et les geeks. Le concept simple d'un monde composé de blocs a évolué d'une simple forme de divertissement à un moyen universel de communication et de création de divers objets du monde réel.

En plus de la construction, le jeu a la capacité de créer logique, qui vous permettent d'implémenter des algorithmes à part entière dans Minecraft. YouTube regorge de vidéos très impressionnantes dans lesquelles des gens, après avoir déployé beaucoup d'efforts et passé beaucoup de temps, ont créé une copie de tel ou tel appareil électronique ou ont construit une copie détaillée existant и fictif structures architecturales. Tout n’est limité que par l’imagination du joueur et les possibilités de l’univers du jeu.


Mais ne parlons pas plus de ce que créent exactement les joueurs, mais regardons la partie serveur de l'application et soulignons les problèmes (parfois très complexes) qui peuvent survenir lors du fonctionnement sous charge. Réservons tout de suite que nous ne parlerons que de l'édition Java.

Types de serveurs

L'option la plus simple est un serveur intégré au client du jeu. Nous avons créé un monde, appuyé sur un bouton et le serveur est devenu accessible sur le réseau local. Cette option ne peut supporter aucune charge importante et nous ne l'envisagerons donc même pas.

Vanille

Mojang Studios distribue gratuitement la partie serveur du jeu sous forme d'application Java. sur le site officiel. Cela vous permet de créer votre propre serveur dédié et personnel, le rendant accessible pour une connexion depuis n'importe où sur la planète. Pour ceux qui font cela pour la première fois, il existe un formidable Didacticiel, disponible sur le wiki de jeu correspondant.

Cette approche présente un inconvénient majeur, à savoir le manque de fonctionnalité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 également d'optimiser les performances. De plus, le serveur officiel a une consommation de RAM assez importante pour chaque joueur connecté.

bukkit

Une application serveur créée par des passionnés basée sur la version Vanilla 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 au logiciel vanilla. Fait intéressant, cette application nécessitait beaucoup moins de mémoire.

L'installation de Bukkit n'est pas difficile, les instructions correspondantes sont sur la ressource JeuPedia. Mais cela n'a aucun sens, puisque depuis 2014 l'équipe Bukkit s'est dissoute, les développeurs du projet sont devenus des employés de Mojang Studios, et dépôt abandonné. Ainsi, Bukkit est effectivement mort et il est logique de prêter attention aux deux prochains projets.

RobinetMC

Pour faciliter la vie des développeurs de plugins, il était nécessaire de disposer d'une API pour interagir avec le monde du jeu. C'est exactement le problème que les créateurs ont résolu. Spigot, en prenant le noyau Bukkit et en le retravaillant pour obtenir une meilleure fiabilité et de meilleures performances. Néanmoins, Dépôt Git le projet a été bloqué en raison du Digital Millennium Copyright Act (DMCA), et il est impossible de télécharger le code source à partir de là.

Actuellement, SpigotMC est activement développé et utilisé. Il prend en charge tous les plugins créés pour Bukkit, mais n'est pas rétrocompatible avec celui-ci. Pour contourner le DMCA Takedown, une méthode élégante appelée BuildTools a été inventée. 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.

PapierMC

Tout semblait cool et Spigot est devenu une excellente option. Mais cela n’a pas suffi à certains passionnés, et ils ont créé leur propre fourchette de Spigot « sous stéroïdes ». Sur page du projet le principal avantage est que « c'est stupide et rapide ». Développé communauté vous permet de résoudre rapidement les problèmes émergents et l'API étendue vous permet de créer des plugins intéressants. Vous pouvez lancer PaperMC avec une simple commande, donnée dans documentation.

PaperMC a une excellente compatibilité, donc les plugins écrits pour SpigotMC peuvent facilement fonctionner sur PaperMC, mais sans support officiel. La rétrocompatibilité avec SpigotMC est également présente. Maintenant que nous avons listé les différentes options pour créer un serveur, passons aux problèmes de performances qui peuvent survenir.

Problèmes et solutions

La principale chose que vous devez 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 disposez d'un excellent serveur avec une douzaine de cœurs de calcul, alors un seul sera chargé. Tous les autres seront pratiquement inactifs. 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.

Concernant la question de la capacité de la RAM, il faut partir des indicateurs suivants :

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

Il ne faut pas oublier qu'une application Java a toujours besoin d'une réserve de RAM. Si vous prévoyez une consommation de mémoire de 8 gigaoctets, il vous en faut en réalité 12. Les chiffres sont relatifs, mais l'essence ne change pas.

Pour démarrer la partie serveur, nous vous recommandons d'utiliser les drapeaux spécifiés dans l'article Réglage de la JVM – Drapeaux du Garbage Collector G1GC pour Minecraft. Cette « magie noire » permet au serveur de configurer correctement le « garbage collector » et d’optimiser l’utilisation de la RAM. Vous ne devez pas allouer plus de mémoire que ce que le serveur consomme réellement lors du pic d'afflux de joueurs.

Générer une carte de blocs

"Pensez-vous vraiment que la lune n'existe que lorsque vous la regardez ?" (Albert Einstein)

Serveur complètement nouveau. Dès que le joueur se connecte avec succès pour la première fois, le personnage du jeu apparaît au point de rassemblement général (spawn). C'est le seul endroit où le monde du jeu est pré-généré par le serveur. Au même moment, la partie client regarde les réglages, et le paramètre clé est la distance de dessin. Il est mesuré en morceaux (la zone de la carte mesure 16 × 16 et 256 blocs de haut). Le nombre de morceaux indiqués correspond exactement au nombre qui sera demandé au serveur.

Le serveur stocke une carte globale du monde, et s'il n'y a pas encore de blocs générés au moment de l'apparition du personnage du jeu, alors le serveur les génère et les stocke dynamiquement. Non seulement cela nécessite d’importantes 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é les 8 To et la frontière du monde se situe à environ 30 millions de blocs. Il existe des milliers d'histoires associées à ce serveur et il mérite son propre article dans la série.

Générer un monde autour d'un seul joueur n'est pas un problème. Générer un monde autour de centaines de joueurs entraînera des ralentissements mineurs du serveur pendant une courte période, après quoi la charge diminuera. Générer un monde à une distance de rendu client d'environ un millier de joueurs est déjà capable de « laisser tomber » le serveur et d'en expulser tous les clients en raison d'un délai d'attente.

Dans le logiciel serveur, il existe une valeur telle que TPS (Ticks par serveur - ticks par seconde). Normalement, 1 cycle d'horloge équivaut à 50 ms. (1 seconde du monde réel équivaut à 20 ticks du monde du jeu). Si le traitement d'un tick passe à 60 secondes, l'application serveur sera fermée, expulsant tous les joueurs.

La solution consiste à limiter le monde à certaines coordonnées et à effectuer une génération préliminaire de blocs. Ainsi, nous supprimons le besoin de génération dynamique pendant le jeu, et le serveur n'aura besoin que de lire une carte existante. Les deux problèmes peuvent être résolus avec un seul plugin Frontière mondiale.

Le moyen le plus simple est de définir la limite 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 repoussé de plusieurs blocs. Si cela est répété plusieurs fois dans un temps limité, le contrevenant sera téléporté de force au point d'apparition. La pré-génération du monde se fait encore plus simplement, avec la commande :

/wb fill

Puisque cette action pourrait potentiellement affecter les joueurs sur le serveur, assurez-vous de confirmer :

/wb confirm

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

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

Blocs problématiques

Il existe une grande variété de blocs dans Minecraft. Cependant, nous souhaitons attirer l'attention des lecteurs sur un bloc tel que TNT. Comme son nom l'indique, ce bloc est un explosif (note de l'éditeur - il s'agit d'un élément de jeu du monde virtuel et cet objet n'a rien avec de vrais explosifs). Sa particularité est telle qu'au moment de l'activation, la force de gravité commence à agir sur lui. Cela oblige le serveur à calculer toutes les coordonnées si à ce moment le bloc commence à tomber.

S'il y a plusieurs blocs de TNT, alors la détonation d'un bloc provoque la détonation et l'activation de la gravité dans les blocs voisins, les dispersant dans toutes les directions. Toute cette belle mécanique côté serveur ressemble à un grand nombre d'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 tout le monde peut facilement vérifier. Générez et faites exploser un cube à partir de blocs TNT d'une taille d'au moins 30x30x30. Et si vous pensiez avoir un bon ordinateur de jeu puissant, vous vous trompiez lourdement 😉

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

Optimisation du serveur Minecraft
Une « expérience » similaire sur un serveur équipé d'Intel® Xeon® Gold 6240 a entraîné une baisse importante du TPS et une charge CPU de 80 % pendant toute la durée de détonation du bloc. Par conséquent, si un joueur est capable de le faire, le problème de performances affectera tous les joueurs du serveur.

Une option encore plus difficile - Cristaux de bord. Si TNT explose néanmoins de manière séquentielle, alors les Edge Crystals explosent tous en même temps, ce qui peut en théorie arrêter complètement le fonctionnement de l'application serveur.

Ce scénario ne peut être évité qu’en interdisant totalement l’utilisation de ces blocs dans le monde du jeu. Par exemple, en utilisant le plugin Garde du monde. Veuillez noter que ce plugin ne fonctionne pas sans un autre plugin. Monde modifier. Installez donc d'abord WorldEdit, puis WorldGuard.

Conclusion

Gérer correctement un serveur de jeux 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 des mécanismes de jeu eux-mêmes. Il est impossible de tout prévoir, car les joueurs peuvent parfois être très créatifs en essayant de forcer le serveur à faire quelque chose pour lequel il n'est pas prévu. Seul un équilibre raisonnable entre les risques et les restrictions établies permettra au serveur de fonctionner en continu et de ne pas réduire ses performances à des valeurs critiques.

Pendant la quarantaine, certains de nos employés ont raté leurs bureaux préférés et ont décidé de les recréer dans Minecraft. Vous avez également la chance de venir nous rendre visite sans risquer votre santé ni perdre de temps sur la route.

Pour ce faire, nous invitons tout le monde sur notre serveur minecraft.selectel.ru (version client 1.15.2), où les centres de données Tsvetochnaya-1 et Tsvetochnaya-2 ont été recréés. N'oubliez pas d'accepter le téléchargement de ressources supplémentaires, elles sont nécessaires au bon affichage de certains emplacements.

Quêtes, codes promotionnels, œufs de Pâques et communication agréable vous attendent.

Source: habr.com

Ajouter un commentaire