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.
“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.
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ção | Tempo de cálculo típico | Por vCPU, ordem de grandeza |
|---|---|---|
| Arquivo estático, ou página servida a partir de um cache | Menos de 1 ms | Vários milhares de requisições por segundo |
| Página WordPress servida por um cache de páginas | 1 a 5 ms | Várias centenas por segundo |
| API JSON (Node.js, Go, FastAPI) com uma consulta SQL indexada | 5 a 20 ms | 50 a 200 por segundo |
| Página WordPress ou Laravel calculada a cada visita | 100 a 300 ms | 3 a 10 por segundo |
| Relatório, exportação, geração de PDF | 500 ms a vários segundos | Menos 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.
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:
pm.max_children define o teto: 20 processos são 800 MB a 1,6 GB.max_connections.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.
Em uma aplicação real, o servidor raramente satura onde se espera. As causas mais frequentes, na ordem em que vale procurar:
pg_stat_statements no PostgreSQL, ou o log de consultas lentas do MySQL, aponta qual é.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.
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:
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);
}
htop para o processador, free -h para a memória, os logs para os erros.A ordem que custa menos e rende mais:
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.
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.
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.
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.
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.
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.
Simafri
Vamos falar de seu site
Conte para a gente sobre seu projeto em poucas palavras: responderemos rapidamente.
Obrigado! O seu pedido foi enviado. Responderemos em breve.
Prefere o e-mail? Escreva para a gente em support@simafri.com.