Optimizar servidor FiveM: cómo mejorar el rendimiento y el tickrate
¿Servidor FiveM con lag o tickrate bajo? Guía técnica para revisar el resmon, ajustar OneSync, limpiar resources pesados y estabilizar el tick en 60 Hz.
Servidor FiveM con el tick cayendo de 60 Hz a 30 Hz cuando se llena, jugadores quejándose de teletransporte, vehículos atascándose en el aire, sincronización de combate desapareciendo. Ejecutas resmon, ves 3-4 resources consumiendo 5ms cada uno, pero no sabes cuál tumbar primero ni por dónde empezar la optimización.
Este escenario tiene una causa técnica clara: el main thread del FXServer corre en un único core, y cualquier resource que pese más de 2-3ms por tick se come casi un frame entero a 60 Hz. Cuando 4 resources suman 15ms+, el servidor literalmente no logra completar 60 ticks por segundo. Ahí entran la desincronización, el lag de input y el crash silencioso de eventos.
Esta guía cubre las 6 áreas donde muere el rendimiento en FiveM, en orden de impacto: medir antes de optimizar, OneSync, resources pesados, streaming de assets, configuraciones de red y hardware. Tiempo estimado: 45 a 90 minutos para aplicar todas las optimizaciones y validar.
Prerrequisitos
Acceso administrativo al servidor FXServer (SSH en Linux o RDP en Windows), permiso para editar server.cfg y reiniciar el servidor, acceso al panel txAdmin para monitorear métricas, e idealmente una ventana de mantenimiento corta (10-15 min) para reiniciar entre cambios. Servidor corriendo FXServer build 6683 o superior.
60 Hz < 3ms cada uno < 12ms total infinity Mide antes de optimizar
Optimizar sin medir es adivinar. Antes de tocar cualquier configuración, necesitas un baseline; sin él no puedes probar que el cambio ayudó.
Entra al servidor como jugador y abre la consola con F8. Escribe el comando del monitor de resources:
resmon 1Esto abre la ventana del Resource Monitor en modo verbose. Las columnas que importan:
- CPU ms — tiempo gastado en el main thread por tick. La suma de todas las filas es el presupuesto total
- Memory — RAM consumida por el resource (problema menos frecuente)
- Streaming — assets descargados por el resource (relevante para mapas)
Anota los 5 resources con mayor CPU ms. Toma una captura para comparar después.
En la consola del servidor (SSH o ventana del FXServer), ejecuta el comando que muestra el tick actual:
statusVerás líneas como Server thread hitch warning: frame time of 28ms. Un frame time por encima de 16.6ms significa que el servidor está perdiendo ticks. Anota el valor promedio durante 5 minutos de juego normal.
Abre txAdmin (puerto por defecto 40120) y ve a “Performance Chart”. Ese gráfico muestra el histórico de tick rate de los últimos 60 minutos. Si ves caídas regulares en horario pico, el problema es de carga, no un bug puntual.
Haz las mediciones con el servidor lleno, no vacío. Resources que cuestan 1ms con 5 jugadores pueden costar 4ms con 50, porque iteran sobre todos los players online. Optimizar para el escenario vacío no resuelve el problema real.
Configura OneSync correctamente
OneSync es el sistema de sincronización de entidades de FiveM. La elección entre legacy e infinity cambia drásticamente el rendimiento y la capacidad del servidor.
Abre tu server.cfg y localiza las líneas de OneSync. La configuración recomendada para servidores modernos:
set onesync on
set onesync_population true
set onesync_distanceCullVehicles true
sv_enforceGameBuild 2944
sv_maxclients 64La flag onesync_distanceCullVehicles quita vehículos detenidos lejos de los jugadores, reduciendo drásticamente la carga de sincronización. enforceGameBuild fija la versión del juego para evitar bugs introducidos por updates de Rockstar.
Si estás corriendo OneSync legacy y quieres migrar a infinity, cambia la línea y prueba tus recursos:
set onesync infinityReinicia el servidor y prueba cada script crítico (combate, inventario, garaje). Recursos que dependían de IDs de network locales pueden romperse: la API de infinity usa state bags y routing buckets en su lugar.
Si tienes misiones, dungeons o interiores que deben quedar aislados de jugadores fuera de la escena, usa routing buckets vía SetPlayerRoutingBucket(playerId, bucketId). Sin esto, el servidor sincroniza entidades de escenas aisladas para todos los jugadores cercanos, desperdiciando ticks.
Identifica y optimiza resources pesados
Este es el paso donde ocurren el 70% de las ganancias de rendimiento. Resources mal escritos con loops sin Wait, queries síncronas y eventos disparados a alta frecuencia tumban cualquier servidor.
Vuelve al resmon y abre los 3 resources con mayor CPU ms. Busca en el código patrones problemáticos. El más común es un loop sin Wait apropiado:
-- MAL: corre cada frame, quema CPU
CreateThread(function()
while true do
local player = PlayerPedId()
-- lógica aquí
Wait(0)
end
end)Wait(0) significa “correr cada frame”. Si la verificación no necesita ser tan frecuente, súbelo a Wait(500) o Wait(1000). Diferencia práctica: un loop con Wait(0) corre 60 veces por segundo; con Wait(1000) corre 1 vez. Para checks de proximidad, status de UI o polling de inventario, 500-1000ms es suficiente.
Busca queries SQL síncronas en hot paths (eventos llamados frecuentemente). Reemplázalas por asíncronas:
-- MAL: bloquea el thread
local result = MySQL.Sync.fetchAll("SELECT * FROM users WHERE id = ?", {id})
-- BIEN: callback asíncrono
MySQL.Async.fetchAll("SELECT * FROM users WHERE id = ?", {id}, function(result)
-- procesa aquí
end)Las queries síncronas bloquean el main thread entero mientras la base de datos responde: aunque tarden solo 5ms, son 5ms perdidos en cada llamada.
Los eventos client→server disparados a alta frecuencia son uno de los mayores ofensores. Busca TriggerServerEvent dentro de loops de jugador y añade throttling:
-- Antes
CreateThread(function()
while true do
TriggerServerEvent("updatePlayerPosition", GetEntityCoords(PlayerPedId()))
Wait(100) -- 10 eventos por segundo, por jugador
end
end)
-- Después
CreateThread(function()
while true do
TriggerServerEvent("updatePlayerPosition", GetEntityCoords(PlayerPedId()))
Wait(2000) -- 1 evento cada 2s, suficiente para la mayoría de los casos
end
end)Con 50 jugadores, esa es la diferencia entre 500 eventos/segundo y 25 eventos/segundo en el servidor.
Antes de apagar un resource pesado, verifica las dependencias con ensure en el server.cfg. Resources core (como mysql-async, es_extended) rompen el servidor entero si se eliminan. Prueba primero en un ambiente de staging o en horario de muy poco movimiento.
Optimiza el streaming de assets
Mapas personalizados, MLOs y ymaps añaden cientos de archivos pequeños por cada región. Un streaming mal configurado causa stutter cuando el jugador entra en una zona nueva.
Organiza tu carpeta stream/ en subdirectorios por categoría: el FXServer indexa más rápido:
resources/[maps]/mi-mapa/
├── fxmanifest.lua
├── stream/
│ ├── ymap/
│ ├── ytd/
│ └── ydr/Carpetas planas con 5000+ archivos en el mismo directorio hacen que el servidor tarde 10-30 segundos más en iniciar.
Activa el cache de assets en el server.cfg:
sv_assetCacheEnabled trueEsto permite que los clientes mantengan assets en cache entre sesiones, reduciendo descargas repetidas: menos presión de I/O y red cuando los jugadores se reconectan.
Identifica mapas duplicados o conflictivos. Usa el comando en la consola del servidor para listar resources con assets:
listBusca dos resources streameando el mismo ymap (por ejemplo, dos MLOs del mismo edificio). Un conflicto de streaming causa flickering y a veces crash. Desactiva el duplicado.
Verificación
Tras aplicar las optimizaciones, reinicia el servidor completamente y repite las mismas mediciones:
Compara el resmon antes/después con el servidor lleno. Cada resource que optimizaste debería haber caído al menos un 30%. La suma total de los resources idealmente por debajo de 12ms.
En txAdmin, observa el Performance Chart durante 30 minutos en horario pico. El tick rate debería mantenerse a 60 Hz con un máximo de 1-2 dips cortos. Frame time promedio por debajo de 16.6ms.
Pide feedback a 3-5 jugadores activos. Pregunta específicamente por el lag de input en combate y la sincronización de vehículos. La métrica numérica no captura la percepción: el jugador siente un stutter de 8ms que el resmon no resalta.
Próximos pasos
El rendimiento en FiveM es un proceso continuo: cada resource nuevo añadido puede reintroducir un cuello de botella. Algunas direcciones para profundizar:
- Configura logs estructurados para identificar qué eventos se disparan más y cuándo
- Aprende a usar el profiler de FXServer (
profiler recordyprofiler view) para un análisis más profundo - Si vas a poner esto en producción con 64+ slots y mapas personalizados pesados, una VPS Hostini con CPU de clock alto y NVMe marca una diferencia mensurable en el tick rate: el hardware adecuado es tan importante como el código optimizado
- Implementa un ambiente de staging para probar resources nuevos antes de subirlos a producción
- Documenta el baseline actual (tick promedio, suma de resources) para comparar cuando toques algo en el futuro
Preguntas frecuentes
¿Cuál es el tickrate ideal para un servidor FiveM de 64 slots?
El objetivo es 60 Hz constantes en el main thread. Por debajo de 50 Hz ya se percibe como lag de input: golpear a alguien con un bate tarda más de lo que debería. Servidores con más de 32 jugadores simultáneos necesitan OneSync infinity activado y CPU con clock alto (5 GHz+) para mantener 60 Hz.
¿OneSync legacy o infinity? ¿Cuál elegir?
Usa infinity siempre que sea posible: soporta hasta 1024 slots y tiene mejor sincronización de entidades. Legacy está limitado a 32 jugadores y se encuentra en fin de vida. La única razón para quedarse en legacy es la compatibilidad con recursos antiguos que no se actualizaron a la API de infinity.
Mi resmon muestra un resource a 8ms. ¿Es malo?
Sí. Los resources individuales no deberían superar los 2-3ms en el main thread. Por encima de 5ms el resource solo consume casi un tick entero (16.6ms a 60 Hz) y obliga al servidor a perder ticks. Investiga loops sin Wait, eventos disparados con demasiada frecuencia o queries SQL síncronas dentro del resource.
¿Vale la pena activar txAdmin para monitorear el rendimiento?
Sí. txAdmin agrega métricas de tick rate, uso de CPU por resource, jugadores activos y crashes en un único dashboard. A diferencia del resmon (que muestra un snapshot dentro del juego), txAdmin tiene histórico: puedes identificar si la caída de tick ocurrió en horario pico o tras cargar un recurso específico.
¿Necesito SSD NVMe o SATA es suficiente?
NVMe es claramente mejor para FiveM. El streaming de assets (mapas personalizados, MLOs, ymaps) lee cientos de archivos pequeños cuando un jugador entra en una región nueva. En SATA ese pico de I/O genera stutter local; en NVMe es imperceptible. Servidores con mapas personalizados grandes (50 GB+ de assets) solo se mantienen estables en NVMe.
¿Limitar los slots ayuda cuando el servidor no aguanta?
Ayuda como paliativo, no como solución. Si el tick cae con 48 jugadores y se estabiliza con 32, ganaste tiempo, pero la causa raíz (resource pesado, OneSync mal configurado, CPU saturada) sigue ahí. Reducir slots es válido mientras investigas y optimizas, no como configuración permanente.