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
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.
60 Hz < 3ms cada < 12ms total 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.
Entre no servidor como jogador e abra o console com F8. Digite o comando do monitor de resources:
resmon 1Isso 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.
No console do servidor (SSH ou janela do FXServer), rode o comando que mostra o tick atual:
statusVocê 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.
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.
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.
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 64A 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.
Se você está rodando OneSync legacy e quer migrar pra infinity, troque a linha e teste seus recursos:
set onesync infinityReinicie 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.
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.
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.
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.
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.
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.
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.
Habilite cache asset no server.cfg:
sv_assetCacheEnabled trueIsso permite que clientes mantenham assets em cache entre sessões, reduzindo download repetido — menos pressão de I/O e rede quando jogadores reconectam.
Identifique mapas duplicados ou conflitantes. Use o comando no console do servidor pra listar resources com assets:
listProcure 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:
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.
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.
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 recordeprofiler 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.