Como Otimizar Servidor SA-MP: Performance, Tickrate e Desync

Guia técnico para otimizar servidor SA-MP: ajustes em server.cfg, profiling de gamemode, plugins essenciais e tuning de kernel para eliminar lag e desync.

Servidores SA-MP com 50 ou mais jogadores simultâneos costumam acumular três sintomas previsíveis: queda de tickrate quando há combate intenso, desync em perseguições de carro e travamento momentâneo quando muitos jogadores entram ao mesmo tempo. Na maioria dos casos, o gargalo não está na CPU do host — está em loops mal escritos no gamemode, plugins desatualizados e parâmetros conservadores no server.cfg que nunca foram revistos depois do deploy inicial.

Este guia é para você que administra um servidor SA-MP ou open.mp em produção, tem acesso SSH ao host e sabe recompilar gamemode em Pawn. Tempo estimado de execução completa: 90 a 120 minutos, incluindo medições antes e depois. Cada seção é independente — você pode aplicar só as partes relevantes ao seu cenário.

A diferença entre um servidor que aguenta 200 slots em horário de pico e outro que trava com 60 raramente é hardware. É configuração.

Pré-requisitos

Pré-requisitos

Você precisa de acesso SSH ao servidor (Ubuntu 22.04 ou Debian 12 recomendados), permissão sudo, gamemode em formato .pwn fonte (não só .amd compilado) e janela de manutenção de pelo menos 30 minutos para reinício controlado. Os jogadores devem ser avisados antes — perda de conexão é esperada durante os ajustes finais.

Verifique o estado atual antes de mudar qualquer coisa. Registre estes números — sem baseline, você não tem como provar que a otimização funcionou:

Versão SA-MP 0.3.7-R5 / open.mp 1.4
Slots configurados maxplayers no server.cfg
Tickrate atual console / showplayercount
CPU em pico htop com 80%+ slots

Ajustar server.cfg

O server.cfg é o lugar mais barato para ganhar performance — mudanças aqui não exigem recompilar nada e podem reduzir desync em minutos. A maioria dos servidores roda com valores padrão herdados de tutoriais de 2014 que não fazem mais sentido em hardware moderno.

01

Abra o arquivo de configuração na raiz do servidor:

cd /home/samp/server
nano server.cfg

Identifique as linhas sleep, lagcompmode, playertimeout e stream_distance. Se alguma dessas linhas não existir, adicione — os valores default do binário SA-MP costumam ser conservadores demais para servidores cheios.

02

Aplique os valores recomendados para servidor ativo com 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 30

O sleep 5 reduz CPU consumido pelo loop principal sem prejudicar responsividade. lagcompmode 1 é o padrão moderno para servidores com tiros — mude para 2 apenas se sua mecânica for predominantemente perseguição veicular sem combate. playertimeout 10000 (10 segundos) evita desconexões falsas em jogadores com jitter ocasional.

lagcompmode é decisão de design

Mudar lagcompmode quebra o comportamento percebido de armas e veículos. Teste em servidor de homologação com pelo menos 20 jogadores antes de aplicar em produção — jogadores acostumados ao modo antigo vão reclamar de “tiros que não acertam” por alguns dias mesmo se a mudança for tecnicamente correta.

03

Salve, saia e reinicie o servidor:

systemctl restart samp-server

Caso você não use systemd, mate o processo samp03svr e reinicie via screen ou tmux. Aguarde 30 segundos e verifique se subiu corretamente:

tail -n 50 server_log.txt

Auditar o gamemode em Pawn

A maior fonte de lag em servidores SA-MP estabelecidos é código antigo no gamemode — especialmente loops for(new i = 0; i < MAX_PLAYERS; i++) que rodam dentro de timers de 100ms. Cada um desses loops, multiplicado pela frequência do timer, pode consumir mais CPU do que todos os plugins juntos.

04

Procure por loops sobre MAX_PLAYERS em callbacks frequentes:

grep -rn "MAX_PLAYERS" gamemodes/*.pwn | grep -v "Iter_"

Cada resultado é candidato a refatoração. A regra prática: se o loop está dentro de um timer ou de OnPlayerUpdate, ele precisa ser substituído por iteração via foreach (plugin Iter) que itera apenas sobre jogadores conectados, não sobre todos os 1000 slots possíveis.

05

Substitua loops MAX_PLAYERS por foreach do plugin Iter:

// Antes — itera sobre 1000 slots mesmo com 50 jogadores
for(new i = 0; i < MAX_PLAYERS; i++)
{
    if(IsPlayerConnected(i))
    {
        // logica
    }
}

// Depois — itera apenas sobre conectados
foreach(new i : Player)
{
    // logica
}

Em servidor com 50 jogadores ativos e MAX_PLAYERS 1000, isso é redução de 95% no número de iterações por chamada. Em um timer de 1 segundo, são 950 verificações desnecessárias eliminadas a cada execução.

06

Audite timers com intervalo abaixo de 1000ms:

grep -rn "SetTimer" gamemodes/*.pwn

Timers de 100ms para tarefas que não precisam dessa frequência (atualizar HUD, sincronizar score, salvar posição) são causa comum de CPU alto. Aumente para 500ms ou 1000ms onde possível. Salvamento de posição de jogador em banco de dados nunca deve rodar abaixo de 30 segundos por jogador.

Profile antes de refatorar

O plugin Profiler gera relatório de tempo gasto por callback durante uma sessão real. Carregue em ambiente de homologação por 1 hora com jogadores reais, gere o relatório e priorize as refatorações pelos top 10 callbacks mais custosos. Otimizar código que não aparece no profile é desperdício de tempo.

Atualizar plugins essenciais

Plugins SA-MP têm impacto direto no consumo de CPU e na latência percebida. Versões antigas de streamer e sscanf podem custar até 10 vezes mais por chamada que as versões atuais — e quase todo servidor estabelecido roda com binários compilados há 5 ou mais anos.

PluginVersão mínima recomendadaO que melhora
streamerv2.9.6Iteração de objetos dinâmicos, áreas e pickups
sscanf2.13.8Parsing de comandos com múltiplos parâmetros
MySQLR41-5 ou superiorQueries assíncronas, pool de conexões
Pawn.RakNet1.5+Interceptação de pacotes RPC com baixo overhead
YSFopen.mp DCFunções de servidor faltantes do binário base
Profilerúltima disponívelApenas em homologação — não usar em produção
07

Baixe as versões atuais e substitua no diretório plugins:

cd /home/samp/server/plugins
ls -la

Faça backup dos binários antigos antes de substituir. Recompile o gamemode com os includes correspondentes às novas versões — pular essa etapa causa crashes em chamadas que mudaram de assinatura entre versões.

08

Ajuste a ordem de carregamento no server.cfg. A ordem importa porque plugins dependem uns dos outros:

plugins streamer sscanf mysql Pawn.RakNet YSF

streamer sempre primeiro, MySQL antes de qualquer plugin que faça query no startup, YSF por último porque hooka funções de outros plugins.

Tuning de rede no host

O sistema operacional do host tem parâmetros de kernel que afetam diretamente a latência de UDP — protocolo usado pelo SA-MP. Os valores default do Linux são otimizados para TCP de longa duração, não para o pattern de muitos pacotes pequenos e frequentes do SA-MP.

09

Edite os parâmetros de rede no sysctl:

sudo nano /etc/sysctl.d/99-samp.conf

Adicione os 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 16777216

Esses valores aumentam os buffers de recepção e transmissão de UDP, evitando descarte de pacotes em rajadas de tráfego (entrada simultânea de jogadores, eventos em massa).

10

Aplique sem reiniciar o servidor:

sudo sysctl -p /etc/sysctl.d/99-samp.conf

Verifique se os valores foram aplicados:

sysctl net.core.rmem_max

A saída deve mostrar o número que você definiu. Caso volte ao default, há outro arquivo sysctl sobrescrevendo — verifique /etc/sysctl.conf e /etc/sysctl.d/.

Não aplique em VPS compartilhada sem permissão

Em ambientes virtualizados sem privilégios completos, alguns desses parâmetros são bloqueados pelo host. Tentar forçar pode resultar em isolamento da instância. Servidores dedicados ou VPS com KVM completo aceitam todos os ajustes. Em dúvida, consulte o suporte do provedor antes de mudar parâmetros de kernel.

Verificação

Confirme as melhorias com medições objetivas. Sem números antes e depois, é impossível distinguir otimização real de placebo.

Conecte 30 a 50 jogadores reais ou bots de teste durante 30 minutos e registre:

htop

CPU consumida pelo processo samp03svr deve estar abaixo de 40% em um core durante carga normal. Memória deve estar estável — crescimento contínuo indica vazamento no gamemode, geralmente em variáveis dinâmicas não desalocadas.

Para latência percebida pelos jogadores, use o comando /ping em jogo ou observe a coluna PING no /players. Pings consistentes abaixo de 80ms para jogadores brasileiros indicam rede saudável. Variação maior que 30ms entre amostras indica jitter — problema de rota, não de servidor.

Resolução de problemas

Servidor crasha após atualizar plugins

Recompile o gamemode com os includes correspondentes às novas versões dos plugins. Assinaturas de funções mudam entre releases — chamar uma função antiga com argumentos novos causa erro de stack que derruba o processo. Verifique o crashlog em crashinfo.txt na raiz do servidor.

CPU continua alta após refatoração

Rode o Profiler em homologação por 1 hora com jogadores reais e identifique callbacks que não foram refatorados. Loops residuais em OnPlayerUpdate (chamado dezenas de vezes por segundo por jogador) consomem CPU exponencialmente — esse callback nunca deve conter loops sobre todos os jogadores.

Desync persiste mesmo com lagcompmode correto

Verifique packetloss da rota com mtr -r -c 100 IP_DO_SERVIDOR do seu computador. Qualquer hop com perda acima de 0,5% indica problema de rede do datacenter ou do trânsito. Esse tipo de desync não tem solução em software — exige troca de provedor ou rota.

Próximos passos

Com o servidor otimizado, considere estes próximos investimentos técnicos:

  • Migrar para open.mp se ainda estiver em SA-MP 0.3.7-R5 — recompilação custa horas, ganho de performance e segurança é permanente.
  • Implementar anti-cheat server-side com Pawn.RakNet — bloqueia 90% dos hacks comuns sem dependência de cliente.
  • Monitorar via graphite + grafana ou painel da Hostini — observar tickrate e CPU ao longo de semanas revela padrões invisíveis em diagnóstico pontual.
  • Avaliar DDoS protection dedicada para UDP — ataques contra a porta 7777 são frequentes em servidores SA-MP populares.

Se você está hospedando um servidor SA-MP em crescimento, vale considerar a hospedagem dedicada para jogos da Hostini — VPS com KVM completo, proteção DDoS para UDP e datacenters em São Paulo e Miami com baixa latência para Brasil e Hispanoamérica. Sem oversell, sem compartilhamento de core com outros tenants.

Perguntas frequentes

Qual tickrate ideal para um servidor SA-MP com 100 slots?

O SA-MP roda em ~25 ticks/segundo internamente e isso não é configurável diretamente — o que você controla é o sleep no server.cfg. Use sleep 5 em servidores ativos para reduzir latência sem saturar CPU. Sleep 0 monopoliza o core e raramente compensa fora de minigames competitivos.

Por que meu servidor SA-MP tem desync mesmo com ping baixo?

Desync em ping baixo quase sempre é lagcompmode incorreto ou packetloss intermitente. Verifique lagcompmode 1 no server.cfg, mude para 2 se tiver muitos tiros/perseguições. Packetloss acima de 0,5% no mtr para o IP do servidor indica problema de rede do datacenter, não do gamemode.

Quantos plugins SA-MP posso carregar sem perder performance?

Não há limite duro — o impacto vem de quais plugins, não da quantidade. Streamer, sscanf, MySQL R41-5 e Pawn.RakNet juntos custam menos de 2% de CPU em servidor cheio. Plugins antigos sem manutenção (mxINI, foreach legado) podem custar 10x mais por chamada.

Vale a pena migrar de SA-MP para open.mp?

Open.mp roda os mesmos gamemodes Pawn compilados para SA-MP 0.3.7-R2 com correções de segurança e melhor performance em loops internos. Para servidor novo, comece em open.mp. Para servidor estabelecido, teste em ambiente paralelo antes — alguns plugins muito antigos precisam de recompilação.

Como medir o impacto real de cada otimização no servidor SA-MP?

Use GetTickCount() antes e depois do bloco que você está otimizando, registre em um log e compare com servidor cheio. Para profiling sério, o plugin Profiler do YSF gera relatório de tempo por callback. Métricas de host (CPU, rede) vêm do painel da Hostini ou de htop/iftop no servidor.

Quanta RAM um servidor SA-MP precisa por slot?

SA-MP em si consome 50-200 MB independente de slots. O custo de RAM real vem do gamemode: cada veículo dinâmico, pickup e marcador 3D no streamer usa memória. Para 200 slots com sistema completo de roleplay, reserve 1 GB. Para freeroam/DM, 512 MB é suficiente.

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