Teste de Carga: Melhore o Desempenho do seu Servidor Web!

Foto do autor

By luis

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.