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

Como otimizar o SQL Server para muitos jogadores no MU Online

Ajuste memória, tempdb, modelo de recuperação e configurações do SQL Server para o banco MuOnline aguentar centenas de jogadores simultâneos sem travar login nem salvar personagem.

GA Gabriel · Atualizado em 2 jul 2026 · ⏱ 24 min de leitura
Resposta rápida

Todo servidor de MU Online funciona liso com 15 jogadores. O problema aparece no primeiro evento cheio, no lançamento, na hora em que 200 pessoas tentam logar ao mesmo tempo: o login trava, o "salvar personagem" atrasa, o Castle Siege engasga. Na esmagadora maioria das vezes o culpado não é o GameSe

Todo servidor de MU Online funciona liso com 15 jogadores. O problema aparece no primeiro evento cheio, no lançamento, na hora em que 200 pessoas tentam logar ao mesmo tempo: o login trava, o "salvar personagem" atrasa, o Castle Siege engasga. Na esmagadora maioria das vezes o culpado não é o GameServer — é o SQL Server mal configurado. O banco MuOnline recebe uma enxurrada de leituras e escritas curtas (login, save de posição, inventário, log de eventos) e, se a memória, o tempdb e o modelo de recuperação não estiverem ajustados, tudo forma fila. Este guia mostra como preparar o SQL Server para escala. Os valores numéricos são exemplos que variam por versão do SQL e por tamanho do seu VPS — o que não varia é o método.

Nota: Este tutorial assume o banco MuOnline já restaurado e conectado. Se você está montando o servidor do zero, veja antes como criar um servidor de MU Online e volte para tunar o banco quando ele já estiver de pé.

Pré-requisitos

  • SQL Server instalado (2014, 2017, 2019 ou 2022 para servidores modernos; 2008 R2 ainda comum em clássico/Season 6) com o banco MuOnline restaurado;
  • SQL Server Management Studio (SSMS) atualizado;
  • Acesso sa ou um login com permissão sysadmin;
  • Conhecimento de quanta RAM e quantos núcleos o VPS tem (Task Manager → Desempenho, ou systeminfo);
  • De preferência, disco SSD (NVMe idealmente) para os arquivos de dados e log;
  • Um backup recente antes de mexer em qualquer configuração.

Levante o cenário atual do seu servidor antes de otimizar:

RecursoOnde verPor que importa
RAM total do VPSGerenciador de Tarefas → DesempenhoDefine quanto dar ao SQL sem sufocar o Windows/MuServer
Núcleos de CPUsysteminfo ou Gerenciador de TarefasDefine o número de arquivos de tempdb e o MAXDOP
Tipo de discoPropriedades do disco / painel do VPSHDD vira gargalo; SSD é quase obrigatório
Edição do SQLSELECT @@VERSIONExpress limita RAM (ex.: ~1,4 GB) e núcleos
Atenção: A edição Express do SQL Server tem teto de memória e de tamanho de banco (historicamente 10 GB). Para servidor grande, use Standard ou Developer (gratuita para não-produção, mas confira a licença). Se seu MuOnline se aproxima do teto de tamanho, otimização nenhuma resolve — é hora de migrar de edição.

Passo 1 — Fixar memória mínima e máxima

Por padrão o SQL Server tenta consumir quase toda a RAM disponível, deixando o Windows e o MuServer sem fôlego — o que causa paginação em disco e travamentos. Fixe um teto. Regra de partida: deixe RAM suficiente para o SO e o MuServer, e dê o resto ao SQL.

-- Exemplo para um VPS de 16 GB (varia por versão/tamanho)
-- Reserva ~5 GB para Windows + MuServer, dá ~11 GB ao SQL
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;

EXEC sp_configure 'min server memory (MB)', 4096;
EXEC sp_configure 'max server memory (MB)', 11264;
RECONFIGURE;

Uma referência aproximada de ponto de partida:

RAM total do VPSMax server memory (SQL)Sobra para SO + MuServer
8 GB~5 GB~3 GB
16 GB~11 GB~5 GB
32 GB~24 GB~8 GB
Dica: Se o mesmo VPS roda SQL e MuServer e o site (Apache/IIS + MySQL), some as necessidades de todos antes de decidir o teto do SQL. Um erro clássico é dar 90% da RAM ao SQL e depois o Apache do site ficar sem memória.

Passo 2 — Escolher o modelo de recuperação

O modelo de recuperação controla como o log de transações (.ldf) se comporta. Para MU Online, Simple costuma ser a escolha certa: o log é reciclado automaticamente e não cresce sem controle, desde que você mantenha backups Full/Differential frequentes.

-- Verificar o modelo atual
SELECT name, recovery_model_desc FROM sys.databases WHERE name = 'MuOnline';

-- Mudar para Simple (log leve, sem point-in-time)
ALTER DATABASE MuOnline SET RECOVERY SIMPLE;

Use Full apenas se você precisa de recuperação ponto-a-ponto (restaurar até o minuto exato antes de um incidente) — e, nesse caso, agende backup de log frequente, ou o .ldf engole o disco.

Atenção: Um .ldf de dezenas de GB quase sempre é sintoma de modelo Full sem backup de log. Se você não faz backup de log, não fique em Full: você tem o custo do log gigante sem nenhum benefício de recuperação.

Passo 3 — Configurar o tempdb corretamente

O tempdb é onde o SQL faz o "trabalho sujo": ordenações, tabelas temporárias, versionamento. Sob carga de muitos jogadores, ele vira ponto de contenção. Duas ações resolvem a maioria dos problemas: criar vários arquivos de dados e pré-dimensioná-los.

-- Ver a configuração atual do tempdb
SELECT name, physical_name, size/128.0 AS SizeMB
FROM sys.master_files WHERE database_id = DB_ID('tempdb');

-- Ajustar tamanho e crescimento do arquivo principal (exemplo)
ALTER DATABASE tempdb MODIFY FILE (NAME = tempdev, SIZE = 512MB, FILEGROWTH = 128MB);

-- Adicionar arquivos extras: regra prática = 1 por núcleo, até 8, iguais
ALTER DATABASE tempdb ADD FILE (NAME = tempdev2, FILENAME = 'C:\SQLData\tempdb2.ndf', SIZE = 512MB, FILEGROWTH = 128MB);
ALTER DATABASE tempdb ADD FILE (NAME = tempdev3, FILENAME = 'C:\SQLData\tempdb3.ndf', SIZE = 512MB, FILEGROWTH = 128MB);
ALTER DATABASE tempdb ADD FILE (NAME = tempdev4, FILENAME = 'C:\SQLData\tempdb4.ndf', SIZE = 512MB, FILEGROWTH = 128MB);

O número de arquivos deve casar com os núcleos do VPS (até um teto de 8). Todos do mesmo tamanho e mesmo crescimento — o SQL distribui a carga entre arquivos iguais; arquivos de tamanhos diferentes desequilibram a alocação. Se possível, coloque o tempdb num disco separado ou no SSD mais rápido.

Nota: A partir do SQL Server 2016, o instalador já pergunta o número de arquivos de tempdb na instalação. Se você instalou uma versão mais nova e aceitou os padrões, provavelmente o tempdb já está multi-arquivo — confira antes de adicionar mais.

Passo 4 — Ajustar MAXDOP e Cost Threshold

O MU Online dispara milhares de consultas pequenas (login, save, leitura de inventário). Para esse perfil, deixar o SQL paralelizar demais atrapalha. Ajuste o grau máximo de paralelismo (MAXDOP) e o limite de custo para paralelismo:

-- MAXDOP: para carga OLTP (muitas consultas pequenas), limitar ajuda.
-- Regra comum: número de núcleos por nó NUMA, com teto de 8. Exemplo:
EXEC sp_configure 'max degree of parallelism', 4;
RECONFIGURE;

-- Cost threshold: o padrão 5 é baixo demais e faz consultas triviais
-- paralelizarem à toa. Subir para ~50 é recomendação clássica.
EXEC sp_configure 'cost threshold for parallelism', 50;
RECONFIGURE;

Esses valores são exemplos e variam por versão e pelo número de núcleos. O princípio: consultas curtas de MU não se beneficiam de paralelismo agressivo; deixar o cost threshold no padrão 5 só gera overhead.

Passo 5 — Separar dados e log em discos/arquivos saudáveis

O arquivo de dados (.mdf) e o de log (.ldf) têm padrões de I/O diferentes: dados é leitura/escrita aleatória, log é escrita sequencial. Sempre que possível, mantenha-os em discos distintos e evite o crescimento em pedacinhos:

-- Ver tamanho e autogrowth dos arquivos do MuOnline
SELECT name, physical_name, size/128.0 AS SizeMB,
       growth, is_percent_growth
FROM sys.master_files WHERE database_id = DB_ID('MuOnline');

-- Definir crescimento em MB fixo (não em %), evitando fragmentação
ALTER DATABASE MuOnline MODIFY FILE (NAME = 'MuOnline_Data', FILEGROWTH = 256MB);
ALTER DATABASE MuOnline MODIFY FILE (NAME = 'MuOnline_Log',  FILEGROWTH = 128MB);
Dica: Crescimento em porcentagem (o padrão antigo) é traiçoeiro: quando o banco fica grande, cada expansão é enorme e trava o servidor no meio do horário de pico. Use crescimento em MB fixo e, melhor ainda, pré-aloque o tamanho esperado para o banco quase não precisar crescer sozinho.

Passo 6 — Habilitar Instant File Initialization

Sem essa configuração, cada vez que um arquivo de dados cresce, o Windows zera fisicamente o espaço — o que congela o SQL durante a operação. Concedendo o privilégio Perform Volume Maintenance Tasks à conta de serviço do SQL, o crescimento de arquivos de dados passa a ser instantâneo:

  1. Abra secpol.msc (Diretiva de Segurança Local);
  2. Vá em Diretivas Locais → Atribuição de Direitos de Usuário;
  3. Abra Executar tarefas de manutenção de volume;
  4. Adicione a conta de serviço do SQL Server (ex.: NT SERVICE\MSSQLSERVER);
  5. Reinicie o serviço SQL Server.

Isso acelera crescimento de dados e restauração de backups. (Não afeta o log, que sempre precisa ser zerado por design.)

Passo 7 — Manter estatísticas atualizadas

O otimizador do SQL decide como executar cada consulta com base em estatísticas. Se elas ficam velhas — o que acontece rápido em banco de MU com muita escrita — o SQL toma decisões ruins e o login lento aparece. Garanta atualização automática e faça um refresh manual periódico:

-- Garantir atualização automática de estatísticas
ALTER DATABASE MuOnline SET AUTO_UPDATE_STATISTICS ON;
ALTER DATABASE MuOnline SET AUTO_CREATE_STATISTICS ON;

-- Refresh manual de todas as estatísticas (rodar em manutenção)
USE MuOnline;
EXEC sp_updatestats;

Agende o sp_updatestats para rodar diariamente na janela de menor movimento, junto da manutenção de índices.

Passo 8 — Encontrar os gargalos reais

Antes e depois de otimizar, meça. O SQL Server tem visões de sistema que apontam exatamente onde o banco sofre. Duas consultas valem ouro:

-- Consultas mais custosas (tempo de CPU total)
SELECT TOP 10
    qs.total_worker_time/qs.execution_count AS AvgCPU,
    qs.execution_count,
    SUBSTRING(st.text, 1, 120) AS Consulta
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
ORDER BY AvgCPU DESC;

-- Índices que faltam (o SQL sugere o que criaria)
SELECT TOP 10
    mid.statement AS Tabela,
    migs.avg_user_impact AS ImpactoPct,
    mid.equality_columns, mid.inequality_columns, mid.included_columns
FROM sys.dm_db_missing_index_details mid
JOIN sys.dm_db_missing_index_groups mig ON mid.index_handle = mig.index_handle
JOIN sys.dm_db_missing_index_group_stats migs ON mig.index_group_handle = migs.group_handle
ORDER BY migs.avg_user_impact DESC;

A primeira mostra quais operações consomem CPU (geralmente save de personagem ou uma query de ranking mal escrita). A segunda sugere índices que o próprio SQL sente falta. A criação e manutenção desses índices é um assunto por si só — trate com cuidado, pois índice demais atrapalha a escrita.

Passo 9 — Validar sob carga simulada

Otimizar no vazio engana. Simule pico antes do lançamento:

  1. Aplique todas as configurações acima e reinicie o serviço SQL;
  2. Rode o sp_updatestats e a manutenção de índices;
  3. Convide um grupo de teste (ou use bots controlados) para logar em massa;
  4. Enquanto isso, rode as duas consultas de gargalo do passo anterior;
  5. Observe o uso de CPU e memória no Gerenciador de Tarefas;
  6. Ajuste MAXDOP e memória se ver contenção; repita.

Erros comuns e soluções

SintomaCausa provávelSolução
Login trava quando encheFalta de índice / statistics velhas / pouca RAM ao SQLCriar índices sugeridos, sp_updatestats, subir max memory
Servidor todo lento, disco a 100%SQL consumindo RAM demais, Windows paginandoFixar max server memory deixando sobra para o SO
.ldf gigante enchendo o discoModelo Full sem backup de logMudar para Simple ou agendar backup de log
Travadas periódicas ao crescer bancoAutogrowth em % / sem Instant File InitCrescimento em MB fixo + Perform Volume Maintenance Tasks
tempdb como gargalo em eventoUm único arquivo de tempdbCriar vários arquivos iguais (1 por núcleo, até 8)
Save de personagem atrasaI/O em HDD, disco lentoMigrar dados/log para SSD NVMe
Consultas triviais paralelizandocost threshold no padrão 5Subir para ~50 e ajustar MAXDOP

Checklist de lançamento

  • Backup completo feito antes de qualquer alteração
  • max server memory fixado deixando RAM para Windows + MuServer + site
  • Modelo de recuperação decidido (Simple na maioria dos casos) e coerente com a política de backup
  • tempdb com múltiplos arquivos iguais, pré-dimensionados, de preferência em SSD
  • MAXDOP e cost threshold ajustados ao perfil OLTP do MU
  • Autogrowth em MB fixo para dados e log, com pré-alocação
  • Instant File Initialization habilitado (Perform Volume Maintenance Tasks)
  • AUTO_UPDATE_STATISTICS ligado e sp_updatestats agendado
  • Consultas de gargalo (CPU e índices ausentes) executadas e analisadas
  • Dados e log em SSD, idealmente em discos separados
  • Teste de carga com login em massa realizado antes de abrir ao público
  • SQL Server em inicialização Automática junto do Windows

Com memória fixada, tempdb multi-arquivo, modelo de recuperação correto e estatísticas em dia, o banco MuOnline deixa de ser o gargalo do lançamento. O próximo passo lógico é fechar o ciclo de performance cuidando dos índices e da manutenção regular do banco — é lá que os ganhos de longo prazo se consolidam e o servidor continua rápido semana após semana.

Perguntas frequentes

Quanta memória RAM devo dar ao SQL Server?

Reserve memória fixa para o SQL, deixando o restante para o Windows e o MuServer. Um ponto de partida comum é dar ao SQL cerca de 60-70% da RAM total do VPS, nunca 100%. O valor exato varia por versão do SQL e por quantos jogadores você espera.

Modelo de recuperação Full ou Simple para MU?

Simple é mais leve e suficiente se você faz backups Full/Differential frequentes, pois não acumula log de transações gigante. Full permite point-in-time recovery, mas exige backup de log regular ou o .ldf estoura o disco. A maioria dos servidores de MU usa Simple.

Por que o login demora quando enche o servidor?

Quase sempre é contenção no banco: falta de índice em MEMB_INFO/Character, tempdb mal configurado, memória insuficiente causando leitura em disco, ou statistics desatualizadas. O gargalo raramente é o GameServer em si.

Preciso de SSD para o SQL Server?

Praticamente obrigatório para servidores com muitos jogadores. O SQL faz muita leitura e escrita aleatória; em HDD, salvar personagem e login viram gargalo assim que a população cresce. SSD NVMe é o ideal.

Quantos arquivos de tempdb criar?

Uma regra prática é 1 arquivo de dados de tempdb por núcleo de CPU, até um teto de 8, todos do mesmo tamanho. Isso reduz a contenção de alocação. O número ideal varia conforme os núcleos do seu VPS.

GA
Editor de guias e builds

Gabriel cobre gameplay, builds de classes, PvP e progressão. Testa cada estratégia em servidor antes de publicar.

Continue lendo

Artigos relacionados