Otimização do servidor Minecraft

Otimização do servidor Minecraft
Em nosso blog já temos contado, como criar seu próprio servidor Minecraft, mas 5 anos se passaram desde então e muita coisa mudou. Estamos compartilhando com vocês as formas atuais de criar e otimizar a parte do servidor de um jogo tão popular.

Ao longo de seus 9 anos de história (contando a partir da data de lançamento), o Minecraft conquistou um número incrível de fãs e inimigos entre jogadores comuns e geeks. O conceito simples de um mundo feito de blocos evoluiu de uma simples forma de entretenimento para um meio universal de comunicação e criação de vários objetos do mundo real.

Além da construção, o jogo tem a capacidade de criar lógica, que permitem implementar algoritmos completos dentro do Minecraft. O YouTube está repleto de vídeos impressionantes onde as pessoas, com muito esforço e gastando muito tempo, criaram uma cópia deste ou daquele dispositivo eletrônico ou construíram uma cópia detalhada existente и fictício estruturas arquitetônicas. Tudo é limitado apenas pela imaginação do jogador e pelas possibilidades do universo do jogo.


Mas não vamos falar mais sobre o que exatamente os players criam, mas vamos dar uma olhada na parte do servidor do aplicativo e destacar os problemas (às vezes muito complexos) que podem surgir durante a operação sob carga. Vamos fazer já uma reserva que falaremos apenas da Edição Java.

Tipos de servidores

A opção mais simples é um servidor integrado ao cliente do jogo. Criamos um mundo, apertamos um botão e o servidor ficou acessível pela rede local. Esta opção não suporta nenhuma carga grave e, portanto, nem a consideraremos.

Baunilha

Mojang Studios está distribuindo a parte do servidor do jogo como um aplicativo Java gratuitamente no site oficial. Isso permite que você crie seu próprio servidor dedicado e pessoal, tornando-o acessível para conexão de qualquer lugar do planeta. Para quem está fazendo isso pela primeira vez, há uma grande tutorial, disponível no Wiki de jogos correspondente.

Essa abordagem tem uma séria desvantagem, ou seja, a falta de recursos prontos para uso para conectar plug-ins que expandem a funcionalidade do servidor e permitem não apenas automatizar muitos processos, mas também otimizar o desempenho. Além disso, o servidor oficial tem um consumo bastante grande de RAM para cada jogador conectado.

bukkit

Um aplicativo de servidor criado por entusiastas baseado na versão Vanilla bukkit expandiu significativamente as capacidades do jogo, suportando plug-ins e mods (modificações). Permitiu não apenas adicionar novos blocos à jogabilidade, mas também realizar diversas manipulações que eram inacessíveis ao software vanilla. Curiosamente, este aplicativo exigia significativamente menos memória.

Instalar o Bukkit não é difícil; as instruções correspondentes estão no recurso GamePedia. Mas isso não faz sentido, já que desde 2014 a equipe do Bukkit se desfez, os desenvolvedores do projeto tornaram-se funcionários da Mojang Studios e repositório abandonado. Assim, o Bukkit está efetivamente morto e faz sentido prestar atenção aos próximos dois projetos.

Spigot MC

Para facilitar a vida dos desenvolvedores de plugins, houve a necessidade de uma API para interagir com o mundo do jogo. Este é exatamente o problema que os criadores resolveram. Torneira, pegando o núcleo do Bukkit e reformulando-o para obter melhor confiabilidade e desempenho. No entanto, Repositório Git o projeto foi bloqueado devido à Lei de Direitos Autorais do Milênio Digital (DMCA) e é impossível baixar o código-fonte de lá.

Atualmente, o SpigotMC é desenvolvido e usado ativamente. Ele suporta todos os plugins criados para o Bukkit, mas não é compatível com versões anteriores. Para contornar a remoção do DMCA, um método elegante chamado BuildTools foi inventado. Esta ferramenta elimina a necessidade de distribuir um aplicativo compilado e permite aos usuários compilar Spigot, CraftBukkit e Bukkit a partir do código-fonte. Tudo isso torna a proibição do DMCA inútil.

Papel MC

Tudo parecia legal e o Spigot se tornou uma ótima opção. Mas isso não foi suficiente para alguns entusiastas, e eles criaram seu próprio fork do Spigot “com esteróides”. Sobre página do projeto a principal vantagem é que “é estúpido e rápido”. Desenvolvido comunidade permite resolver rapidamente problemas emergentes, e a API estendida permite criar plug-ins interessantes. Você pode iniciar o PaperMC com um comando simples, fornecido em documentação.

PaperMC tem excelente compatibilidade, então plug-ins escritos para SpigotMC podem funcionar facilmente no PaperMC, mas sem suporte oficial. A compatibilidade com versões anteriores do SpigotMC também está presente. Agora que listamos as diversas opções para a criação de um servidor, vamos passar aos problemas de desempenho que podem surgir.

Problemas e soluções

A principal coisa que você precisa entender é que tudo relacionado ao processamento do mundo do jogo será processado apenas em um núcleo de computação do servidor físico. Portanto, se de repente você tiver um servidor excelente com uma dúzia de núcleos de computação, apenas um será carregado. Todos os outros ficarão praticamente ociosos. Esta é a arquitetura do aplicativo e não há nada que você possa fazer a respeito. Portanto, ao escolher um servidor, você deve prestar atenção não ao número de núcleos, mas à frequência do clock. Quanto maior for, melhor será o desempenho.

Quanto à questão da capacidade de RAM, devemos partir dos seguintes indicadores:

  • número planejado de jogadores;
  • número planejado de mundos no servidor;
  • o tamanho de cada mundo.

Deve-se lembrar que uma aplicação Java sempre precisa de uma reserva de RAM. Se você espera um consumo de memória de 8 gigabytes, então na verdade você precisa de 12. Os números são relativos, mas a essência não muda.

Para iniciar a parte do servidor, recomendamos usar os sinalizadores especificados no artigo Ajustando a JVM – Bandeiras do coletor de lixo G1GC para Minecraft. Essa “magia negra” permite ao servidor configurar corretamente o “coletor de lixo” e otimizar o uso da RAM. Você não deve alocar mais memória do que o servidor realmente consome durante o pico de fluxo de jogadores.

Gerando um mapa de blocos

“Você realmente acha que a lua só existe quando você olha para ela?” (Albert Einstein)

Servidor completamente novo. Assim que o jogador se conectar com sucesso pela primeira vez, o personagem do jogo aparecerá no ponto de encontro geral (spawn). Este é o único lugar onde o mundo do jogo é pré-gerado pelo servidor. Ao mesmo tempo, a parte do cliente analisa as configurações e o parâmetro principal é a distância de desenho. É medido em pedaços (a área do mapa tem 16×16 e 256 blocos de altura) Quantos pedaços são indicados há exatamente quantos serão solicitados ao servidor.

O servidor armazena um mapa global do mundo e, se ainda não houver blocos gerados nele no momento em que o personagem do jogo aparece, o servidor os gera e armazena dinamicamente. Isto não só requer grandes recursos computacionais, mas também aumenta constantemente o tamanho do mapa mundial. Em um dos servidores anarquistas mais antigos 2b2t (2builders2tools) O tamanho do mapa já ultrapassou 8 Tb, e a fronteira do mundo está em torno de 30 milhões de blocos. Existem milhares de histórias associadas a este servidor e ele merece um artigo próprio na série.

Gerar um mundo em torno de um jogador não é um problema. Gerar um mundo em torno de centenas de jogadores causará pequenas lentidão no servidor por um curto período de tempo, após o qual a carga diminuirá. Gerar um mundo a uma distância de renderização do cliente em torno de mil jogadores já é capaz de “derrubar” o servidor e tirar todos os clientes dele devido a um timeout.

No software de servidor existe um valor como TPS (Ticks por Servidor - ticks por segundo). Normalmente, 1 ciclo de clock é igual a 50 ms. (1 segundo do mundo real equivale a 20 ticks do mundo do jogo). Se o processamento de um tick aumentar para 60 segundos, o aplicativo do servidor será fechado, expulsando todos os jogadores.

A solução é limitar o mundo a certas coordenadas e realizar a geração preliminar de blocos. Assim, eliminamos a necessidade de geração dinâmica durante o jogo, e o servidor precisará apenas ler um mapa existente. Ambos os problemas podem ser resolvidos com um único plugin Fronteira Mundial.

A maneira mais fácil é definir o limite mundial na forma de um círculo em relação ao ponto de desova (embora você possa fazer qualquer formato) com um comando:

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

Se o personagem do jogador tentar cruzar a fronteira, ele será empurrado vários blocos para trás. Se isso for feito várias vezes dentro de um tempo limitado, o infrator será teletransportado à força para o ponto de desova. A pré-geração do mundo é feita de forma ainda mais simples, com o comando:

/wb fill

Como esta ação pode afetar potencialmente os jogadores no servidor, certifique-se de confirmar:

/wb confirm

No total, foram necessárias aproximadamente 5000 horas para gerar um mundo com um raio de 40 blocos (~2 bilhões de blocos) em um processador Intel® Xeon® Gold 6240. Portanto, se você deseja pré-gerar um mapa maior, esteja ciente de que esse processo levará um tempo razoável e o TPS do servidor será seriamente reduzido. Além disso, lembre-se de que mesmo um raio de 5000 blocos exigirá aproximadamente 2 GB de espaço em disco.

Apesar de a versão mais recente do plugin ter sido desenvolvida para o Minecraft versão 1.14, foi descoberto experimentalmente que ele funciona muito bem nas versões subsequentes. Uma lista completa de comandos com explicações está disponível no fórum de plug-ins.

Blocos problemáticos

Há uma grande variedade de blocos no Minecraft. No entanto, gostaríamos de chamar a atenção dos leitores para um bloco como TNT. Como o nome sugere, este bloco é um explosivo (nota do editor - este é um item de jogo do mundo virtual e este item não tem nada com explosivos reais). Sua peculiaridade é tal que no momento da ativação a força da gravidade começa a atuar sobre ele. Isso força o servidor a calcular todas as coordenadas se neste momento o bloco começar a cair.

Se houver vários blocos de TNT, a detonação de um bloco causa a detonação e a ativação da gravidade nos blocos vizinhos, espalhando-os em todas as direções. Toda essa bela mecânica do lado do servidor parece uma série de operações para calcular a trajetória de cada bloco, bem como a interação com os blocos vizinhos. A tarefa consome muitos recursos, o que qualquer pessoa pode verificar facilmente. Gere e detone um cubo a partir de blocos de TNT com tamanho de pelo menos 30x30x30. E se você pensava que tinha um computador para jogos bom e poderoso, você se enganou muito 😉

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

Otimização do servidor Minecraft
Um “experimento” semelhante em um servidor com Intel® Xeon® Gold 6240 levou a uma grave queda de TPS e 80% de carga de CPU durante todo o tempo de detonação do bloco. Portanto, se algum jogador conseguir fazer isso, o problema de desempenho afetará todos os jogadores do servidor.

Uma opção ainda mais difícil - Cristais de Borda. Mesmo assim, se o TNT explodir sequencialmente, os Edge Crystals detonarão todos ao mesmo tempo, o que em teoria pode interromper completamente a operação do aplicativo do servidor.

Este cenário só pode ser evitado proibindo completamente o uso desses blocos no mundo do jogo. Por exemplo, usando o plug-in Guarda Mundial. Observe que este plugin por si só não funciona sem outro plugin Editar mundo. Portanto, instale primeiro o WorldEdit e depois o WorldGuard.

Conclusão

Gerenciar adequadamente um servidor de jogo não é uma tarefa fácil. Dificuldades e diminuição do desempenho estarão esperando por você a cada passo, especialmente se você não levar em conta a própria mecânica de jogo. É impossível prever tudo, porque os jogadores podem por vezes ser muito criativos ao tentar forçar o servidor a fazer algo para o qual não foi concebido. Somente um equilíbrio razoável entre riscos e restrições estabelecidas permitirá que o servidor opere continuamente e não reduza seu desempenho a valores críticos.

Durante a quarentena, alguns de nossos funcionários sentiram falta de seus escritórios favoritos e decidiram recriá-los dentro do Minecraft. Você também tem a chance de nos visitar sem arriscar sua saúde ou perder tempo na estrada.

Para fazer isso, convidamos todos para o nosso servidor minecraft.selectel.ru (cliente versão 1.15.2), onde foram recriados os data centers Tsvetochnaya-1 e Tsvetochnaya-2. Não se esqueça de concordar em baixar recursos adicionais, eles são necessários para a correta exibição de alguns locais.

Missões, códigos promocionais, ovos de Páscoa e comunicação agradável esperam por você.

Fonte: habr.com

Adicionar um comentário