Cómo Optimizar Lag y Latencia en el Servidor de MU Online
Guía avanzada para eliminar el lag y reducir la latencia en servidores MU Online: SQL, red, GameServer y SO configurados paso a paso.
El lag y la alta latencia son las principales quejas en servidores privados de MU Online y casi siempre tienen su origen en tres puntos: una base de datos SQL Server mal ajustada, configuraciones incorrectas en los procesos del servidor (GameServer, ConnectServer) y recursos de red o VPS subdimensionados. Esta guía cubre cada capa con comandos y valores concretos.
1. Diagnóstico Inicial — Identifica el Origen del Lag
Antes de modificar cualquier archivo, mide dónde se está perdiendo el tiempo.
1.1 Verificar queries lentas en SQL Server
Abre SQL Server Management Studio (SSMS) y ejecuta:
-- Queries en ejecución ahora con 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;
Si cpu_time o total_elapsed_time superan 3000 ms en queries rutinarias de MU, la base de datos es el cuello de botella.
1.2 Verificar uso de CPU y RAM del GameServer
En el Administrador de Tareas → pestaña Detalles, ordena por CPU. El proceso GameServer.exe no debe superar el 70% de CPU en condiciones normales. RAM por encima del 80% del total disponible también provoca swap y lag severo.
perfmon.exe → agrega los contadores Processor\% Processor Time y Memory\Available MBytes para monitoreo continuo.2. Optimizar SQL Server
2.1 Desactivar AutoShrink y AutoClose
Estas funciones provocan operaciones de I/O innecesarias durante el juego:
USE master;
GO
-- Desactivar para la base de datos 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 la Memoria Máxima de SQL Server
Por defecto SQL Server consume toda la RAM disponible, ahogando al GameServer. Limita su uso:
-- Para servidor con 8 GB de RAM total: reserva 2 GB para 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 del VPS | Máximo para SQL Server |
|---|---|
| 4 GB | 2048 MB |
| 8 GB | 4096 MB |
| 16 GB | 10240 MB |
| 32 GB | 20480 MB |
2.3 Crear Índices en las Tablas Más Consultadas
MU Online consulta constantemente las tablas de personajes e inventario. Los índices faltantes son causa directa de lag durante inicios de sesión y cambios de mapa:
USE MuOnline;
GO
-- Índice en la tabla de personajes (consulta por nombre y cuenta)
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 en la tabla de inventario
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 en la tabla de cuentas para autenticación 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 Limpieza del Log de Transacciones
Los logs de transacciones inflados consumen I/O y causan lentitud:
USE MuOnline;
GO
-- Verificar tamaño actual de los archivos
SELECT name, size/128.0 AS size_mb,
FILEPROPERTY(name, 'SpaceUsed')/128.0 AS used_mb
FROM sys.database_files;
-- Shrink solo del archivo de log (nunca del datafile en producción activa)
DBCC SHRINKFILE (MuOnline_log, 512); -- Reduce a 512 MB
GO
DBCC SHRINKDATABASE ni SHRINKFILE en el archivo de datos (.mdf) con el servidor en producción. Esto fragmenta los índices y empeora el rendimiento. Ejecuta shrink solo en el archivo de log (.ldf) y durante una ventana de mantenimiento.3. Ajustar la Configuración del GameServer
3.1 Archivo GameServer/GameServer.ini
Localiza el archivo en GameServer/GameServer.ini (o GameServer/Setup/GameServer.ini según la versión) y ajusta:
[GameServerInfo]
; Límite de usuarios simultáneos — ajusta según la RAM disponible
MaxUser=300
; Intervalo de guardado de personajes (en milisegundos)
; El valor por defecto 5000 es demasiado frecuente — aumenta para reducir queries
CharacterSaveInterval=15000
; Timeout de conexión inactiva (en segundos)
ClientTimeout=60
; Máximo de monstruos activos por mapa
MaxMonsterCount=2000
[NetworkInfo]
; Tamaño del buffer de envío por cliente (bytes)
SendBufferSize=65536
; Tamaño del buffer de recepción por cliente (bytes)
RecvBufferSize=32768
; Número de hilos de red
NetworkThreadCount=4
IGC_GameServerInfo.cfg, el parámetro equivalente a MaxUser se llama MaxUserCount. Verifica qué archivo usa tu versión antes de editar.3.2 Archivo ConnectServer/ConnectServer.ini
El ConnectServer controla la cola de conexión. Valores incorrectos provocan desconexiones masivas durante picos de tráfico:
[ConnectServerInfo]
; Máximo de clientes esperando en la cola de conexión
MaxWaitUser=500
; Intervalo de actualización de la lista de servidores (ms)
UpdateInterval=1000
; Timeout de respuesta del GameServer (ms)
GameServerTimeout=5000
[NetworkSetting]
Port=44405
MaxConnection=1000
3.3 Prioridad de Proceso en Windows
Eleva la prioridad del GameServer para garantizar tiempo de CPU preferencial:
REM Ejecutar como Administrador — agrega al script de inicio
REM Inicia el GameServer con prioridad alta
start /HIGH "" "C:\MuServer\GameServer\GameServer.exe"
REM O, si el servidor ya está corriendo, usa WMIC:
wmic process where name="GameServer.exe" CALL setpriority "high priority"
4. Optimizar el Sistema Operativo (Windows Server)
4.1 Desactivar Servicios Innecesarios
Ejecuta en PowerShell como Administrador:
# Desactivar servicios que consumen recursos sin beneficio para el servidor de juego
$servicesToDisable = @(
"wuauserv", # Windows Update (programar para horario nocturno)
"SysMain", # SuperFetch — causa I/O innecesario en SSDs
"WSearch", # Windows Search
"Print Spooler" # Cola de impresión
)
foreach ($svc in $servicesToDisable) {
Set-Service -Name $svc -StartupType Disabled
Stop-Service -Name $svc -Force -ErrorAction SilentlyContinue
Write-Host "Desactivado: $svc"
}
4.2 Configurar Plan de Energía de Alto Rendimiento
# Activar plan de energía de alto rendimiento
powercfg /setactive 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c
# Confirmar plan activo
powercfg /getactivescheme
4.3 Ajustar Parámetros de Red TCP/IP
# Aumentar el backlog de conexiones 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
# Reducir TIME_WAIT para liberar puertos más rápido
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" `
-Name "TcpTimedWaitDelay" -Value 30 -Type DWord
# Aumentar el rango de puertos efímeros disponibles
netsh int ipv4 set dynamicport tcp start=10000 num=55000
5. Monitoreo con Script de Alerta Automático
Crea el archivo C:\MuServer\Scripts\monitor_lag.bat para verificación periódica:
@echo off
REM Monitor de lag — ejecutar via Programador de Tareas 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 al %CPU%%% >> %LOG%
REM Aqui agrega notificacion via Discord webhook si lo deseas
)
REM Verificar memoria disponible (en 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: Memoria disponible solo %MEM_MB% MB >> %LOG%
)
echo [%time%] CPU: %CPU%%% RAM libre: %MEM_MB% MB >> %LOG%
6. Mantenimiento Semanal de la Base de Datos
Ejecuta todos los domingos de madrugada (programa via SQL Server Agent):
USE MuOnline;
GO
-- 1. Reorganizar índices con fragmentación entre 10% y 30%
ALTER INDEX ALL ON dbo.Character REORGANIZE;
ALTER INDEX ALL ON dbo.Inventory REORGANIZE;
-- 2. Reconstruir índices con fragmentación superior al 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. Actualizar estadísticas
UPDATE STATISTICS dbo.Character WITH FULLSCAN;
UPDATE STATISTICS dbo.Inventory WITH FULLSCAN;
UPDATE STATISTICS dbo.MEMB_INFO WITH FULLSCAN;
-- 4. Limpiar logs antiguos del juego (ajusta el período según necesidad)
DELETE FROM dbo.GameLog WHERE LogDate < DATEADD(DAY, -30, GETDATE());
PRINT 'Mantenimiento completado en: ' + CONVERT(VARCHAR, GETDATE(), 120);
GO
REBUILD WITH (ONLINE = OFF) bloquea la tabla durante la operación. Ejecútalo solo con el servidor de juego apagado o durante horario de muy bajo acceso. Para SQL Server 2014+ Enterprise Edition puedes usar ONLINE = ON para no bloquear la tabla.Resumen del Flujo de Optimización
Sigue esta secuencia al investigar lag:
- Medir → queries SQL lentas, CPU/RAM del proceso
- Base de datos → desactivar AutoShrink, limitar memoria SQL, crear índices
- GameServer.ini → ajustar
MaxUser,CharacterSaveInterval, buffers de red - SO → plan de energía, desactivar servicios, parámetros TCP
- Monitorear → script de alerta + log continuo
- Mantenimiento → reconstrucción semanal de índices y limpieza de logs
Con todas estas capas ajustadas, la latencia percibida por los jugadores cae típicamente de 200-500 ms a 20-60 ms en servidores correctamente dimensionados.
Perguntas frequentes
¿Cuál es la mayor causa de lag en servidores MU Online?
En la mayoría de los casos es un SQL Server mal configurado — queries lentas, índices faltantes y AutoShrink activado son los principales culpables. Revisa primero la base de datos antes de culpar a la red.
¿Cuál es el valor recomendado de MaxUser para GameServer.ini?
Para un VPS con 4 GB de RAM usa MaxUser=300. Con 8 GB de RAM usa MaxUser=600. Nunca superes la capacidad real de la máquina o el servidor se volverá inestable.
¿Cómo sé si el lag viene del servidor o de la conexión del jugador?
En SQL Server Management Studio ejecuta: SELECT TOP 20 * FROM sys.dm_exec_requests WHERE status = 'running' ORDER BY cpu_time DESC. Si alguna query supera 5000 ms el problema está en la base de datos. Si no, el cuello de botella probablemente es la red o el procesamiento del GameServer.
¿El AutoShrink de SQL Server realmente causa lag?
Sí. AutoShrink compacta la base de datos en segundo plano consumiendo I/O y CPU. Desactívalo con: ALTER DATABASE MuOnline SET AUTO_SHRINK OFF. Ejecuta shrink manual solo durante una ventana de mantenimiento programada.