Otimizar servidor FiveM: como melhorar performance e tickrate

Servidor FiveM lagando ou com tickrate baixo? Guia técnico pra subir o resmon, ajustar OneSync, limpar resources pesados e estabilizar o tick em 60 Hz.

Servidor FiveM com tick caindo de 60 Hz pra 30 Hz quando lota, jogadores reclamando de teleporte, veículos travando no ar, sincronização de combate sumindo. Você roda o resmon, vê 3-4 resources puxando 5ms cada, mas não sabe qual derrubar primeiro nem por onde começar a otimização.

Esse cenário tem causa técnica clara: o main thread do FXServer roda em uma única core, e qualquer resource que pesa mais que 2-3ms por tick come quase um frame inteiro a 60 Hz. Quando 4 resources somam 15ms+, o servidor literalmente não consegue completar 60 ticks por segundo. Aí entra desincronização, lag de input e crash silencioso de eventos.

Esse guia cobre as 6 áreas onde performance morre no FiveM, na ordem de impacto: medir antes de otimizar, OneSync, resources pesados, streaming de assets, configurações de rede e hardware. Tempo estimado: 45 a 90 minutos pra aplicar todas as otimizações e validar.

Pré-requisitos

O que você precisa antes de começar

Acesso administrativo ao servidor FXServer (SSH no Linux ou RDP no Windows), permissão pra editar server.cfg e reiniciar o servidor, acesso ao painel txAdmin pra monitorar métricas, e idealmente uma janela de manutenção curta (10-15 min) pra reiniciar entre mudanças. Servidor rodando FXServer build 6683 ou superior.

Tick alvo 60 Hz
Resource budget < 3ms cada
Soma resources < 12ms total
OneSync recomendado infinity

Meça antes de otimizar

Otimização sem medição é palpite. Antes de mexer em qualquer config, você precisa de um baseline — sem ele você não tem como provar que a mudança ajudou.

01

Entre no servidor como jogador e abra o console com F8. Digite o comando do monitor de resources:

resmon 1

Isso abre a janela do Resource Monitor com modo verbose. As colunas que importam:

  • CPU ms — tempo gasto no main thread por tick. Soma de todas as linhas é o orçamento total
  • Memory — RAM consumida pelo resource (problema mais raro)
  • Streaming — assets baixados pelo resource (relevante pra mapas)

Anote os 5 resources com maior CPU ms. Tire screenshot pra comparação depois.

02

No console do servidor (SSH ou janela do FXServer), rode o comando que mostra o tick atual:

status

Você vai ver linhas como Server thread hitch warning: frame time of 28ms. Frame time acima de 16.6ms significa que o servidor está perdendo ticks. Anote o valor médio durante 5 minutos de jogo normal.

03

Abra o txAdmin (porta padrão 40120) e vá em “Performance Chart”. Esse gráfico mostra histórico de tick rate dos últimos 60 minutos. Se você vê quedas regulares em horário de pico, o problema é carga — não bug pontual.

Baseline em horário cheio

Faça as medições com servidor lotado, não vazio. Resources que custam 1ms com 5 jogadores podem custar 4ms com 50 — porque iteram sobre todos os players online. Otimizar pra cenário vazio não resolve o problema real.

Configure OneSync corretamente

OneSync é o sistema de sincronização de entidades do FiveM. A escolha entre legacy e infinity muda dramaticamente performance e capacidade do servidor.

01

Abra seu server.cfg e localize as linhas de OneSync. A configuração recomendada pra servidores modernos:

set onesync on
set onesync_population true
set onesync_distanceCullVehicles true
sv_enforceGameBuild 2944
sv_maxclients 64

A flag onesync_distanceCullVehicles remove veículos parados longe dos jogadores — reduz drasticamente carga de sincronização. enforceGameBuild trava a versão do jogo pra evitar bugs introduzidos por updates da Rockstar.

02

Se você está rodando OneSync legacy e quer migrar pra infinity, troque a linha e teste seus recursos:

set onesync infinity

Reinicie o servidor e teste cada script crítico (combate, inventário, garagem). Recursos que dependiam de IDs de network locais podem quebrar — a API do infinity usa state bags e routing buckets em vez disso.

Routing buckets pra cenas isoladas

Se você tem missões, dungeons ou interiores que devem ser isolados de jogadores fora da cena, use routing buckets via SetPlayerRoutingBucket(playerId, bucketId). Sem isso, o servidor sincroniza entidades de cenas isoladas pra todos os jogadores próximos — desperdício de tick.

Identifique e otimize resources pesados

Esse é o passo onde 70% dos ganhos de performance acontecem. Resources mal escritos com loops sem Wait, queries síncronas e eventos disparados em alta frequência derrubam qualquer servidor.

01

Volte ao resmon e abra os 3 resources com maior CPU ms. Procure no código por padrões problemáticos. O mais comum é loop sem Wait apropriado:

-- RUIM: roda toda frame, queima CPU
CreateThread(function()
  while true do
    local player = PlayerPedId()
    -- lógica aqui
    Wait(0)
  end
end)

Wait(0) significa “rodar a cada frame”. Se a verificação não precisa ser tão frequente, suba pra Wait(500) ou Wait(1000). Diferença prática: um loop com Wait(0) roda 60 vezes por segundo; com Wait(1000) roda 1 vez. Pra checks de proximidade, status de UI ou polling de inventário, 500-1000ms é suficiente.

02

Procure por queries SQL síncronas em hot paths (eventos chamados frequentemente). Substitua por async:

-- RUIM: bloqueia o thread
local result = MySQL.Sync.fetchAll("SELECT * FROM users WHERE id = ?", {id})

-- BOM: callback assíncrono
MySQL.Async.fetchAll("SELECT * FROM users WHERE id = ?", {id}, function(result)
  -- processa aqui
end)

Sync queries bloqueiam o main thread inteiro enquanto o banco responde — mesmo que demore só 5ms, é 5ms perdido a cada chamada.

03

Eventos client→server disparados em alta frequência são um dos maiores ofensores. Procure por TriggerServerEvent dentro de loops de jogador e adicione throttling:

-- Antes
CreateThread(function()
  while true do
    TriggerServerEvent("updatePlayerPosition", GetEntityCoords(PlayerPedId()))
    Wait(100)  -- 10 eventos por segundo, por jogador
  end
end)

-- Depois
CreateThread(function()
  while true do
    TriggerServerEvent("updatePlayerPosition", GetEntityCoords(PlayerPedId()))
    Wait(2000)  -- 1 evento a cada 2s — suficiente pra maioria dos casos
  end
end)

Com 50 jogadores, isso é a diferença entre 500 eventos/segundo e 25 eventos/segundo no servidor.

Cuidado ao desabilitar resources

Antes de desligar um resource pesado, verifique dependências com ensure no server.cfg. Resources core (como mysql-async, es_extended) quebram o servidor inteiro se removidos. Teste em ambiente de staging primeiro ou em horário de baixíssimo movimento.

Otimize streaming de assets

Mapas customizados, MLOs e ymaps adicionam centenas de arquivos pequenos pra cada região. Streaming mal configurado causa stutter quando jogador entra numa área nova.

01

Organize sua pasta stream/ em subdiretórios por categoria — o FXServer indexa mais rápido:

resources/[maps]/meu-mapa/
├── fxmanifest.lua
├── stream/
│   ├── ymap/
│   ├── ytd/
│   └── ydr/

Pastas planas com 5000+ arquivos no mesmo diretório fazem o servidor demorar 10-30 segundos a mais pra iniciar.

02

Habilite cache asset no server.cfg:

sv_assetCacheEnabled true

Isso permite que clientes mantenham assets em cache entre sessões, reduzindo download repetido — menos pressão de I/O e rede quando jogadores reconectam.

03

Identifique mapas duplicados ou conflitantes. Use o comando no console do servidor pra listar resources com assets:

list

Procure por dois resources streamando o mesmo ymap (ex: dois MLOs do mesmo prédio). Conflito de streaming causa flickering e às vezes crash. Desabilite o duplicado.

Verificação

Após aplicar as otimizações, reinicie o servidor completamente e refaça as mesmas medições:

01

Compare o resmon antes/depois com servidor cheio. Cada resource que você otimizou deve ter caído pelo menos 30%. Soma total dos resources idealmente abaixo de 12ms.

02

No txAdmin, observe o Performance Chart por 30 minutos em horário de pico. Tick rate deve manter 60 Hz com no máximo 1-2 dips curtos. Frame time médio abaixo de 16.6ms.

03

Peça feedback de 3-5 jogadores ativos. Pergunte especificamente sobre lag de input em combate e sincronização de veículos. Métrica numérica não captura percepção — jogador percebe stutter de 8ms que o resmon não destaca.

Próximos passos

Performance no FiveM é um processo contínuo — cada resource novo adicionado pode reintroduzir gargalo. Algumas direções pra aprofundar:

  • Configure logs estruturados pra identificar quais eventos disparam mais e quando
  • Aprenda a usar profiler do FXServer (profiler record e profiler view) pra análise mais profunda
  • Se você está colocando isso em produção com 64+ slots e mapas customizados pesados, uma VPS Hostini com CPU de clock alto e NVMe faz diferença mensurável no tick rate — hardware adequado é tão importante quanto código otimizado
  • Implemente staging environment pra testar resources novos antes de subir em produção
  • Documente o baseline atual (tick médio, soma de resources) pra comparar quando mexer em algo no futuro

Perguntas frequentes

Qual é o tickrate ideal pra um servidor FiveM com 64 slots?

O alvo é 60 Hz constante no main thread. Abaixo de 50 Hz já é perceptível como lag de input — bater em alguém com taco demora mais que deveria. Servidores com mais de 32 jogadores simultâneos precisam de OneSync infinity ativo e CPU com clock alto (5 GHz+) pra manter 60 Hz.

OneSync legacy ou infinity? Qual escolher?

Use infinity sempre que possível — suporta até 1024 slots e tem melhor sincronização de entidades. Legacy é limitado a 32 jogadores e está em fim de vida. A única razão pra ficar em legacy é compatibilidade com recursos antigos que não foram atualizados pra a API do infinity.

Meu resmon mostra um resource a 8ms. Isso é ruim?

Sim. Resources individuais não devem passar de 2-3ms no main thread. Acima de 5ms o resource sozinho consome quase um tick inteiro (16.6ms a 60 Hz) e força o servidor a perder ticks. Investigue loops sem Wait, eventos disparados muito frequentes ou queries SQL síncronas dentro do resource.

Vale a pena ativar txAdmin pra monitorar performance?

Sim. txAdmin agrega métricas de tick rate, uso de CPU por resource, jogadores ativos e crashes num único dashboard. Diferente do resmon (que mostra snapshot dentro do jogo), o txAdmin tem histórico — você consegue identificar se a queda de tick aconteceu em horário de pico ou após carregar um recurso específico.

Preciso de SSD NVMe ou SATA é suficiente?

NVMe é claramente melhor pra FiveM. Streaming de assets (mapas customizados, MLOs, ymaps) lê centenas de arquivos pequenos quando jogador entra numa região nova. Em SATA, esse spike de I/O gera stutter local; em NVMe é imperceptível. Servidores com mapas customizados grandes (50 GB+ de assets) só ficam estáveis em NVMe.

Limitar slot ajuda quando o servidor não aguenta?

Ajuda como paliativo, não como solução. Se o tick cai com 48 jogadores e estabiliza com 32, você ganhou tempo — mas a causa raiz (resource pesado, OneSync mal configurado, CPU saturada) continua. Reduzir slot é válido enquanto você investiga e otimiza, não como configuração permanente.

Tópicos:
Próximos passos VPS, dedicado ou painel gerenciado para FiveM, SAMP, MTA, Tibia e mais.Hospede seu servidor de jogos com a Hostini →
Esse tutorial foi útil?
Falar no WhatsApp