Optimización del servidor de Minecraft



En nuestro blog, ya hablamos sobre cómo crear su propio servidor de Minecraft, sin embargo, han pasado 5 años desde entonces y muchas cosas han cambiado. Estamos compartiendo contigo las formas actuales de crear y optimizar el lado del servidor de un juego tan popular.



A lo largo de sus 9 años de historia (a partir de la fecha de lanzamiento), Minecraft se ha ganado una asombrosa cantidad de fanáticos y enemigos entre jugadores ocasionales y geeks. El concepto simple de un mundo de cubos ha evolucionado de un simple entretenimiento a un entorno universal para la comunicación y la creación de varios objetos del mundo real.



Además de la construcción, el juego tiene la capacidad de crear circuitos lógicos que te permiten implementar algoritmos completos dentro de Minecraft. YouTube está lleno de videos muy impresionantes donde las personas ponen mucho esfuerzo y tiempo para crear una copia de un dispositivo electrónico o construir una copia detallada de las estructuras arquitectónicas existentes y ficticias . Todo está limitado solo por la fantasía del jugador y las posibilidades del universo de los juegos.





Pero no hablemos más sobre lo que los jugadores están creando exactamente, sino que veamos el lado del servidor de la aplicación y destaquemos los problemas (a veces muy complejos) que pueden surgir durante el trabajo bajo carga. Hagamos una reserva de inmediato que solo hablaremos sobre Java Edition.



Tipos de servidor



La opción más simple es el servidor integrado en el cliente del juego. Creamos un mundo, presionamos un botón y ahora el servidor estuvo disponible en la red local. Esta opción no puede soportar ninguna carga grave y, por lo tanto, ni siquiera la consideraremos.



Vainilla



Mojang Studios distribuye la parte del servidor del juego como una aplicación Java de forma gratuita en el sitio web oficial . Esto le permite crear su propio servidor dedicado y su mundo personal, haciendo que esté disponible para la conexión desde cualquier parte del mundo. Para aquellos que están haciendo esto por primera vez, hay un excelente tutorial disponible en el respectivo Wiki del juego.



Este enfoque tiene un inconveniente grave, a saber, la falta de oportunidades "listas para usar" para conectar complementos que amplían la funcionalidad del servidor y permiten no solo automatizar muchos procesos, sino también optimizar el rendimiento. Además, el servidor oficial tiene un consumo bastante grande de RAM para cada jugador conectado.



Bukkit



Creado por entusiastas basados ​​en la versión Vanilla, la aplicación de servidor Bukkit amplió significativamente las capacidades del juego al admitir complementos y modificaciones (modificaciones). Permitió no solo agregar nuevos bloques a la jugabilidad, sino también realizar varias manipulaciones que son inaccesibles para el software de vainilla. Curiosamente, esta aplicación requería significativamente menos memoria.



No es difícil instalar Bukkit, las instrucciones correspondientes están en el recurso GamePedia . Pero esto no tiene sentido, ya que desde 2014 el equipo de Bukkit se ha disuelto, los desarrolladores del proyecto se han convertido en empleados de Mojang Studios y el repositorio está abandonado. Entonces Bukkit está realmente muerto y tiene sentido prestar atención a los próximos dos proyectos.



SpigotMC



Para facilitar la vida de los desarrolladores de complementos, era necesario contar con una API para interactuar con el mundo del juego. Esto es exactamente lo que los creadores de Spigot resolvieron tomando el núcleo de Bukkit como base y rediseñándolo para lograr una mejor confiabilidad y rendimiento. Sin embargo, el repositorio Git del proyecto se ha bloqueado debido a la Digital Millennium Copyright Act ( DMCA ) y las fuentes no se pueden descargar desde allí.



Por el momento, SpigotMC se está desarrollando y utilizando activamente. Es compatible con todos los complementos creados para Bukkit, pero no es compatible con versiones anteriores. Para sortear la prohibición de eliminación de DMCA, se acuñó una forma elegante llamada BuildTools. Esta herramienta elimina la necesidad de distribuir una aplicación compilada y permite a los usuarios compilar Spigot, CraftBukkit y Bukkit desde la fuente. Todo esto hace que la prohibición de la DMCA sea inútil.



PaperMC



Todo parecía genial y Spigot era una gran opción. Pero algunos entusiastas no encontraron esto lo suficiente, y escribieron su propio tenedor de Spigot "con esteroides". En la página del proyecto, la ventaja clave dice que "es estúpidamente rápido". Una comunidad desarrollada le permite resolver rápidamente problemas emergentes, y una API extendida le permite crear complementos interesantes. Puede iniciar PaperMC con un simple comando de la documentación .



Todo está bien con la compatibilidad de PaperMC, por lo que los complementos escritos para SpigotMC funcionarán fácilmente en PaperMC, pero sin soporte oficial. La compatibilidad con versiones anteriores con SpigotMC también está presente. Ahora que hemos enumerado las diversas opciones para crear un servidor, pasemos a los problemas de rendimiento que pueden surgir.



Problemas y soluciones



Lo principal a entender es que todo lo relacionado con el procesamiento del mundo del juego se procesará solo en un núcleo informático del servidor físico. Entonces, si de repente tienes un excelente servidor con una docena de núcleos informáticos, solo se cargará uno. Todo lo demás estará prácticamente inactivo. Esta es la arquitectura de la aplicación, y no hay nada que pueda hacer al respecto. Por lo tanto, al elegir un servidor, debe prestar atención no a la cantidad de núcleos, sino a la frecuencia del reloj. Cuanto más alto sea, mejor será el rendimiento.



En cuanto a la cuestión de la cantidad de RAM, se debe proceder de los siguientes indicadores:



  • número planificado de jugadores;
  • el número planeado de mundos en el servidor;
  • El tamaño de cada mundo.


Recuerde que una aplicación Java siempre necesita un margen de RAM. Si cuenta con un consumo de memoria de 8 gigabytes, de hecho, necesita tener 12. Los números son relativos, pero la esencia no cambia.



Para iniciar el lado del servidor, recomendamos usar las banderas especificadas en el artículo Tuning the JVM - G1GC Garbage Collector Flags for Minecraft . Esta "magia negra" permite al servidor configurar de forma inteligente el recolector de basura y optimiza el uso de RAM. No vale la pena asignar más memoria de la que el servidor realmente consume durante la afluencia máxima de jugadores.



Generando un mapa de bloques

"¿De verdad crees que la luna solo existe cuando la miras?" (Albert Einstein)
Nuevo servidor. Tan pronto como el jugador se conecta con éxito por primera vez, el personaje del juego aparece en un punto de reunión común (engendro). Este es el único lugar donde el servidor genera previamente el mundo del juego. En el mismo momento, la parte del cliente analiza la configuración y el parámetro clave es la distancia de dibujo. Se mide en fragmentos (el área del mapa es de 16x16 y 256 bloques de altura). Cuántos fragmentos se indican allí, esto es exactamente cuánto se solicitará al servidor.



Se almacena un mapa global del mundo en el servidor, y si no hay bloques generados en él en el punto de aparición del personaje del juego, entonces el servidor los genera y almacena dinámicamente. Esto no solo requiere grandes recursos informáticos, sino que también aumenta constantemente el tamaño del mapa mundial. En uno de los servidores anarquistas más antiguos 2b2t(2builders2tools) el tamaño del mapa ya ha excedido 8 Tb, y la frontera mundial está en la marca de 30 millones de bloques. Miles de historias están asociadas con este servidor y merece su propio artículo en una serie de artículos.



Generar un mundo alrededor de un jugador no es un problema. Generar un mundo alrededor de cientos de jugadores provocará frenos de servidor menores por un corto tiempo, después de lo cual la carga disminuirá. La generación del mundo a la distancia de atraer a un cliente alrededor de mil jugadores ya es capaz de "abandonar" el servidor y expulsar a todos los clientes de él por tiempo de espera.

El software del servidor tiene un valor como TPS (Ticks por servidor - ticks por segundo). Típicamente, 1 ciclo de reloj es igual a 50 ms. (1 segundo del mundo real es igual a 20 barras del mundo del juego). Si el procesamiento de un reloj aumenta a 60 segundos, la aplicación del servidor se cerrará, eliminando a todos los jugadores.
La salida es limitar el mundo a ciertas coordenadas y realizar la generación preliminar de bloques. Por lo tanto, eliminamos la necesidad de generación dinámica durante el juego, y el servidor solo tendrá que leer el mapa existente. Ambos problemas son manejados por un solo plugin WorldBorder .



La forma más fácil es establecer el borde del mundo en forma de círculo en relación con el punto de generación (aunque puede hacerlo de cualquier forma) con un comando:



/wb set <  > spawn


Si el personaje del jugador intenta cruzar la frontera, será arrojado unas pocas cuadras. Si esto se hace varias veces en un tiempo limitado, el intruso será teletransportado a la fuerza al punto de generación. Pregenerar el mundo es aún más fácil con el comando:



/wb fill


Dado que esta acción puede afectar potencialmente a los jugadores en el servidor, no olvide confirmar la ejecución:



/wb confirm


En total, tomó alrededor de 2 horas en un procesador Intel® Xeon® Gold 6240 para generar un mundo con un radio de 5000 bloques (~ 40 mil millones de bloques). Por lo tanto, si desea comenzar la pregeneración de un mapa más grande, tenga en cuenta que este proceso tomará una cantidad de tiempo decente , y el TPS del servidor se verá seriamente reducido. Además, recuerde que incluso un radio de 5,000 bloques requerirá aproximadamente 2 GB de espacio en disco.



A pesar de que la versión extrema del complemento se desarrolló para la versión 1.14 de Minecraft, se descubrió experimentalmente que funciona muy bien en versiones posteriores. Una lista completa de comandos con explicaciones está disponible en el foro de complementos .



Bloques de problemas



Hay muchos tipos de bloques en Minecraft. Sin embargo, nos gustaría llamar la atención de los lectores sobre un bloqueo como TNT . Como su nombre indica, este bloque es explosivo (la nota del editor es un elemento jugable en el mundo virtual y este elemento no tiene nada con explosivos reales) . Su peculiaridad es que en el momento de la activación, la fuerza de gravedad comienza a actuar sobre él. Esto obliga al servidor a calcular todas las coordenadas, si en este momento el bloque comienza a caer.



Si hay varios bloques TNT, entonces la detonación de un bloque provoca la detonación y la inclusión de la gravedad en los bloques vecinos, dispersándolos en todas las direcciones. Toda esta hermosa mecánica en el lado del servidor parece muchas operaciones para calcular la trayectoria de cada uno de los bloques, así como las interacciones con los bloques vecinos. La tarea es extremadamente intensiva en recursos, que todos pueden verificar fácilmente. Genere y explote un cubo de bloques TNT de al menos 30x30x30 de tamaño. Y si pensabas que tenías una buena computadora de juego poderosa, entonces estabas muy equivocado;)



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




Un "experimento" similar en un servidor con Intel® Xeon® Gold 6240 condujo a una seria "reducción" en TPS y una carga del 80% en la CPU durante todo el tiempo de detonación de bloque. En consecuencia, si alguno de los jugadores puede hacer esto, entonces el problema de rendimiento afectará a todos los jugadores en el servidor.



Una opción aún más dura son los Cristales del Fin . Sin embargo, si TNT explota secuencialmente, entonces los Cristales del Fin detonan todo al mismo tiempo, lo que en teoría puede detener por completo el funcionamiento de la aplicación del servidor.



Este escenario solo se puede evitar al prohibir por completo el uso de estos bloques en el mundo del juego. Por ejemplo, usando el complemento WorldGuard . Tenga en cuenta que este complemento en sí no funciona sin otro complemento WorldEdit. Instale WorldEdit primero y luego WorldGuard.



Conclusión



La gestión competente del servidor de juegos no es una tarea fácil. Las dificultades y el rendimiento reducido te esperarán a cada paso, especialmente si no tienes en cuenta la mecánica del juego. Es imposible prever todo, porque los jugadores a veces son muy creativos al tratar de obligar al servidor a hacer algo para lo que no estaba destinado. Solo un equilibrio razonable entre los riesgos y los límites establecidos permitirá que el servidor funcione en modo continuo y no reduzca su rendimiento a valores críticos.



En cuarentena, algunos de nuestros empleados se perdieron sus oficinas favoritas y decidieron recrearlas dentro de Minecraft. También tiene la oportunidad de visitarnos sin arriesgar su salud y perder tiempo en el camino.

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



, , «» .



All Articles