Otimização do servidor Minecraft



Em nosso blog, já falamos sobre como criar seu próprio servidor Minecraft, no entanto, cinco anos se passaram desde então e muita coisa mudou. Estamos compartilhando com você as formas atuais de criar e otimizar o lado do servidor de um jogo tão popular.



Nos seus 9 anos de história (contados a partir da data de lançamento), o Minecraft ganhou um número incrível de fãs e inimigos, tanto entre jogadores casuais quanto nerds. O conceito simples de um mundo de cubos evoluiu de um entretenimento simples para um ambiente universal para comunicação e criação de vários objetos do mundo real.



Além da construção, o jogo tem a capacidade de criar circuitos lógicos que permitem implementar algoritmos completos no Minecraft. O YouTube está repleto de vídeos impressionantes, onde as pessoas dedicam muito tempo e esforço para criar uma cópia de um dispositivo eletrônico ou criar uma cópia detalhada das estruturas arquitetônicas existentes e ficcionais . Tudo é limitado apenas pela fantasia do jogador e pelas possibilidades do universo dos jogos.





Mas não vamos falar mais sobre o que exatamente os players estão criando, mas vamos olhar para o lado do servidor do aplicativo e destacar os problemas (às vezes muito complexos) que podem surgir durante o trabalho sob carga. Vamos fazer uma reserva imediatamente, de que falaremos apenas sobre o Java Edition.



Tipos de servidor



A opção mais simples é o servidor embutido no cliente do jogo. Criamos um mundo, pressionamos um botão e agora o servidor ficou disponível na rede local. Esta opção não pode suportar qualquer carga séria e, portanto, nem a consideraremos.



Baunilha



Mojang Studios distribui a parte do servidor do jogo como um aplicativo Java de graça no site oficial . Isso permite que você crie seu próprio servidor dedicado e seu mundo pessoal, disponibilizando-o para conexão de qualquer lugar do mundo. Para aqueles que estão fazendo isso pela primeira vez, há um excelente tutorial disponível no respectivo jogo Wiki.



Essa abordagem tem uma séria desvantagem, a saber, a falta de oportunidades "prontas para uso" para conectar plug-ins que ampliam a funcionalidade do servidor e permitem não apenas automatizar muitos processos, mas também otimizar o desempenho. Além disso, o servidor oficial possui um consumo bastante grande de RAM para cada player conectado.



Bukkit



Criado por entusiastas baseados na versão Vanilla, o aplicativo do servidor Bukkit expandiu significativamente os recursos do jogo, suportando plugins e mods (modificações). Permitiu não apenas adicionar novos blocos à jogabilidade, mas também executar várias manipulações inacessíveis ao software vanilla. Curiosamente, esse aplicativo requeria significativamente menos memória.



Não é difícil instalar o Bukkit, as instruções correspondentes estão no recurso GamePedia . Mas isso não faz sentido, desde que a equipe de Bukkit se separou desde 2014, os desenvolvedores do projeto se tornaram funcionários dos Mojang Studios e o repositório foi abandonado. Então Bukkit está realmente morto e faz sentido prestar atenção nos próximos dois projetos.



SpigotMC



Para tornar a vida mais fácil para os desenvolvedores de plugins, havia uma necessidade de uma API para interagir com o mundo do jogo. Foi exatamente isso que os criadores do Spigot resolveram, tomando como base o núcleo do Bukkit e reformulando-o para obter melhor confiabilidade e desempenho. No entanto, o repositório Git do projeto foi bloqueado devido ao Digital Millennium Copyright Act ( DMCA ) e as fontes não podem ser baixadas a partir daí.



No momento, o SpigotMC está sendo desenvolvido e usado ativamente. Ele suporta todos os plugins criados para o Bukkit, mas não é compatível com ele. Para contornar a proibição de remoção da DMCA, foi criada uma maneira elegante chamada BuildTools. Essa ferramenta elimina a necessidade de distribuir um aplicativo compilado e permite que os usuários compilem Spigot, CraftBukkit e Bukkit a partir da fonte. Tudo isso torna a proibição do DMCA inútil.



PaperMC



Tudo parecia legal e Spigot era uma ótima opção. Mas alguns entusiastas não acharam o suficiente e escreveram seu próprio garfo de Spigot "em esteróides". Na página do projeto, a principal vantagem afirma que “é estúpido e rápido”. Uma comunidade desenvolvida permite que você resolva rapidamente problemas emergentes, e uma API estendida permite criar plugins interessantes. Você pode iniciar o PaperMC com um comando simples da documentação .



Tudo está bem com a compatibilidade do PaperMC, então os plugins escritos para o SpigotMC funcionarão facilmente no PaperMC, mas sem o suporte oficial. A compatibilidade com o SpigotMC também está presente. Agora que listamos as várias opções para criar um servidor, vamos para os problemas de desempenho que podem surgir.



Problemas e soluções



O principal a 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 excelente servidor com uma dúzia de núcleos de computação, apenas um será carregado. Todo o resto ficará praticamente ocioso. Essa é a arquitetura do aplicativo e não há nada que você possa fazer sobre isso. Portanto, ao escolher um servidor, você deve prestar atenção não ao número de núcleos, mas à frequência do relógio. Quanto mais alto, melhor será o desempenho.



Quanto à questão da quantidade de RAM, deve-se proceder dos seguintes indicadores:



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


Lembre-se de que um aplicativo Java sempre precisa de um espaço livre de RAM. Se você está contando com um consumo de memória de 8 gigabytes, na verdade você precisa ter 12. Os números são relativos, mas a essência não muda.



Para iniciar o lado do servidor, recomendamos o uso dos sinalizadores especificados no artigo Ajustando os sinalizadores de coletor de lixo da JVM - G1GC para Minecraft . Essa "magia negra" permite ao servidor configurar de forma inteligente o coletor de lixo e otimizar o uso da RAM. Não vale a pena alocar mais memória do que o servidor realmente consome durante o pico de entrada de jogadores.



Gerando um mapa de blocos

"Você realmente acha que a lua existe apenas quando você olha para ela?" (Albert Einstein)
Novo servidor. Assim que o jogador se conectar com sucesso pela primeira vez, o personagem do jogo aparecerá em um ponto de encontro comum (spawn). Este é o único lugar em que o mundo do jogo é pré-gerado pelo servidor. No mesmo momento, a peça do cliente analisa as configurações e o parâmetro principal é a distância do desenho. É medido em pedaços (a área do mapa tem 16x16 e 256 blocos de altura). Quantos pedaços são indicados lá, é exatamente quanto será solicitado ao servidor.



Um mapa global do mundo é armazenado no servidor e, se não houver blocos gerados no ponto de aparência do personagem do jogo, o servidor os gera e os armazena dinamicamente. Isso não apenas requer grandes recursos de computação, como 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 mundial está na marca de 30 milhões de blocos. Milhares de histórias estão associadas a este servidor e merecem seu próprio artigo em uma série de artigos.



Gerar um mundo em torno de um jogador não é um problema. Gerar um mundo em torno de centenas de jogadores causará pequenos travões no servidor por um curto período de tempo, após o qual a carga diminuirá. A geração do mundo à distância de atrair um cliente em torno de mil jogadores já é capaz de "abandonar" o servidor e expulsar todos os clientes dele por tempo limite.

O software do servidor tem um valor como TPS (Ticks per Server - ticks per second). Normalmente, 1 ciclo de relógio é igual a 50 ms. (1 segundo do mundo real é igual a 20 barras do mundo do jogo). Se o processamento de um relógio aumentar para 60 segundos, o aplicativo do servidor será fechado, descartando todos os jogadores.
A saída é limitar o mundo a determinadas coordenadas e executar a geração preliminar de blocos. Assim, removemos a necessidade de geração dinâmica durante o jogo, e o servidor precisará apenas ler o mapa existente. Ambos os problemas são tratados por um único plug- in do WorldBorder .



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



/wb set <  > spawn


Se o personagem do jogador tentar cruzar a fronteira, ele será jogado para trás alguns quarteirões. Se isso for feito várias vezes em um tempo limitado, o invasor será teleportado à força para o ponto de desova. A pré-geração do mundo é ainda mais fácil com o comando:



/wb fill


Como esta ação pode afetar os jogadores no servidor, não se esqueça de confirmar a execução:



/wb confirm


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



Apesar do fato de a versão extrema do plug-in ter sido desenvolvida para a versão 1.14 do Minecraft, descobriu-se experimentalmente que funciona muito bem nas versões subseqüentes. Uma lista completa de comandos com explicações está disponível no fórum do plug-in .



Blocos de problemas



Existem muitos tipos de blocos no Minecraft. No entanto, gostaríamos de chamar a atenção dos leitores para um bloco como o TNT . Como o nome sugere, esse bloco é um explosivo (a nota do editor é um item reproduzível no mundo virtual e esse item não tem nada com explosivos reais) . Sua peculiaridade é que, no momento da ativação, a força da gravidade começa a agir sobre ela. Isso força o servidor a calcular todas as coordenadas, se nesse momento o bloco começar a cair.



Se houver vários blocos TNT, a detonação de um bloco causa detonação e a inclusão de gravidade nos blocos vizinhos, espalhando-os em todas as direções. Toda essa mecânica bonita do lado do servidor parece muitas operações para calcular a trajetória de cada um dos blocos, bem como as interações com os blocos vizinhos. A tarefa é extremamente intensiva em recursos, que todos podem verificar facilmente. Gere e exploda um cubo de blocos TNT com tamanho mínimo de 30x30x30. E se você pensou que tinha um bom e poderoso computador para jogos, estava muito enganado;)



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




Um "experimento" semelhante em um servidor com o Intel® Xeon® Gold 6240 levou a um sério "rebaixamento" do TPS e a 80% de carga na CPU durante todo o tempo de detonação do bloco. Conseqüentemente, se algum dos jogadores puder fazer isso, o problema de desempenho afetará todos os jogadores no servidor.



Uma opção ainda mais difícil são os cristais do fim . Se, no entanto, a TNT explodir seqüencialmente, os Cristais do Fim detonam tudo ao mesmo tempo, o que, em teoria, pode interromper completamente a operação do aplicativo do servidor.



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



Conclusão



O gerenciamento competente de servidores de jogos não é uma tarefa fácil. Dificuldades e desempenho reduzido aguardam a cada passo, especialmente se você não levar em conta a própria mecânica da jogabilidade. É impossível prever tudo, porque os jogadores às vezes são muito criativos ao tentar forçar o servidor a fazer algo para o qual não foi planejado. Somente um equilíbrio razoável entre riscos e limites estabelecidos permitirá que o servidor trabalhe em modo contínuo e não reduza seu desempenho a valores críticos.



Em quarentena, alguns de nossos funcionários perderam seus escritórios favoritos e decidiram recriá-los no Minecraft. Você também pode nos visitar sem arriscar sua saúde e perder tempo na estrada.

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



, , «» .



All Articles