Cómo Optimizar Servidor SA-MP: Rendimiento, Tickrate y Desync
Guía técnica para optimizar servidor SA-MP: ajustes en server.cfg, profiling de gamemode, plugins esenciales y tuning de kernel para eliminar lag y desync.
Los servidores SA-MP con 50 o más jugadores simultáneos suelen acumular tres síntomas previsibles: caída de tickrate cuando hay combate intenso, desync en persecuciones de coches y traba momentánea cuando muchos jugadores entran al mismo tiempo. En la mayoría de los casos, el cuello de botella no está en la CPU del host — está en loops mal escritos en el gamemode, plugins desactualizados y parámetros conservadores en server.cfg que nunca fueron revisados después del deploy inicial.
Esta guía es para quien administra un servidor SA-MP u open.mp en producción, tiene acceso SSH al host y sabe recompilar gamemode en Pawn. Tiempo estimado de ejecución completa: 90 a 120 minutos, incluyendo mediciones antes y después. Cada sección es independiente — puedes aplicar solo las partes relevantes a tu escenario.
La diferencia entre un servidor que aguanta 200 slots en horario pico y otro que se traba con 60 raramente es hardware. Es configuración.
Requisitos previos
Necesitas acceso SSH al servidor (Ubuntu 22.04 o Debian 12 recomendados), permisos sudo, gamemode en formato .pwn fuente (no solo .amd compilado) y ventana de mantenimiento de al menos 30 minutos para reinicio controlado. Los jugadores deben ser avisados antes — la pérdida de conexión es esperada durante los ajustes finales.
Verifica el estado actual antes de cambiar nada. Registra estos números — sin baseline, no tienes manera de probar que la optimización funcionó:
0.3.7-R5 / open.mp 1.4 maxplayers en server.cfg console / showplayercount htop con 80%+ slots Ajustar server.cfg
El server.cfg es el lugar más barato para ganar rendimiento — los cambios aquí no requieren recompilar nada y pueden reducir desync en minutos. La mayoría de los servidores corre con valores predeterminados heredados de tutoriales de 2014 que ya no tienen sentido en hardware moderno.
Abre el archivo de configuración en la raíz del servidor:
cd /home/samp/server
nano server.cfgIdentifica las líneas sleep, lagcompmode, playertimeout y stream_distance. Si alguna de estas líneas no existe, agrégala — los valores default del binario SA-MP suelen ser demasiado conservadores para servidores llenos.
Aplica los valores recomendados para servidor activo con 100+ slots:
sleep 5
lagcompmode 1
playertimeout 10000
stream_distance 300.0
stream_rate 1000
maxnpc 0
onfoot_rate 30
incar_rate 30
weapon_rate 30sleep 5 reduce la CPU consumida por el loop principal sin perjudicar la responsividad. lagcompmode 1 es el estándar moderno para servidores con tiroteos — cambia a 2 solo si tu mecánica es predominantemente persecución vehicular sin combate. playertimeout 10000 (10 segundos) evita desconexiones falsas en jugadores con jitter ocasional.
Cambiar lagcompmode rompe el comportamiento percibido de armas y vehículos. Prueba en servidor de homologación con al menos 20 jugadores antes de aplicar en producción — los jugadores acostumbrados al modo antiguo se quejarán de “tiros que no aciertan” durante algunos días incluso si el cambio es técnicamente correcto.
Guarda, sal y reinicia el servidor:
systemctl restart samp-serverSi no usas systemd, mata el proceso samp03svr y reinicia vía screen o tmux. Espera 30 segundos y verifica si arrancó correctamente:
tail -n 50 server_log.txtAuditar el gamemode en Pawn
La mayor fuente de lag en servidores SA-MP establecidos es código antiguo en el gamemode — especialmente loops for(new i = 0; i < MAX_PLAYERS; i++) que corren dentro de timers de 100ms. Cada uno de esos loops, multiplicado por la frecuencia del timer, puede consumir más CPU que todos los plugins juntos.
Busca loops sobre MAX_PLAYERS en callbacks frecuentes:
grep -rn "MAX_PLAYERS" gamemodes/*.pwn | grep -v "Iter_"Cada resultado es candidato a refactorización. La regla práctica: si el loop está dentro de un timer o de OnPlayerUpdate, necesita ser reemplazado por iteración vía foreach (plugin Iter) que itera solo sobre jugadores conectados, no sobre los 1000 slots posibles.
Reemplaza loops MAX_PLAYERS por foreach del plugin Iter:
// Antes — itera sobre 1000 slots aunque haya 50 jugadores
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i))
{
// logica
}
}
// Despues — itera solo sobre conectados
foreach(new i : Player)
{
// logica
}En servidor con 50 jugadores activos y MAX_PLAYERS 1000, esto es reducción del 95% en el número de iteraciones por llamada. En un timer de 1 segundo, son 950 verificaciones innecesarias eliminadas en cada ejecución.
Audita timers con intervalo inferior a 1000ms:
grep -rn "SetTimer" gamemodes/*.pwnTimers de 100ms para tareas que no requieren esa frecuencia (actualizar HUD, sincronizar score, guardar posición) son causa común de CPU alta. Aumenta a 500ms o 1000ms donde sea posible. El guardado de posición de jugador en base de datos nunca debe correr por debajo de 30 segundos por jugador.
El plugin Profiler genera reporte de tiempo gastado por callback durante una sesión real. Cárgalo en ambiente de homologación por 1 hora con jugadores reales, genera el reporte y prioriza las refactorizaciones por los top 10 callbacks más costosos. Optimizar código que no aparece en el profile es desperdicio de tiempo.
Actualizar plugins esenciales
Los plugins SA-MP tienen impacto directo en el consumo de CPU y en la latencia percibida. Versiones antiguas de streamer y sscanf pueden costar hasta 10 veces más por llamada que las versiones actuales — y casi todo servidor establecido corre con binarios compilados hace 5 años o más.
| Plugin | Versión mínima recomendada | Qué mejora |
|---|---|---|
| streamer | v2.9.6 | Iteración de objetos dinámicos, áreas y pickups |
| sscanf | 2.13.8 | Parsing de comandos con múltiples parámetros |
| MySQL | R41-5 o superior | Queries asíncronas, pool de conexiones |
| Pawn.RakNet | 1.5+ | Interceptación de paquetes RPC con bajo overhead |
| YSF | open.mp DC | Funciones de servidor faltantes del binario base |
| Profiler | última disponible | Solo en homologación — no usar en producción |
Descarga las versiones actuales y reemplaza en el directorio plugins:
cd /home/samp/server/plugins
ls -laHaz backup de los binarios antiguos antes de reemplazar. Recompila el gamemode con los includes correspondientes a las nuevas versiones — saltarse este paso causa crashes en llamadas que cambiaron de firma entre versiones.
Ajusta el orden de carga en server.cfg. El orden importa porque los plugins dependen unos de otros:
plugins streamer sscanf mysql Pawn.RakNet YSFstreamer siempre primero, MySQL antes de cualquier plugin que haga query en el startup, YSF al final porque hookea funciones de otros plugins.
Tuning de red en el host
El sistema operativo del host tiene parámetros de kernel que afectan directamente la latencia de UDP — protocolo usado por SA-MP. Los valores default de Linux están optimizados para TCP de larga duración, no para el patrón de muchos paquetes pequeños y frecuentes de SA-MP.
Edita los parámetros de red en sysctl:
sudo nano /etc/sysctl.d/99-samp.confAgrega los valores:
net.core.rmem_max = 26214400
net.core.wmem_max = 26214400
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.netdev_max_backlog = 5000
net.ipv4.udp_mem = 8388608 12582912 16777216Estos valores aumentan los buffers de recepción y transmisión de UDP, evitando descarte de paquetes en ráfagas de tráfico (entrada simultánea de jugadores, eventos masivos).
Aplica sin reiniciar el servidor:
sudo sysctl -p /etc/sysctl.d/99-samp.confVerifica si los valores fueron aplicados:
sysctl net.core.rmem_maxLa salida debe mostrar el número que definiste. Si vuelve al default, hay otro archivo sysctl sobrescribiendo — verifica /etc/sysctl.conf y /etc/sysctl.d/.
En ambientes virtualizados sin privilegios completos, algunos de estos parámetros están bloqueados por el host. Forzarlos puede resultar en aislamiento de la instancia. Servidores dedicados o VPS con virtualización KVM completa aceptan todos los ajustes. Ante la duda, consulta el soporte del proveedor antes de cambiar parámetros de kernel.
Verificación
Confirma las mejoras con mediciones objetivas. Sin números antes y después, es imposible distinguir optimización real de placebo.
Conecta 30 a 50 jugadores reales o bots de prueba durante 30 minutos y registra:
htop
La CPU consumida por el proceso samp03svr debe estar por debajo del 40% en un core durante carga normal. La memoria debe estar estable — crecimiento continuo indica fuga en el gamemode, generalmente en variables dinámicas no desalocadas.
Para latencia percibida por los jugadores, usa el comando /ping en juego o observa la columna PING en /players. Pings consistentes por debajo de 80ms para jugadores hispanoamericanos indican red saludable. Variación mayor a 30ms entre muestras indica jitter — problema de ruta, no de servidor.
Resolución de problemas
El servidor crashea después de actualizar plugins
Recompila el gamemode con los includes correspondientes a las nuevas versiones de los plugins. Las firmas de funciones cambian entre releases — llamar a una función antigua con argumentos nuevos causa error de stack que tira el proceso. Verifica el crashlog en crashinfo.txt en la raíz del servidor.
La CPU sigue alta después de refactorizar
Corre el Profiler en homologación por 1 hora con jugadores reales e identifica callbacks que no fueron refactorizados. Loops residuales en OnPlayerUpdate (llamado decenas de veces por segundo por jugador) consumen CPU exponencialmente — ese callback nunca debe contener loops sobre todos los jugadores.
El desync persiste incluso con lagcompmode correcto
Verifica el packetloss de la ruta con mtr -r -c 100 IP_DEL_SERVIDOR desde tu computadora. Cualquier hop con pérdida superior al 0,5% indica problema de red del datacenter o del tránsito. Ese tipo de desync no tiene solución en software — exige cambio de proveedor o de ruta.
Próximos pasos
Con el servidor optimizado, considera estas próximas inversiones técnicas:
- Migrar a open.mp si aún estás en SA-MP 0.3.7-R5 — la recompilación cuesta horas, la ganancia de rendimiento y seguridad es permanente.
- Implementar anti-cheat server-side con Pawn.RakNet — bloquea el 90% de los hacks comunes sin dependencia del cliente.
- Monitorear vía graphite + grafana o panel de Hostini — observar tickrate y CPU a lo largo de semanas revela patrones invisibles en diagnóstico puntual.
- Evaluar protección DDoS dedicada para UDP — los ataques contra el puerto 7777 son frecuentes en servidores SA-MP populares.
Si estás hospedando un servidor SA-MP en crecimiento, vale considerar la hospedaje dedicado para juegos de Hostini — VPS con virtualización KVM completa, protección DDoS para UDP y datacenters en São Paulo y Miami con baja latencia para Brasil e Hispanoamérica. Sin oversell, sin compartir core con otros tenants.
Preguntas frecuentes
¿Cuál es el tickrate ideal para un servidor SA-MP con 100 slots?
SA-MP corre a ~25 ticks/segundo internamente y eso no es configurable directamente — lo que controlas es el sleep en server.cfg. Usa sleep 5 en servidores activos para reducir latencia sin saturar la CPU. Sleep 0 monopoliza el core y raramente compensa fuera de minijuegos competitivos.
¿Por qué mi servidor SA-MP tiene desync incluso con ping bajo?
Desync con ping bajo casi siempre es lagcompmode incorrecto o packetloss intermitente. Verifica lagcompmode 1 en server.cfg, cambia a 2 si tienes muchos tiroteos/persecuciones. Packetloss superior a 0,5% en el mtr hacia la IP del servidor indica problema de red del datacenter, no del gamemode.
¿Cuántos plugins SA-MP puedo cargar sin perder rendimiento?
No hay límite duro — el impacto viene de qué plugins, no de la cantidad. Streamer, sscanf, MySQL R41-5 y Pawn.RakNet juntos cuestan menos del 2% de CPU en servidor lleno. Plugins antiguos sin mantenimiento (mxINI, foreach legado) pueden costar 10x más por llamada.
¿Vale la pena migrar de SA-MP a open.mp?
Open.mp ejecuta los mismos gamemodes Pawn compilados para SA-MP 0.3.7-R2 con correcciones de seguridad y mejor rendimiento en loops internos. Para servidor nuevo, empieza en open.mp. Para servidor establecido, prueba en ambiente paralelo antes — algunos plugins muy antiguos requieren recompilación.
¿Cómo medir el impacto real de cada optimización en el servidor SA-MP?
Usa GetTickCount() antes y después del bloque que estás optimizando, registra en un log y compara con servidor lleno. Para profiling serio, el plugin Profiler de YSF genera reporte de tiempo por callback. Métricas de host (CPU, red) vienen del panel de Hostini o de htop/iftop en el servidor.
¿Cuánta RAM necesita un servidor SA-MP por slot?
SA-MP en sí consume 50-200 MB independiente de los slots. El costo de RAM real viene del gamemode: cada vehículo dinámico, pickup y marcador 3D en el streamer usa memoria. Para 200 slots con sistema completo de roleplay, reserva 1 GB. Para freeroam/DM, 512 MB es suficiente.