Tudo começa por uma pergunta: o que fazem esses utilizadores? Mil pessoas ligadas a uma aplicação não fazem mil pedidos por segundo, e uma página servida a partir de uma cache custa cem vezes menos do que uma página calculada. Este guia traduz utilizadores em pedidos, pedidos em processador e memória, e mostra como o verificar com um teste de carga.
«Utilizadores simultâneos» designa três grandezas diferentes, conforme quem fala:
Passa-se de uma para a outra pela lei de Little: o número de pedidos em curso é igual ao débito, em pedidos por segundo, multiplicado pela duração média de um pedido.
Exemplo. 600 utilizadores ativos ao mesmo tempo, cada um a desencadear um pedido a cada 20 segundos, fazem 30 pedidos por segundo. Se cada pedido durar 100 ms, o servidor tem apenas 3 pedidos em curso em média. O desafio está noutro lado: nos picos e nos pedidos lentos.
Um pedido ocupa o processador durante o seu cálculo: executar o código, consultar a base de dados, construir a resposta. Um vCPU trata portanto no máximo 1 000 ÷ t pedidos por segundo, em que t é o tempo de cálculo de um pedido em milissegundos. O tempo passado à espera (uma API externa, um disco) não ocupa o processador, mas ocupa um worker.
| Tipo de pedido | Tempo de cálculo típico | Por vCPU, ordem de grandeza |
|---|---|---|
| Ficheiro estático, ou página servida a partir de uma cache | Menos de 1 ms | Vários milhares de pedidos por segundo |
| Página WordPress servida por uma 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 estas ordens de grandeza, 30 pedidos de API por segundo com 10 ms de cálculo ocupam 30 % de um único vCPU. Os mesmos 30 pedidos por segundo em páginas WordPress sem cache pedem 3 a 9 vCPU. A cache de páginas serve precisamente para fazer passar uma página da quarta linha da tabela para a segunda.
Cada pedido em curso é tratado por um worker, e os workers ocupam memória, quer estejam a trabalhar quer não. É muitas vezes a memória, mais do que o processador, que define o número de pedidos tratados em paralelo:
pm.max_children define o teto: 20 processos são 800 MB a 1,6 GB.max_connections.As ligações persistentes (websockets, notificações em tempo real) contam-se à parte: abertas em permanência, ocupam pouco processador e algumas dezenas de kilobytes de memória cada. Um servidor Node.js aguenta milhares delas em algumas centenas de MB.
Numa aplicação real, o servidor raramente satura onde se espera. As causas mais frequentes, pela ordem em que as procurar:
pg_stat_statements no PostgreSQL, ou o registo de consultas lentas do MySQL, identifica-a.As ordens de grandeza dão um primeiro tamanho; um teste de carga dá o verdadeiro. O princípio: simular utilizadores cada vez mais numerosos numa cópia da aplicação, e registar o momento em que o tempo de resposta dispara.
wrk -t2 -c50 -d30s --latency https://preprod.o-seu-site.com/
Para um percurso completo (início de sessão, navegação, pesquisa), o k6 descreve um cenário em JavaScript e faz subir a carga por patamares:
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://preprod.o-seu-site.com/');
sleep(15);
}
htop para o processador, free -h para a memória, os registos 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 API: várias centenas de utilizadores ativos ao mesmo tempo cabem num único servidor bem ajustado.
O VPS Pro está disponível em seis tamanhos, com processadores Intel Xeon, memória ECC e SSD NVMe em espelho, e passa ao tamanho superior a qualquer momento, sem reinstalação. A Assistência integral está incluída: diga-nos quantos utilizadores espera no lançamento e daqui a um ano, e aconselhamos-lhe o tamanho; e quando uma página abranda, diagnosticamos e indicamos-lhe o que fazer, do sistema até ao código da sua aplicação.
Para uma API ou uma aplicação cujos pedidos levam 10 a 20 ms de cálculo, várias centenas de utilizadores ativos ao mesmo tempo. Para um site WordPress sem cache de páginas, cerca de uma centena. A diferença está no tempo de cálculo de cada pedido e na 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 para o outro, divida as visitas do dia pelas horas de atividade, multiplique pelas páginas vistas por visita, e depois por um fator de ponta 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 % nas horas de ponta, ou a memória disponível desce para perto de zero. Os registos do servidor web mostram então erros 502 ou 504, e os pedidos esperam por um worker livre.
Sim: uma ligação websocket fica aberta em permanência. Consome pouco processador e algumas dezenas de kilobytes de memória. Um servidor Node.js aguenta milhares delas; são as mensagens enviadas, mais do que as ligações abertas, que carregam o processador.
Simafri
Vamos falar do seu projeto
Diga-nos em poucas palavras o que precisa: respondemos-lhe rapidamente.
Obrigado! O seu pedido foi enviado. Responderemos em breve.
Prefere o email? Escreva-nos para support@simafri.com.