Você tem conhecimento sobre o tempo médio de resposta do seu site? Sabe exatamente quantos usuários o seu site consegue suportar simultaneamente?
Realizar testes de carga é crucial para que aplicações web compreendam a capacidade de um site. Ao escolher um servidor web, um dos passos iniciais deve ser a execução de testes de carga, para determinar qual opção se adapta melhor às suas necessidades.
O processo de benchmarking pode ser um aliado na tomada de decisões, auxiliando na identificação de:
- Qual servidor web oferece o melhor desempenho;
- O número de servidores necessários para lidar com um determinado volume de solicitações;
- A configuração que proporciona os resultados mais otimizados;
- Quais conjuntos de tecnologias apresentam a melhor performance;
- Os limites de desempenho do seu site, ou seja, quando ele começa a apresentar lentidão ou falhas.
Existem diversas ferramentas online para realizar testes de estresse. Contudo, se você busca uma solução interna ou deseja comparar diretamente o desempenho do servidor web, pode optar pelo ApacheBench, ou por outras opções mencionadas abaixo.
Para exemplificar, usei os servidores web Apache e Nginx hospedados na Digital Ocean durante meus testes.
ApacheBench
ApacheBench (ab) é uma ferramenta de linha de comando, de código aberto, compatível com qualquer servidor web. Neste artigo, vou detalhar como instalar este programa e como realizar testes de carga para comparar os resultados obtidos.
Instalando o Apache
Para instalar o ApacheBench, utilizaremos um comando yum.
yum install httpd-tools
Caso já tenha o httpd-tools instalado, pode ignorar esta etapa.
Agora, vamos observar como o programa se comporta ao simular 5.000 solicitações com uma concorrência de 500.
[[email protected] ~]# ab -n 5000 -c 500 http://localhost:80/ This is ApacheBench, Version 2.3 <$Revision: 655654 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking localhost (be patient) Completed 500 requests Completed 1000 requests Completed 1500 requests Completed 2000 requests Completed 2500 requests Completed 3000 requests Completed 3500 requests Completed 4000 requests Completed 4500 requests Completed 5000 requests Finished 5000 requests Server Software: Apache/2.2.15 Server Hostname: localhost Server Port: 80 Document Path: / Document Length: 4961 bytes Concurrency Level: 500 Time taken for tests: 13.389 seconds Complete requests: 5000 Failed requests: 0 Write errors: 0 Non-2xx responses: 5058 Total transferred: 26094222 bytes HTML transferred: 25092738 bytes Requests per second: 373.45 [#/sec] (mean) Time per request: 1338.866 [ms] (mean) Time per request: 2.678 [ms] (mean, across all concurrent requests) Transfer rate: 1903.30 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 42 20.8 41 1000 Processing: 0 428 2116.5 65 13310 Waiting: 0 416 2117.7 55 13303 Total: 51 470 2121.0 102 13378 Percentage of the requests served within a certain time (ms) 50% 102 66% 117 75% 130 80% 132 90% 149 95% 255 98% 13377 99% 13378 100% 13378 (longest request) [[email protected] ~]#
Como resultado, o Apache processou 373 solicitações por segundo e levou um total de 13,389 segundos para completar todas as solicitações.
Com esse teste, você tem uma noção da capacidade de resposta da configuração padrão do servidor. Ao realizar qualquer alteração, você pode repetir o teste e comparar os resultados para escolher a opção mais adequada.
Testando com Nginx
Vamos repetir o teste, agora com Nginx, para comparar o desempenho de cada servidor.
[[email protected] ~]# ab -n 5000 -c 500 http://localhost:80/ This is ApacheBench, Version 2.3 <$Revision: 655654 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking localhost (be patient) Completed 500 requests Completed 1000 requests Completed 1500 requests Completed 2000 requests Completed 2500 requests Completed 3000 requests Completed 3500 requests Completed 4000 requests Completed 4500 requests Completed 5000 requests Finished 5000 requests Server Software: nginx/1.10.1 Server Hostname: localhost Server Port: 80 Document Path: / Document Length: 3698 bytes Concurrency Level: 500 Time taken for tests: 0.758 seconds Complete requests: 5000 Failed requests: 0 Write errors: 0 Total transferred: 19660000 bytes HTML transferred: 18490000 bytes Requests per second: 6593.48 [#/sec] (mean) Time per request: 75.832 [ms] (mean) Time per request: 0.152 [ms] (mean, across all concurrent requests) Transfer rate: 25317.93 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 6 11.0 2 53 Processing: 5 19 8.2 17 53 Waiting: 0 18 8.2 16 47 Total: 10 25 17.4 18 79 Percentage of the requests served within a certain time (ms) 50% 18 66% 21 75% 21 80% 22 90% 69 95% 73 98% 75 99% 76 00% 79 (longest request) [[email protected] ~]#
Impressionante!
O Nginx processou 6593 solicitações por segundo, destacando-se como o vencedor.
Este simples comparativo entre dois servidores web já fornece uma noção clara de qual escolher para sua aplicação.
É importante ressaltar que este teste foi realizado em um sistema CentOS 6.8 de 64 bits. Você pode experimentar diversas combinações de versões de sistema operacional e servidores web para encontrar os melhores resultados.
Não se identificou com o ApacheBench? Não se preocupe, há outras ferramentas que você pode usar para realizar testes de carga HTTP.
SIEGE
SIEGE é um utilitário de teste de carga HTTP que funciona em sistemas UNIX. Ele permite o uso de múltiplos URLs em um arquivo de texto para realizar os testes. A instalação pode ser feita utilizando o yum.
# yum install siege
Vamos executar um teste com 500 solicitações simultâneas durante 5 segundos.
[[email protected] ~]# siege -q -t 5S -c 500 http://localhost/ Lifting the server siege... done. Transactions: 4323 hits Availability: 100.00 % Elapsed time: 4.60 secs Data transferred: 15.25 MB Response time: 0.04 secs Transaction rate: 939.78 trans/sec Throughput: 3.31 MB/sec Concurrency: 37.97 Successful transactions: 4323 Failed transactions: 0 Longest transaction: 1.04 Shortest transaction: 0.00 [[email protected] ~]#
Entendendo os parâmetros:
- -q: executa o teste de forma silenciosa (sem mostrar os detalhes da requisição).
- -t: define a duração do teste em 5 segundos.
- -c: define 500 solicitações simultâneas.
A disponibilidade é de 100% e o tempo de resposta é de 0.04 segundos. Você pode ajustar os parâmetros de acordo com seus objetivos.
Ali
Ali é uma ferramenta de teste de carga mais recente, que oferece análises em tempo real. Ela suporta diferentes plataformas para instalação, incluindo o Docker.
Após a instalação, execute “ali” para ver os detalhes de uso.
[email protected]:~# ali no target given Usage: ali [flags] <target URL> Flags: -b, --body string A request body to be sent. -B, --body-file string The path to file whose content will be set as the http request body. --debug Run in debug mode. -d, --duration duration The amount of time to issue requests to the targets. Give 0s for an infinite attack. (default 10s) -H, --header strings A request header to be sent. Can be used multiple times to send multiple headers. -k, --keepalive Use persistent connections. (default true) -M, --max-body int Max bytes to capture from response bodies. Give -1 for no limit. (default -1) -m, --method string An HTTP request method for each request. (default "GET") -r, --rate int The request rate per second to issue against the targets. Give 0 then it will send requests as fast as possible. (default 50) -t, --timeout duration The timeout for each request. 0s means to disable timeouts. (default 30s) -v, --version Print the current version. Examples: ali --duration=10m --rate=100 http://host.xz Author: Ryo Nakao <[email protected]> [email protected]:~#
Como pode observar, você tem a opção de configurar cabeçalhos HTTP, duração do teste, limite de taxa, tempo limite, entre outros. Fiz um teste rápido no etechpt.com Tools e o relatório foi bastante detalhado, fornecendo informações sobre a latência.
Gobench
Gobench é um utilitário simples, escrito em linguagem Go, ideal para avaliar o desempenho de servidores web. Ele suporta mais de 20.000 usuários simultâneos, algo que o ApacheBench não consegue.
Apache JMeter
JMeter é uma das ferramentas de código aberto mais populares para medir o desempenho de aplicações web. Sendo um aplicativo baseado em Java, ele não se limita a servidores web, podendo ser utilizado em PHP, Java, ASP.net, SOAP, REST, etc.
JMeter tem uma interface amigável e a versão mais recente (3.0) requer Java 7 ou superior. Se o objetivo for otimizar o desempenho de uma aplicação web, vale a pena experimentar o JMeter.
wrk
wrk é outra ferramenta moderna de medição de desempenho para simular carga em servidores web, fornecendo detalhes como latência, solicitações por segundo e taxa de transferência.
Com wrk, você tem a opção de especificar a execução de testes de carga com várias threads.
Vamos exemplificar com um teste de 5 minutos, 500 usuários simultâneos e 8 threads.
wrk –t8 –c500 -d300s http://localhost
autocannon
Inspirado em wrk, o autocannon é escrito em Node.js. Ele pode ser utilizado via API ou como um utilitário independente. É necessário ter o NodeJS instalado.
Você pode controlar conexões, solicitações, duração, trabalhadores, tempo limite e oferece inúmeras opções para comparar o desempenho de suas aplicações web.
curl-loader
O curl-loader é escrito em C para simular cargas em aplicações e suporta SSL/TLS. Além de testar páginas web, ele pode ser usado para simular carga em servidores FTP.
É possível criar planos de teste com diversas combinações de HTTP, HTTPS, FTP e FTPS em uma mesma configuração.
httperf
O httperf é uma ferramenta focada em benchmarks de nível micro e macro, que suporta os protocolos HTTP/1.1 e SSL.
Para simular um número esperado de usuários simultâneos, e verificar se o servidor web consegue lidar com várias solicitações, utilize o seguinte comando:
httperf --server localhost --port 80 --num-conns 1000 --rate 100
O comando acima executará 100 solicitações por segundo, simulando um total de 1000 solicitações HTTP.
Tsung
Tsung é uma ferramenta de teste de estresse distribuído que suporta diversos protocolos, sendo ideal para servidores HTTP, SOAP, PostgreSQL, LDAP, XAMP e MySQL. Ele gerencia cookies automaticamente e suporta HTTP/1.0 e HTTP/1.1.
Tsung também possibilita a geração de relatórios detalhados.
Conclusão
Espero que as ferramentas de benchmarking mencionadas tenham lhe proporcionado uma visão clara sobre o desempenho do seu servidor web e que você possa decidir qual opção é mais adequada para o seu projeto.
Não se esqueça de monitorar o desempenho do seu site continuamente.