El mayor portal de MU Online de Brasil — desde 2003
Tutorial Avanzado Tutoriais

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.

GA Gabriel · Actualizado el 17 ago 2024 · ⏱ 12 min de lectura
Respuesta rápida

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 subdimensio

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.

Nota: En VPS con Windows Server 2012/2016/2019, usa 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 VPSMáximo para SQL Server
4 GB2048 MB
8 GB4096 MB
16 GB10240 MB
32 GB20480 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
Atenção: Nunca ejecutes 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
Dica: En servidores Season 6 que usan 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"
Nota: No uses prioridad "Realtime" — puede congelar el sistema operativo si el proceso entra en un bucle. "High" (Alta) es el valor correcto para GameServer y DataServer.

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%
Dica: Programa este script en el Programador de Tareas de Windows (taskschd.msc) para que se ejecute cada 5 minutos. Así tendrás un historial de picos de CPU y memoria correlacionados con los horarios de lag reportados por los jugadores.

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
Atenção: 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:

  1. Medir → queries SQL lentas, CPU/RAM del proceso
  2. Base de datos → desactivar AutoShrink, limitar memoria SQL, crear índices
  3. GameServer.ini → ajustar MaxUser, CharacterSaveInterval, buffers de red
  4. SO → plan de energía, desactivar servicios, parámetros TCP
  5. Monitorear → script de alerta + log continuo
  6. 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.

Preguntas frecuentes

¿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.

GA
Editor de guías y builds

Gabriel cubre gameplay, builds de clases, PvP y progresión. Prueba cada estrategia en un servidor antes de publicar.

Sigue leyendo

Artículos relacionados