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

Como Otimizar Lag e Latência no Servidor de MU Online

Guia avançado para eliminar lag e reduzir latência em servidores MU Online: SQL, rede, GameServer e SO configurados passo a passo.

EQ Equipe ViciadosMU · Atualizado em 3 jul 2026 · ⏱ 12 min de leitura

Lag e latência elevada são as principais reclamações em servidores MU Online e quase sempre têm origem em três pontos: banco de dados SQL Server mal ajustado, configurações incorretas dos processos do servidor (GameServer, ConnectServer) e recursos de rede ou VPS subdimensionados. Este guia cobre cada camada com comandos e valores concretos.

1. Diagnóstico Inicial — Identifique a Origem do Lag

Antes de alterar qualquer arquivo, meça onde o tempo está sendo perdido.

1.1 Verificar queries lentas no SQL Server

Abra o SQL Server Management Studio (SSMS) e execute:

-- Queries em execução agora com alto consumo de CPU
SELECT
    r.session_id,
    r.status,
    r.cpu_time,
    r.total_elapsed_time,
    r.logical_reads,
    SUBSTRING(st.text, (r.statement_start_offset/2)+1,
        ((CASE r.statement_end_offset WHEN -1 THEN DATALENGTH(st.text)
          ELSE r.statement_end_offset END - r.statement_start_offset)/2)+1) AS statement_text
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) st
WHERE r.status = 'running'
ORDER BY r.cpu_time DESC;

Se cpu_time ou total_elapsed_time ultrapassarem 3000 ms em queries rotineiras do MU, o banco é o gargalo.

1.2 Verificar uso de CPU e RAM do GameServer

No Gerenciador de Tarefas (Task Manager) → aba Detalhes, ordene por CPU. O processo GameServer.exe não deve ultrapassar 70% de CPU em situação normal. RAM acima de 80% do total disponível também causa swap e lag severo.

Nota: Em VPS com Windows Server 2012/2016/2019, use perfmon.exe → adicione os contadores Processor\% Processor Time e Memory\Available MBytes para monitoramento contínuo.

2. Otimizar o SQL Server

2.1 Desativar AutoShrink e AutoClose

Esses recursos causam operações de I/O desnecessárias durante o jogo:

USE master;
GO

-- Desativar para o banco MuOnline
ALTER DATABASE MuOnline SET AUTO_SHRINK OFF;
ALTER DATABASE MuOnline SET AUTO_CLOSE OFF;
ALTER DATABASE MuOnline SET AUTO_CREATE_STATISTICS ON;
ALTER DATABASE MuOnline SET AUTO_UPDATE_STATISTICS ON;
GO

2.2 Configurar Memória Máxima do SQL Server

Por padrão o SQL Server consome toda a RAM disponível, sufocando o GameServer. Limite o uso:

-- Para servidor com 8 GB RAM total: reserve 2 GB para o SO + GameServer
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;

EXEC sp_configure 'max server memory (MB)', 4096;  -- 4 GB para SQL
RECONFIGURE WITH OVERRIDE;
GO
RAM Total da VPSMáximo para SQL Server
4 GB2048 MB
8 GB4096 MB
16 GB10240 MB
32 GB20480 MB

2.3 Criar Índices nas Tabelas Mais Consultadas

O MU Online consulta constantemente as tabelas de personagens e inventário. Índices faltantes são causa direta de lag durante logins e trocas de mapa:

USE MuOnline;
GO

-- Índice na tabela de personagens (consulta por nome e conta)
IF NOT EXISTS (
    SELECT * FROM sys.indexes
    WHERE name = 'IX_Character_Name' AND object_id = OBJECT_ID('Character')
)
CREATE NONCLUSTERED INDEX IX_Character_Name
    ON dbo.Character (Name ASC)
    INCLUDE (AccountID, MapNumber, MapPosX, MapPosY, Level, Class);

-- Índice na tabela de inventário
IF NOT EXISTS (
    SELECT * FROM sys.indexes
    WHERE name = 'IX_Inventory_AccountName' AND object_id = OBJECT_ID('Inventory')
)
CREATE NONCLUSTERED INDEX IX_Inventory_AccountName
    ON dbo.Inventory (AccountID ASC)
    INCLUDE (ItemStorage);

-- Índice na tabela de contas para autenticação rápida
IF NOT EXISTS (
    SELECT * FROM sys.indexes
    WHERE name = 'IX_MEMB_INFO_ID' AND object_id = OBJECT_ID('MEMB_INFO')
)
CREATE NONCLUSTERED INDEX IX_MEMB_INFO_ID
    ON dbo.MEMB_INFO (memb__id ASC)
    INCLUDE (memb__pwd, memb_name, bloc_code, ctl1_code);
GO

2.4 Limpeza de Logs de Transação

Logs de transação inflados consomem I/O e causam lentidão:

USE MuOnline;
GO

-- Verificar tamanho atual dos arquivos
SELECT name, size/128.0 AS size_mb, 
       FILEPROPERTY(name, 'SpaceUsed')/128.0 AS used_mb
FROM sys.database_files;

-- Shrink apenas do log (nunca do datafile em produção ativa)
DBCC SHRINKFILE (MuOnline_log, 512);  -- Reduz para 512 MB
GO
Atenção: Nunca execute DBCC SHRINKDATABASE ou SHRINKFILE no arquivo de dados (.mdf) com o servidor em produção. Isso fragmenta índices e piora o desempenho. Faça apenas no arquivo de log (.ldf) e durante janela de manutenção.

3. Ajustar Configurações do GameServer

3.1 Arquivo GameServer/GameServer.ini

Localize o arquivo em GameServer/GameServer.ini (ou GameServer/Setup/GameServer.ini dependendo da versão) e ajuste:

[GameServerInfo]
; Limite de usuários simultâneos — ajuste à RAM disponível
MaxUser=300

; Intervalo de salvamento de personagens (em milissegundos)
; Valor padrão 5000 é muito frequente — aumente para reduzir queries
CharacterSaveInterval=15000

; Timeout de conexão inativa (em segundos)
ClientTimeout=60

; Máximo de monstros ativos por mapa
MaxMonsterCount=2000

[NetworkInfo]
; Tamanho do buffer de envio por cliente (bytes)
SendBufferSize=65536

; Tamanho do buffer de recepção por cliente (bytes)
RecvBufferSize=32768

; Número de threads de rede
NetworkThreadCount=4
Dica: Em servidores Season 6 com arquivo IGC_GameServerInfo.cfg, o parâmetro equivalente ao MaxUser se chama MaxUserCount. Verifique qual arquivo sua versão utiliza antes de editar.

3.2 Arquivo ConnectServer/ConnectServer.ini

O ConnectServer controla a fila de conexão. Valores incorretos causam desconexões em massa durante picos:

[ConnectServerInfo]
; Máximo de clientes aguardando na fila de conexão
MaxWaitUser=500

; Intervalo de atualização da lista de servidores (ms)
UpdateInterval=1000

; Timeout de resposta do GameServer (ms)
GameServerTimeout=5000

[NetworkSetting]
Port=44405
MaxConnection=1000

3.3 Prioridade de Processo no Windows

Eleve a prioridade do GameServer para garantir tempo de CPU preferencial:

REM Execute como Administrador — adicione ao script de inicialização
REM Inicie o GameServer com prioridade alta
start /HIGH "" "C:\MuServer\GameServer\GameServer.exe"

REM Ou, se o servidor já está rodando, use WMIC:
wmic process where name="GameServer.exe" CALL setpriority "high priority"
Nota: Não use prioridade "Realtime" — ela pode travar o sistema operacional se o processo entrar em loop. "High" (Alta) é o valor correto para GameServer e DataServer.

4. Otimizar o Sistema Operacional (Windows Server)

4.1 Desativar Serviços Desnecessários

Execute no PowerShell como Administrador:

# Desativar serviços que consomem recursos sem benefício para o servidor de jogo
$servicesToDisable = @(
    "wuauserv",      # Windows Update (agendar para madrugada)
    "SysMain",       # SuperFetch — causa I/O desnecessário em SSDs
    "WSearch",       # Windows Search
    "Print Spooler"  # Spooler de impressão
)

foreach ($svc in $servicesToDisable) {
    Set-Service -Name $svc -StartupType Disabled
    Stop-Service -Name $svc -Force -ErrorAction SilentlyContinue
    Write-Host "Desativado: $svc"
}

4.2 Configurar Plano de Energia para Desempenho Máximo

# Ativar plano de energia de alto desempenho
powercfg /setactive 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c

# Confirmar plano ativo
powercfg /getactivescheme

4.3 Ajustar Parâmetros de Rede TCP/IP

# Aumentar backlog de conexões TCP
netsh int tcp set global autotuninglevel=normal
netsh int tcp set global chimney=disabled
netsh int tcp set global rss=enabled
netsh int tcp set global timestamps=disabled

# Reduzir TIME_WAIT para liberar portas mais rápido
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" `
    -Name "TcpTimedWaitDelay" -Value 30 -Type DWord

# Aumentar portas efêmeras disponíveis
netsh int ipv4 set dynamicport tcp start=10000 num=55000

5. Monitoramento com Script de Alerta Automático

Crie o arquivo C:\MuServer\Scripts\monitor_lag.bat para verificação periódica:

@echo off
REM Monitor de lag — execute via Agendador de Tarefas a cada 5 minutos

set LOG=C:\MuServer\Logs\monitor_%date:~6,4%%date:~3,2%%date:~0,2%.log
set THRESHOLD=80

REM Verificar uso de CPU
for /f "tokens=2 delims==" %%i in ('wmic cpu get loadpercentage /value') do set CPU=%%i
if %CPU% GTR %THRESHOLD% (
    echo [%time%] ALERTA: CPU em %CPU%%  >> %LOG%
    REM Aqui adicione notificação via Discord webhook se desejar
)

REM Verificar memória disponível (em MB)
for /f "tokens=2 delims==" %%i in ('wmic OS get FreePhysicalMemory /value') do set MEM=%%i
set /a MEM_MB=%MEM%/1024
if %MEM_MB% LSS 512 (
    echo [%time%] ALERTA: Memória disponível apenas %MEM_MB% MB  >> %LOG%
)

echo [%time%] CPU: %CPU%%  MEM livre: %MEM_MB% MB >> %LOG%
Dica: Agende este script no Agendador de Tarefas do Windows (taskschd.msc) para rodar a cada 5 minutos. Assim você tem histórico de picos de CPU e memória correlacionados com horários de lag reportado pelos jogadores.

6. Manutenção Semanal do Banco de Dados

Execute todo domingo de madrugada (agende via SQL Server Agent):

USE MuOnline;
GO

-- 1. Reorganizar índices fragmentados entre 10% e 30%
ALTER INDEX ALL ON dbo.Character REORGANIZE;
ALTER INDEX ALL ON dbo.Inventory REORGANIZE;

-- 2. Reconstruir índices com fragmentação acima de 30%
ALTER INDEX ALL ON dbo.Character REBUILD WITH (ONLINE = OFF, FILLFACTOR = 80);
ALTER INDEX ALL ON dbo.Inventory REBUILD WITH (ONLINE = OFF, FILLFACTOR = 80);

-- 3. Atualizar estatísticas
UPDATE STATISTICS dbo.Character WITH FULLSCAN;
UPDATE STATISTICS dbo.Inventory WITH FULLSCAN;
UPDATE STATISTICS dbo.MEMB_INFO WITH FULLSCAN;

-- 4. Limpar logs antigos de jogo (ajuste o período conforme necessário)
DELETE FROM dbo.GameLog WHERE LogDate < DATEADD(DAY, -30, GETDATE());

PRINT 'Manutenção concluída em: ' + CONVERT(VARCHAR, GETDATE(), 120);
GO
Atenção: O REBUILD WITH (ONLINE = OFF) bloqueia a tabela durante a operação. Execute apenas com o servidor de jogo desligado ou durante horário de baixíssimo acesso. Para SQL Server 2014+ Enterprise, você pode usar ONLINE = ON para não bloquear a tabela.

Resumo do Fluxo de Otimização

Siga esta sequência ao investigar lag:

  1. Medir → queries SQL lentas, CPU/RAM do processo
  2. Banco → desativar AutoShrink, limitar memória SQL, criar índices
  3. GameServer.ini → ajustar MaxUser, CharacterSaveInterval, buffers de rede
  4. SO → plano de energia, desativar serviços, parâmetros TCP
  5. Monitorar → script de alerta + log contínuo
  6. Manutenção → reconstrução semanal de índices e limpeza de logs

Com todas essas camadas ajustadas, a latência percebida pelos jogadores cai tipicamente de 200-500 ms para 20-60 ms em servidores bem dimensionados.

Perguntas frequentes

Qual é o maior causador de lag em servidores MU Online?

Na maioria dos casos é o SQL Server mal configurado — queries lentas, falta de índices e autoshrink ativado são os vilões principais. Verifique primeiro o banco antes de culpar a rede.

Qual o MaxUser recomendado para o GameServer.ini?

Para VPS com 4 GB RAM, use MaxUser=300. Com 8 GB RAM, MaxUser=600. Nunca ultrapasse a capacidade real da máquina ou o servidor oscilará.

Como saber se o lag é do servidor ou da conexão do jogador?

No SQL Server Management Studio execute: SELECT TOP 20 * FROM sys.dm_exec_requests WHERE status = 'running' ORDER BY cpu_time DESC. Se houver queries acima de 5000 ms o problema é no banco. Se não, o gargalo provavelmente é rede ou processamento do GameServer.

O AutoShrink do SQL Server realmente causa lag?

Sim. O AutoShrink compacta o banco em background consumindo I/O e CPU. Desative com: ALTER DATABASE MuOnline SET AUTO_SHRINK OFF. Faça shrink manual apenas durante manutenção programada.

EQ

Equipe ViciadosMU

Equipe editorial do ViciadosMU — portal de MU Online no ar desde 2003.

Continue lendo

Artigos relacionados