O maior portal de MU Online do Brasil — desde 2003
Tutorial Avançado Servidor

Como diagnosticar quedas do GameServer em horário de pico no seu MU Online

Descubra por que o GameServer do seu servidor de MU Online cai justamente no horário de mais jogadores online, analisando dumps de crash, limites de conexão, uso de memória e configuração do banco de dados.

RO Rodrigo · Atualizado em 7 set 2023 · ⏱ 17 min de leitura
Resposta rápida

Poucos problemas frustram tanto quanto um GameServer que roda perfeitamente o dia inteiro e cai exatamente quando o servidor está cheio — no horário nobre, no fim de semana, durante um evento. Esse padrão não é coincidência: ele é a evidência mais clara de que o problema está ligado a capacidade, se

Poucos problemas frustram tanto quanto um GameServer que roda perfeitamente o dia inteiro e cai exatamente quando o servidor está cheio — no horário nobre, no fim de semana, durante um evento. Esse padrão não é coincidência: ele é a evidência mais clara de que o problema está ligado a capacidade, seja de memória, conexões, threads ou banco de dados, e não a um bug aleatório. Este tutorial ensina a investigar sistematicamente essas quedas, desde a coleta do dump de crash até a configuração de limites que evitam o colapso completo do servidor.

Por que o padrão "cai no pico" é tão revelador

Quando uma falha ocorre de forma aleatória, independente da carga, geralmente é um bug de lógica (um pacote malformado, um comando específico). Quando a falha correlaciona fortemente com o número de jogadores online, o padrão aponta para um recurso finito sendo esgotado: memória alocada por conexão que nunca é liberada, número de threads/handles atingindo um teto do sistema operacional, pool de conexões do banco de dados esgotado, ou um limite de configuração (MaxConnection) sendo ultrapassado sem tratamento adequado de erro. O primeiro passo do diagnóstico é confirmar essa correlação com dados, não só impressão.

Passo 1 — Confirmar a correlação com número de jogadores online

Antes de investigar a fundo, monte um gráfico simples: número de jogadores online (log do GameServer ou do site, se houver contador) cruzado com o horário exato das quedas dos últimos 7-14 dias. Se as quedas se concentram acima de um determinado número de jogadores (ex.: sempre acima de 400-500 online), você já tem um teto aproximado de capacidade a investigar.

DataJogadores online na quedaHorário
Sex51221:40
Sáb49822:15
Dom52020:55
Seg180— (sem queda)

Um padrão assim (quedas sempre acima de ~500, dias com menos de 300 sem incidente) é evidência forte de limite de capacidade.

Passo 2 — Coletar o dump de crash no momento da queda

Configure o Windows para gerar um dump completo (ou minidump) quando o GameServer.exe falhar, via Windows Error Reporting ou uma ferramenta como ProcDump da Sysinternals, monitorando o processo continuamente:

procdump -ma -e GameServer.exe C:\Dumps\

O parâmetro -e gera o dump automaticamente na primeira exceção não tratada, e -ma captura a memória completa do processo — essencial para ver o estado exato no momento da falha.

Passo 3 — Analisar o dump

Abra o dump no WinDbg (gratuito, parte do Windows SDK) e rode os comandos básicos de triagem:

!analyze -v
~*kb   -- pilha de todas as threads
!heap -s -- resumo de heap, útil para suspeita de estouro de memória

Procure na call stack o módulo e a função onde a exceção ocorreu. Mesmo sem entender cada símbolo, já dá para classificar: falha em código de rede (recv/send), falha em alocação de memória (operator new, malloc retornando falha), ou falha em acesso a dados (ponteiro nulo em estrutura de personagem/inventário).

Passo 4 — Verificar limites de conexão configurados

No GameServerInfo.dat (ou equivalente do seu emulador), confira o teto de conexões simultâneas configurado:

[GameServerInfo]
MaxConnection = 800
MaxUserAcceptConnection = 1000

Se o número de jogadores online no momento da queda se aproxima ou ultrapassa esse valor, o servidor pode estar tentando aceitar mais conexões do que a configuração (ou o hardware) suporta, gerando exceção não tratada em vez de simplesmente recusar a conexão extra. Aumentar o limite sem garantir que o hardware aguenta só adia o problema para um número maior.

Passo 5 — Monitorar memória do processo ao longo do dia

Use o Gerenciador de Tarefas (aba Detalhes, com a coluna de memória privada) ou um script de monitoramento para registrar o uso de memória do GameServer.exe a cada 15-30 minutos:

Get-Process GameServer | Select-Object Name, @{n='MemMB';e={$_.WorkingSet64/1MB}}

Se a memória cresce de forma constante ao longo do dia (sem nunca cair, mesmo com jogadores saindo), há vazamento de memória acumulando — nesse caso, veja o tutorial dedicado a diagnosticar vazamento de memória no GameServer para aprofundar essa investigação específica.

Passo 6 — Checar o pool de conexões do banco de dados

Um gargalo comum e menos óbvio: o GameServer mantém um número limitado de conexões abertas com o SQL Server (pool). Sob pico de jogadores, se muitas operações (login, save de personagem, trade) competem pelo pool ao mesmo tempo, conexões podem começar a falhar ou enfileirar, e dependendo de como o emulador trata esse erro, isso pode derrubar o processo inteiro em vez de apenas atrasar a operação.

ConfiguraçãoOnde ficaSintoma se insuficiente
Max Pool Size (connection string)Config de conexão do GameServerTimeout/erro de conexão sob pico
Timeout de queryConfig de conexãoQueries lentas geram erro em cascata
Conexões máximas do SQL Serversp_configure no SQL ServerRejeição de novas conexões

Passo 7 — Revisar limites do sistema operacional

Threads, handles e sockets também têm teto no Windows. Em servidores com muitas conexões simultâneas, vale checar se o processo está próximo do limite de handles (visível no Gerenciador de Tarefas, coluna "Handles") e se a configuração de rede do Windows Server não está limitando conexões TCP simultâneas (relevante em edições não-Server do Windows, que têm limites artificiais de conexão).

Passo 8 — Testar com carga simulada antes do próximo pico

Se possível, use uma ferramenta de simulação de bots/conexões (scripts de teste de carga específicos para o emulador, ou até múltiplas instâncias de cliente automatizadas) para reproduzir o número de conexões próximo ao que causa a queda, em ambiente de teste, fora do horário real de jogo. Isso permite observar o comportamento do servidor sob estresse controlado e validar se um ajuste (limite de conexão, pool de banco, otimização de código) realmente resolve, sem arriscar a base de jogadores real.

Mitigação temporária enquanto investiga

Enquanto a causa raiz não é 100% resolvida, algumas mitigações reduzem o impacto:

  • Reinício programado do GameServer em horário de baixo movimento (madrugada), limpando estado acumulado e reduzindo vazamento antes do próximo pico.
  • Fila de entrada (login queue) configurada perto do limite de capacidade real, para recusar novas conexões educadamente em vez de estourar o processo.
  • Alertas automáticos quando o número de online se aproxima do teto histórico de queda, dando tempo de reação da equipe.

Erros comuns e soluções

SintomaCausa provávelSolução
Servidor cai sempre acima de X jogadores onlineLimite de capacidade (memória, conexão ou banco)Confirmar com dump/monitoramento e ajustar o recurso limitante real
Memória cresce o dia todo até a quedaVazamento de memória no GameServerInvestigar com ferramenta de profiling (ver tutorial dedicado)
Erros de timeout de banco no log antes da quedaPool de conexões do SQL Server esgotadoAumentar Max Pool Size e revisar queries lentas concorrentes
Dump mostra exceção em código de redeExcesso de conexões/pacotes simultâneosRevisar MaxConnection e considerar fila de entrada
Queda mesmo com poucos jogadores, sem padrão de horárioNão é problema de capacidade — bug de lógicaInvestigar comando/pacote específico, não infraestrutura

Checklist de diagnóstico de queda em horário de pico

  • Correlação entre número de jogadores online e horário das quedas confirmada com dados.
  • ProcDump ou equivalente configurado para capturar dump automático na falha.
  • Dump analisado no WinDbg com identificação da área de código envolvida.
  • Limite MaxConnection/MaxUserAcceptConnection revisado contra a capacidade real.
  • Uso de memória monitorado ao longo do dia para descartar/confirmar vazamento.
  • Pool de conexões do banco de dados verificado sob carga.
  • Teste de carga simulada realizado fora do horário real de jogo.
  • Mitigação temporária (reinício programado, fila de entrada) aplicada enquanto a causa raiz é corrigida.

Depois de estabilizar o GameServer no horário de pico, vale revisar toda a configuração de capacidade do ambiente para acompanhar o crescimento futuro da base de jogadores — o tutorial de criação de servidor de MU Online traz a base de configuração ideal para esse planejamento.

Perguntas frequentes

Por que o servidor cai só de noite ou fim de semana e não durante o dia?

Porque é justamente quando o número de jogadores online é maior. Se a queda é proporcional ao volume de conexões simultâneas, o problema é de capacidade (memória, conexões, CPU) e não um bug independente de horário.

Como sei se a queda é falta de memória (crash) ou travamento (freeze)?

Um crash mata o processo — ele some da lista de processos e reinicia (se houver watchdog) ou fica parado. Um freeze mantém o processo vivo mas sem responder, geralmente visível como uso de CPU zerado ou travado enquanto jogadores ficam presos na tela de carregamento.

MaxConnection no GameServerInfo resolve o problema sozinho?

Ajuda a evitar que o servidor aceite mais conexões do que aguenta, mas não resolve a causa raiz se o limite real é memória insuficiente ou banco de dados lento sob carga. É uma proteção, não uma correção completa.

Vale a pena reiniciar o GameServer automaticamente todo dia para prevenir queda no pico?

É uma prática comum e razoável como mitigação (reduz vazamento de memória acumulado), mas não substitui o diagnóstico real. Trate como paliativo enquanto investiga a causa, não como solução definitiva.

Dump de crash (minidump) é difícil de analisar sem ser programador?

O básico é acessível: abrir no WinDbg ou Visual Studio e ler a call stack no momento da falha já aponta a área do código (rede, banco, memória) envolvida, mesmo sem entender cada linha. Para correção definitiva no código do emulador, geralmente é necessário suporte do desenvolvedor do emulador.

RO
Fundador e editor-chefe

Rodrigo mantém o ViciadosMU desde os primórdios do portal. Especialista em criação e administração de servidores de MU Online, história do jogo e a evolução das seasons — escreveu boa parte do acervo antes de 2024.

Continue lendo

Artigos relacionados