Quantos usuários simultâneos um VPS aguenta: faça o cálculo

Tudo começa com uma pergunta: o que esses usuários fazem? Mil pessoas conectadas a uma aplicação não fazem mil requisições por segundo, e uma página servida a partir de um cache custa cem vezes menos que uma página calculada. Este guia converte usuários em requisições, requisições em processador e memória, e depois mostra como verificar tudo com um teste de carga.

Publicado em 26 de outubro de 2026 Por Leitura: 9 minutos

Todos os guias

O essencial

  1. Usuários conectados não são requisições simultâneas: um usuário ativo envia uma requisição a cada 10 a 30 segundos, aproximadamente.
  2. Requisições em andamento = requisições por segundo × duração de uma requisição (lei de Little). É esse número que o servidor precisa aguentar.
  3. Um vCPU atende no máximo 1.000 ÷ (milissegundos de cálculo por requisição) requisições por segundo: 20 ms de cálculo, 50 requisições por segundo.
  4. A memória limita o número de workers: cada processo PHP ou Python ocupa de 40 a 200 MB.
  5. O cache muda tudo: uma página servida a partir de um cache custa menos de um milissegundo, uma página WordPress calculada, de 100 a 300.
  6. Meça com um teste de carga (k6, wrk) em uma cópia da aplicação, subindo em etapas.

Dos usuários às requisições

“Usuários simultâneos” designa três grandezas diferentes, dependendo de quem fala:

Passa-se de uma à outra pela lei de Little: o número de requisições em andamento é igual à vazão, em requisições por segundo, multiplicada pela duração média de uma requisição.

Exemplo. 600 usuários ativos ao mesmo tempo, cada um disparando uma requisição a cada 20 segundos, geram 30 requisições por segundo. Se cada requisição dura 100 ms, o servidor tem apenas 3 requisições em andamento, em média. O desafio está em outro lugar: nos picos e nas requisições lentas.

O que um vCPU aguenta

Uma requisição ocupa o processador durante o cálculo dela: executar o código, consultar o banco, montar a resposta. Um vCPU processa, portanto, no máximo 1.000 ÷ t requisições por segundo, em que t é o tempo de cálculo de uma requisição em milissegundos. O tempo gasto esperando (uma API externa, um disco) não ocupa o processador, mas ocupa um worker.

Tipo de requisiçãoTempo de cálculo típicoPor vCPU, ordem de grandeza
Arquivo estático, ou página servida a partir de um cacheMenos de 1 msVários milhares de requisições por segundo
Página WordPress servida por um cache de páginas1 a 5 msVárias centenas por segundo
API JSON (Node.js, Go, FastAPI) com uma consulta SQL indexada5 a 20 ms50 a 200 por segundo
Página WordPress ou Laravel calculada a cada visita100 a 300 ms3 a 10 por segundo
Relatório, exportação, geração de PDF500 ms a vários segundosMenos de 2 por segundo

Com essas ordens de grandeza, 30 requisições de API por segundo com 10 ms de cálculo ocupam 30% de um único vCPU. As mesmas 30 requisições por segundo em páginas WordPress sem cache pedem 3 a 9 vCPU. O cache de páginas serve justamente para levar uma página da quarta linha da tabela para a segunda.

O que a memória aguenta

Cada requisição em andamento é atendida por um worker, e os workers ocupam memória, trabalhando ou não. Muitas vezes é a memória, mais do que o processador, que define o número de requisições processadas em paralelo:

As conexões persistentes (websockets, notificações em tempo real) contam à parte: abertas o tempo todo, elas ocupam pouco processador e algumas dezenas de kilobytes de memória cada uma. Um servidor Node.js mantém milhares delas em algumas centenas de MB.

Os verdadeiros gargalos

Em uma aplicação real, o servidor raramente satura onde se espera. As causas mais frequentes, na ordem em que vale procurar:

  1. Uma consulta SQL lenta: um índice ausente transforma uma consulta de 2 ms em uma consulta de 2 segundos, que prende um worker e uma conexão. O pg_stat_statements no PostgreSQL, ou o log de consultas lentas do MySQL, aponta qual é.
  2. As consultas em cascata (o problema N+1): uma página que dispara uma consulta por linha exibida dispara centenas delas.
  3. Uma chamada externa síncrona: uma API de pagamento ou de IA que responde em 3 segundos bloqueia um worker síncrono durante 3 segundos.
  4. Processamentos pesados dentro da requisição: envio de e-mails, redimensionamento de imagens, geração de PDF, a transferir para uma fila de tarefas.
  5. A falta de cache: as páginas idênticas para todos os visitantes são servidas a partir de um cache, e os arquivos estáticos, pelo servidor web.

Verificar: o teste de carga

As ordens de grandeza dão um primeiro tamanho; um teste de carga dá o tamanho real. O princípio: simular usuários cada vez mais numerosos em uma cópia da aplicação e registrar o momento em que o tempo de resposta dispara.

Terminal: 50 conexões durante 30 segundos, com o wrk
wrk -t2 -c50 -d30s --latency https://homologacao.seu-site.com/

Para um percurso completo (login, navegação, busca), o k6 descreve um cenário em JavaScript e aumenta a carga em etapas:

Script k6 (test.js), executado com: k6 run test.js
import http from 'k6/http';
import { sleep } from 'k6';

export const options = {
  stages: [
    { duration: '2m', target: 100 },
    { duration: '5m', target: 100 },
    { duration: '2m', target: 300 },
    { duration: '5m', target: 300 },
    { duration: '2m', target: 0 },
  ],
  thresholds: { http_req_duration: ['p(95)<500'] },
};

export default function () {
  http.get('https://homologacao.seu-site.com/');
  sleep(15);
}

Quando a carga cresce

A ordem que custa menos e rende mais:

  1. Colocar em cache o que puder ser colocado (páginas, fragmentos, resultados de consultas) e corrigir as consultas lentas.
  2. Ajustar o número de workers à memória e ao processador disponíveis.
  3. Passar para um tamanho superior: mais vCPU e memória, sem mudar nada na aplicação.
  4. Colocar o banco de dados em um servidor próprio.
  5. Distribuir a aplicação entre vários servidores atrás de um balanceador de carga.

As três primeiras etapas cobrem a grande maioria das aplicações de gestão, dos sites e das APIs: várias centenas de usuários ativos ao mesmo tempo cabem em um único servidor bem ajustado.

Um servidor que cresce com seus usuários

O VPS Pro tem seis tamanhos, com processadores Intel Xeon, memória ECC e SSD NVMe espelhados, e passa para o tamanho superior a qualquer momento, sem reinstalação. A Assistência integral está incluída: diga quantos usuários você espera no lançamento e daqui a um ano, e recomendamos o tamanho; quando uma página fica lenta, diagnosticamos e indicamos o que fazer, do sistema até o código de sua aplicação.

Conhecer o VPS Pro

Perguntas frequentes

Quantos usuários um VPS de 2 vCPU e 4 GB aguenta?

Para uma API ou uma aplicação cujas requisições levam 10 a 20 ms de cálculo, várias centenas de usuários ativos ao mesmo tempo. Para um site WordPress sem cache de páginas, cerca de cem. A diferença vem do tempo de cálculo de cada requisição e do cache, daí o interesse de um teste de carga.

Quantos visitantes por dia um VPS pode receber?

O número de visitantes por dia diz pouco: o que conta é o pico. Para passar de um ao outro, divida as visitas do dia pelas horas de atividade, multiplique pelas páginas vistas por visita e depois por um fator de pico de 3 a 5. 10.000 visitas em 10 horas, com 4 páginas cada, dão cerca de 1 página por segundo em média, e 3 a 5 no pico.

Como saber se meu servidor está saturado?

Três sinais: o tempo de resposta sobe com o tráfego, o processador fica acima de 80% nos horários de pico, ou a memória disponível cai para perto de zero. Os logs do servidor web mostram então erros 502 ou 504, e as requisições esperam por um worker livre.

Os websockets mudam o cálculo?

Sim: uma conexão websocket fica aberta o tempo todo. Ela consome pouco processador e algumas dezenas de kilobytes de memória. Um servidor Node.js mantém milhares delas; são as mensagens enviadas, mais do que as conexões abertas, que carregam o processador.

Entre em contato