TestePt-Br

Guia de Otimização de Servidores Minecraft

⚠️ Para quem usa Vanilla, Fabric ou Spigot (ou qualquer coisa abaixo de Paper):

Acesse o server.properties e altere a opção sync-chunk-writes para false. Essa opção já é forçadamente false no Paper e seus forks, mas em outras implementações você precisa ajustar manualmente. Isso permite que o servidor salve chunks fora da thread principal, reduzindo a carga no tick loop principal.

Compatível com versão 1.21. Algumas recomendações ainda funcionam nas versões de 1.15 até 1.20.

Baseado neste guia originalarrow-up-right e outras fontes (todas estão linkadas no decorrer do texto).

Use o índice localizado acima (ao lado de README.md) para navegar facilmente pelo guia.


Introdução

Nunca existirá um guia com resultados perfeitos para todos. Cada servidor tem necessidades e limites próprios do que pode ou está disposto a sacrificar. O segredo está em ajustar cada opção conforme sua realidade.

Este guia serve para te ajudar a entender o impacto de cada configuração, e o que exatamente ela modifica. Se encontrar informações incorretas, sinta-se livre para abrir uma issue ou enviar um pull request com correções.


Preparação

JAR do Servidor

Sua escolha de software faz uma grande diferença no desempenho e nas possibilidades de API. Existem várias opções viáveis, mas algumas devem ser evitadas.

Top recomendações:

Evite:

  • Qualquer JAR pago que prometa "async" – 99,99% de chance de ser golpe.

  • Bukkit / CraftBukkit / Spigot – Extremamente ultrapassados em desempenho.

  • Plugins ou softwares que ativam/desativam/recarregam plugins em tempo real. Veja a seção sobre isso.

  • Forks muito distantes do Purpur/Pufferfish – costumam ser instáveis e problemáticos.

Se quer mais desempenho, otimize seu servidor ou crie um fork privado confiável.


Pré-geração de Mapa (Map Pregen)

Com as otimizações de geração de chunks nos últimos anos, a pré-geração só é útil em CPUs muito limitadas ou single-threaded. Porém, ainda é comum ao usar plugins de mapas como Dynmap ou Pl3xMap.

Se ainda quiser pré-gerar, use um plugin como Chunkyarrow-up-right.

  • Defina um world border, senão os jogadores poderão gerar chunks fora da área.

  • Pré-gerar pode levar horas, dependendo do raio configurado.

  • Com Paper+, o TPS não será afetado por carregamento de chunks, mas a velocidade de carregamento será afetada se a CPU estiver sobrecarregada.

Cada mundo (overworld, nether e the end) tem seu próprio border.

O Nether é 8x menor que o Overworld (se não modificado por datapack), então ajuste corretamente ou os jogadores podem sair da borda.

⚠️ Use o comando vanilla /worldborder set [diâmetro] para evitar lag de lookup em mapas do tesouro e outros sistemas.


Configurações

Rede

[server.properties]

network-compression-threshold

Valor inicial recomendado: 256

Define o tamanho mínimo (em bytes) de um pacote para o servidor comprimir.

  • Maior valor: economiza CPU, mas usa mais banda.

  • Menor valor: ajuda clientes com internet fraca.

  • Valor -1 desativa a compressão.

Se seu servidor usa proxy ou está na mesma máquina (latência < 2ms), desativar a compressão (-1) pode ser benéfico.


[purpur.yml]

use-alternate-keepalive

Valor inicial recomendado: true

Ativa o sistema de keepalive alternativo do Purpur. Ajuda jogadores com conexão instável a evitarem timeouts.

⚠️ Pode ser incompatível com TCPShield.

“Esse sistema envia pacotes a cada 1s e só desconecta se nenhum for respondido em 30s. Qualquer resposta mantém o jogador online.”

Fonte: https://purpurmc.org/docs/Configuration/#use-alternate-keepalive


Chunks

[server.properties]

simulation-distance

Valor inicial recomendado: 4

Distância em chunks ao redor do jogador onde o servidor irá executar ticks. Coisas como fornalhas, crescimento de plantas, etc.

Mantenha esse valor baixo (3–4), e use o view-distance para exibir mais chunks sem processá-los. Isso economiza recursos.

view-distance

Valor inicial recomendado: 7

Distância de visualização em chunks enviada ao cliente. Semelhante ao no-tick-view-distance do Paper.

O total de chunks exibidos será o maior valor entre simulation e view-distance. Exemplo: simulation-distance: 4, view-distance: 12 → jogador verá 12 chunks.


[spigot.yml]

view-distance

Valor recomendado: default

Se definido como qualquer coisa diferente de default, substitui o valor do server.properties.

Deixe em default para gerenciar tudo em um único lugar.


[paper-world configuration]

delay-chunk-unloads-by

Valor inicial recomendado: 10s

Define por quanto tempo um chunk permanece carregado após o jogador sair. Ajuda a evitar cargas/descarregas constantes de chunks.

Não exagere nesse tempo ou você pode ter muitos chunks ativos.

max-auto-save-chunks-per-tick

Valor inicial recomendado: 8

Espalha o salvamento de chunks ao longo do tempo. Pode ser aumentado em servidores com +30 jogadores.

Se o salvamento incremental não terminar a tempo, o Bukkit força salvamento completo, o que causa travamentos.

prevent-moving-into-unloaded-chunks

Valor inicial recomendado: true

Impede jogadores de entrarem em chunks descarregados, o que causaria carregamentos sincronizados e lag.

A chance disso acontecer aumenta quanto menor for sua view-distance.

entity-per-chunk-save-limit

Valores iniciais recomendados:

Isso limita a quantidade salva de entidades por chunk, evitando salvar milhares de projéteis inúteis e reduzindo lag de IO.


🎯 Limite de Entidades Salvas

Arquivo: pufferfish.yml Opção: max-loads-per-projectile Valor sugerido: 8

Com essa opção, você pode limitar quantas entidades de determinado tipo podem ser salvas. É importante definir um limite para cada tipo de projétil para evitar problemas de desempenho e até crash ao carregar o servidor com muitos projéteis salvos. Você pode usar qualquer ID de entidade (veja a wiki do Minecraft para a lista). Essa configuração não foi feita para impedir os jogadores de criarem farms grandes de mobs.


🧟‍♂️ Mobs

Arquivo: bukkit.yml

spawn-limits

Valores sugeridos:

A fórmula de limitação de mobs é: [quantidade de jogadores] × [limite de cada tipo]

Ou seja, quanto menores os valores, menos mobs vão aparecer. Se per-player-mob-spawn estiver ativado, os mobs são distribuídos de forma mais equilibrada entre os jogadores. Você pode usar valores bem baixos como 20 se configurar o mob-spawn-range corretamente (veja abaixo).


ticks-per

Valores sugeridos:

Define com que frequência (em ticks) o servidor tenta spawnar determinados mobs. Mobs aquáticos e do tipo ambiente não precisam spawnar a todo momento, já que morrem com menos frequência. Para monstros, valores maiores geralmente não afetam farms, e aliviam a carga em áreas onde o spawn está desativado.


Arquivo: spigot.yml

mob-spawn-range

Valor sugerido: 3

Determina quantos chunks ao redor do jogador serão considerados para o spawn de mobs. Reduzir esse valor cria a impressão de que há mais mobs por jogador. Deve ser menor ou igual à sua simulation-distance, e nunca maior que hard despawn range ÷ 16.


entity-activation-range

Valores sugeridos:

Define a distância em que uma entidade começa a ser "ativada" (realiza ações). Reduzir melhora o desempenho, mas mobs podem ficar parados até o jogador se aproximar. Se for muito baixo, pode quebrar farms (especialmente de ferro).


entity-tracking-range

Valores sugeridos:

Define a distância máxima de visibilidade das entidades para o jogador. Se estiver muito baixo, mobs parecerão surgir do nada. Geralmente deve ser maior que entity-activation-range.


tick-inactive-villagers

Valor sugerido: false

Se ativado, aldeões continuam funcionando mesmo fora da faixa de ativação. Desativar melhora desempenho, mas pode afetar farms de ferro e reabastecimento de trocas.


nerf-spawner-mobs

Valor sugerido: true

Mobs gerados por spawners ficam sem IA, ou seja, não se movem nem atacam. Se quiser que pulem na água, use spawner-nerfed-mobs-should-jump: true em paper-world configuration.


Arquivo: paper-world configuration

despawn-ranges

Valores sugeridos:

Controla a distância (em blocos) para os mobs desaparecerem automaticamente.

  • Fora do hard range: mob desaparece instantaneamente.

  • Entre soft e hard: chance aleatória de sumir. Regule o hard com base na fórmula: (simulation-distance * 16) + 8


per-player-mob-spawns

Valor sugerido: true

Faz o sistema de spawn de mobs considerar quantos mobs já existem perto de cada jogador. Ajuda a impedir que farms dominem o limite total de mobs. Traz uma experiência mais parecida com o singleplayer. Leve impacto no desempenho, mas compensa.


max-entity-collisions

Valor sugerido: 2

Controla quantas colisões uma entidade pode processar ao mesmo tempo.

  • 0 = nada pode empurrar ou ser empurrado

  • 2 = suficiente para a maioria dos casos Nota: isso anula o gamerule maxEntityCramming se ele for maior que esse valor.

[paper-world-defaults.yml]

update-pathfinding-on-block-update

Valor recomendado: false Desativar isso reduz a quantidade de pathfinding feito, melhorando o desempenho. Em alguns casos, isso fará os mobs parecerem mais "lagados", pois eles atualizarão sua rota a cada 5 ticks (0.25 segundos).


fix-climbing-bypassing-cramming-rule

Valor recomendado: true Corrige o problema de mobs não serem afetados pela regra de aglomeração (cramming) enquanto escalam, como aranhas. Evita que grandes quantidades fiquem acumuladas em espaços pequenos.


armor-stands.tick

Valor recomendado: false Pode ser desativado com segurança na maioria dos casos. Reative apenas se usar plugins que modificam armor stands e apresentar problemas. Impede que sejam afetados por água ou gravidade.


armor-stands.do-collision-entity-lookups

Valor recomendado: false Desativa colisões de armor stands. Útil se houver muitos no servidor e não houver necessidade de colisão.


tick-rates

Valores recomendados:

Define com que frequência certos comportamentos e sensores são ativados em ticks. O acquirepoi é o mais pesado, por isso foi aumentado. Diminua se houver problemas com vila.

⚠️ Não recomendado alterar se o DAB do Pufferfish estiver ativado!


[pufferfish.yml]

dab.enabled

Valor recomendado: true DAB reduz a frequência de ticks de entidades com base na distância dos jogadores, de forma gradual. Melhora desempenho sem os cortes bruscos do EAR.


dab.max-tick-freq

Valor recomendado: 20 Controla o tick mais lento possível para entidades longe dos jogadores. Aumentar melhora performance, mas pode quebrar farms de mobs.


dab.activation-dist-mod

Valor recomendado: 7 Define a "inclinação" do gradiente de ativação do DAB. Valores menores ativam mais perto dos jogadores (mais performance, mas maior risco de bugs/farms quebradas).


enable-async-mob-spawning

Valor recomendado: true Ativa a lógica assíncrona de spawn de mobs. Não faz o spawn realmente em paralelo, mas alivia carga da thread principal. Requer per-player-mob-spawns ativo no Paper.


enable-suffocation-optimization

Valor recomendado: true Otimiza a verificação de sufocamento, limitando-a ao tempo de dano. Quase imperceptível no jogo comum, útil para servidores com muitos mobs.


inactive-goal-selector-throttle

Valor recomendado: true Reduz a frequência que mobs inativos atualizam seus objetivos. Passa de 1 tick para 20 ticks. Melhora performance com impacto mínimo no gameplay.


[purpur.yml]

zombie.aggressive-towards-villager-when-lagging

Valor recomendado: false Zumbis deixam de perseguir aldeões quando o servidor está com lag, conforme limiar definido em lagging-threshold.


entities-can-use-portals

Valor recomendado: false Impede que entidades (exceto o jogador) usem portais, evitando carregamento de chunks desnecessário. Entidades não mudarão de dimensão.


villager.lobotomize.enabled

Valor recomendado: true ⚠️ Use apenas se aldeões causarem lag! Remove a IA de aldeões que não conseguem encontrar caminho. Eles apenas reabastecem ofertas de tempos em tempos. Liberá-los reativa a IA.


villager.search-radius

Valores recomendados:

Define o raio de busca por locais de trabalho e camas. Reduz drasticamente a carga com grandes quantidades de aldeões.


[spigot.yml]

merge-radius

Valores recomendados:

Distância para juntar itens e orbes de XP. Reduz a quantidade de entidades no chão. Valores altos podem causar desaparecimento aparente e bugs em farms.


hopper-transfer

Valor recomendado: 8 Tempo em ticks para um hopper transferir itens. Aumentar melhora performance mas pode quebrar sistemas de clock ou sorting.


hopper-check

Valor recomendado: 8 Tempo em ticks para um hopper verificar itens acima ou no inventário superior. Impacta diretamente sistemas baseados em hoppers com água/clocks.


[paper-world configuration]

alt-item-despawn-rate

Exemplo de valores recomendados:

Permite definir tempo individual de despawn (em ticks) para itens jogados no chão. Substitui plugins de limpeza e funciona junto com merge-radius.


redstone-implementation

Valor recomendado: ALTERNATE_CURRENT Substitui a lógica de redstone por uma mais otimizada baseada no mod Alternate Currentarrow-up-right. Melhora desempenho com pequenas inconsistências em sistemas extremamente técnicos.


hopper.disable-move-event

Valor recomendado: false Desativa o InventoryMoveItemEvent. Só ative se souber que seus plugins não precisam dele (ex: plugins de proteção).


hopper.ignore-occluding-blocks

Valor recomendado: true Faz com que hoppers ignorem blocos sólidos que normalmente bloqueariam containers (como minecart hopper sob areia). Pode quebrar farms específicas.


tick-rates.mob-spawner

Valor recomendado: 2 Controla com que frequência os spawners de mobs são atualizados. Valores mais altos diminuem a taxa de spawn, mas aliviam a performance.


⛏️ Desempenho de Spawners

Esta opção permite configurar com que frequência os spawners devem ser ativados. Valores mais altos reduzem o lag se houver muitos spawners, mas se estiver muito alto (em relação ao delay dos spawners), a taxa de spawn de mobs será reduzida.


💥 Explosões otimizadas

  • optimize-explosions: true

Substitui o algoritmo padrão de explosão por um mais rápido, com leve perda de precisão nos cálculos de dano. Normalmente, isso não é perceptível.


🗺️ Mapas do tesouro

  • treasure-maps.enabled: false

Gerar mapas do tesouro é extremamente custoso e pode travar o servidor se a estrutura estiver em chunk não gerado. Só ative se tiver pré-gerado o mundo e definido uma borda mundial do Vanilla.

  • treasure-maps.find-already-discovered

    • loot-tables: true

    • villager-trade: true

Esta opção define se os mapas recém-gerados podem apontar para estruturas já descobertas. Se deixar false, o servidor pode travar ao tentar encontrar estruturas ainda não geradas. villager-trade se refere a mapas negociados com aldeões. loot-tables se aplica a baús com loot dinâmico (masmorras, tesouros, etc).


🌱 Taxas de atualização do mundo

  • tick-rates.grass-spread: 4

Intervalo em ticks para espalhamento de grama ou micélio. Valor 4 é ideal para reduzir a frequência sem impacto visual perceptível.

  • tick-rates.container-update: 1

Intervalo em ticks entre atualizações de containers. Aumentar pode ajudar com travamentos causados por containers, mas pode causar desincronização (itens fantasmas).


🏹 Desaparecimento de flechas

  • non-player-arrow-despawn-rate: 20

Tempo (em ticks) para flechas disparadas por mobs desaparecerem após colidir. Jogadores não podem pegá-las, então 20 (1 segundo) é ideal.

  • creative-arrow-despawn-rate: 20

Mesmo caso, mas para flechas disparadas por jogadores em modo criativo.


⚙️ [pufferfish.yml]

  • disable-method-profiler: true

Esta opção desativa o profiler adicional usado apenas em debug. Causa lag desnecessário em produção.


🐬 [purpur.yml]

  • dolphin.disable-treasure-searching: true

Evita que golfinhos façam busca de estruturas como mapas do tesouro.

  • teleport-if-outside-border: true

Teleporta o jogador para o spawn se ele sair da borda do mundo. Útil já que a borda vanilla pode ser burlada e o dano mitigado.


🔐 [paper-world configuration]

  • anti-xray.enabled: true

Esconde minérios de x-rayers. Impacta performance, mas ainda é mais leve que plugins de anti-xray. Recomendado.

  • nether-ceiling-void-damage-height: 127

Se maior que 0, jogadores acima dessa altura no Nether tomam dano como se estivessem no Void. Impede uso do teto do Nether. O valor ideal é 127.


Java - Início do Servidor

O Minecraft 1.20.5+ requer Java 21 ou superior. Use Adoptiumarrow-up-right ou Amazon Correttoarrow-up-right. JVMs alternativas como OpenJ9 ou GraalVM não são recomendadas.

Flags de inicialização otimizadas: 🔗 Aikar’s flagsarrow-up-right 🔧 Gerador recomendado: flags.sharrow-up-right

Para melhorar performance com SIMD, adicione:

antes do -jar. Isso acelera mapas de plugins como ImageOnMaps em até 8x.


🚫 Plugins Problemáticos

❌ Plugins que removem itens do chão

Inúteis. merge-radius e alt-item-despawn-rate fazem isso com mais eficiência.

❌ Mob Stacker

Na maioria dos casos, gera mais lag do que ajuda, principalmente para mobs naturais. Só se justifica para spawners em massa.

❌ Plugins que ativam/desativam outros plugins

Extremamente perigosos. Podem corromper dados e causar crashes. O comando /reload sofre dos mesmos problemas — veja este postarrow-up-right.


📊 Diagnóstico de Lag

/mspt

Mostra o tempo de processamento de ticks. Se os dois primeiros valores estiverem <50ms, o servidor está estável. O terceiro valor alto é normal ocasionalmente.

🔥 Sparkarrow-up-right

Plugin para profiling de CPU/RAM. Guia completo na wiki oficialarrow-up-right. Tutorial de análise de lag: clique aquiarrow-up-right

⏱️ Timings

Ferramenta básica de diagnóstico. Gere com /timings paste. Prefira Spark para menor impacto. Tutoriais: 🎥 Como ler Timings - por Aikararrow-up-right


🧨 Exploits e Correções

Veja exploits e como corrigi-los neste repositório: 🔗 GitHub - Exploits e Fixesarrow-up-right


Atualizado