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.
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.
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 VPS | Máximo para SQL Server |
|---|---|
| 4 GB | 2048 MB |
| 8 GB | 4096 MB |
| 16 GB | 10240 MB |
| 32 GB | 20480 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
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
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"
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%
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
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:
- Medir → queries SQL lentas, CPU/RAM do processo
- Banco → desativar AutoShrink, limitar memória SQL, criar índices
- GameServer.ini → ajustar
MaxUser,CharacterSaveInterval, buffers de rede - SO → plano de energia, desativar serviços, parâmetros TCP
- Monitorar → script de alerta + log contínuo
- 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.