Como realizar o benchmark de desempenho do servidor Web?

Você sabe o tempo médio de resposta do seu site? Você sabe quantos usuários simultâneos seu site pode suportar?

O teste de carga é essencial para que os aplicativos da Web conheçam a capacidade do site. Se você for escolher o servidor da Web, uma das primeiras coisas a fazer é realizar o teste de carga e ver qual funciona melhor para você.

O benchmarking pode ajudá-lo a decidir;

  • Qual servidor web funciona melhor
  • Número de servidores que você precisa para atender x número de solicitações
  • Qual configuração oferece os melhores resultados
  • Quais pilhas de tecnologia têm melhor desempenho
  • Quando o desempenho do seu site será mais lento ou falhará

Existem várias ferramentas online para realizar um teste de estresse; no entanto, se você estiver procurando por uma solução interna ou quiser comparar apenas o desempenho do servidor da Web, poderá usar o ApacheBench e, alternativamente, algumas das ferramentas listadas abaixo.

Eu usei o servidor web Apache & Nginx hospedado em Digital Ocean para testá-lo.

ApacheBenchGenericName

ApacheBenchGenericName (ab) é um programa de linha de comando de código aberto que funciona com qualquer servidor web. Neste post, explicarei como instalar este pequeno programa e realizar o teste de carga para comparar os resultados.

Apache

Vamos instalar o ApacheBench usando um comando yum.

yum install httpd-tools

Se você já possui httpd-tools, pode ignorar isso.

Agora, vamos ver como ele funciona para 5.000 solicitações com uma simultaneidade 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 você pode ver, o Apache tratou 373 solicitações por segundo e levou um total de 13,389 segundos para atender ao total de solicitações.

  8 ferramentas de escrita profissional para cada blogueiro e redator

Agora você sabe que a configuração padrão pode atender a essas muitas solicitações, portanto, quando fizer qualquer alteração na configuração, poderá fazer o teste novamente para comparar os resultados e escolher o melhor.

NginxGenericName

Vamos fazer o teste que fizemos para o Apache para que você possa comparar qual deles tem melhor desempenho.

[[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] ~]#

UAU!

Você viu aquilo?

O Nginx tratou 6593 solicitações por segundo! Um vencedor.

Então você vê apenas comparando com dois servidores web, você terá uma ideia de qual escolher para sua aplicação web.

O teste acima está no CentOS 6.8, 64 bits. Você pode tentar várias combinações de versão do sistema operacional e do servidor da Web para obter os melhores resultados.

Não gosta do ApacheBench por qualquer motivo? Não se preocupe, há muitos outros que você pode usar para executar o carregamento HTTP.

CERCO

CERCO é um utilitário de teste de carga HTTP suportado no UNIX. Você pode colocar vários URLs em um arquivo de texto para carregar os testes. Você pode instalar o cerco usando yum.

# yum install siege

Vamos executar o teste com 500 solicitações simultâneas por 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] ~]#

Para quebrar os parâmetros.

  Como executar a recuperação do Xbox Gamertag

-q – para executá-lo silenciosamente (não mostrando os detalhes da solicitação)

-t – executar por 5 segundos

-c – 500 solicitações simultâneas

Então, como você pode ver, a disponibilidade é de 100% e o tempo de resposta é de 0,04 segundos. Você pode ajustar o parâmetro de teste de carga com base em seu objetivo.

Todos

Todos é uma ferramenta de teste de carga relativamente nova para realizar análises em tempo real. Ele oferece suporte a várias plataformas para instalação, incluindo Docker.

Uma vez instalado, 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 você pode ver acima, você tem a opção de enviar cabeçalhos HTTP, duração do teste, limite de taxa, tempo limite e muito mais. Fiz um teste rápido no etechpt.com Tools e aqui está a aparência da saída.

O relatório é interativo e fornece informações detalhadas sobre a latência.

Gobench

Gobench é escrito em linguagem Go e utilitário de teste de carga simples para avaliar o desempenho do servidor web. Ele suporta mais de 20.000 usuários simultâneos, o que o ApacheBench não suporta.

  7 melhores ferramentas de análise de API para criar uma ótima experiência

Apache JMeterName

JMeterGenericName é uma das ferramentas de código aberto mais populares para medir o desempenho de aplicativos da web. JMeter é um aplicativo baseado em java e não apenas um servidor web, mas você pode usá-lo contra PHP, Java. ASP.net, SOAP, REST, etc.

O JMeter tem uma GUI amigável e decente, e a última versão 3.0 requer Java 7 ou superior para iniciar o aplicativo. Você deve experimentar o JMeter se seu objetivo é otimizar o desempenho do aplicativo da web.

trabalhar

trabalhar é outra ferramenta de medição de desempenho moderna para colocar uma carga em seu servidor web e fornecer detalhes de latência, solicitação por segundo, transferência por segundo, etc.

Com wrk, você pode especificar a execução de um teste de carga com vários encadeamentos.

Vamos dar um exemplo de execução de um teste por 5 minutos com 500 usuários simultâneos com 8 threads.

wrk –t8 –c500 -d300s http://localhost

canhão automático

Inspirado pelo trabalho, canhão automático é escrito em Node.js. Você pode usá-lo programaticamente, por meio de API ou utilitário autônomo. Tudo o que você precisa é o NodeJS instalado como pré-requisito.

Você pode controlar várias conexões, solicitações, duração, trabalhadores, tempo limite, taxa de conexão e oferecer inúmeras opções para comparar seus aplicativos da web.

carregador de cachos

carregador de cachos é escrito em C para simular o carregamento do aplicativo e oferece suporte a SSL/TLS. Juntamente com o teste de página da web, você também pode usar esta ferramenta de código aberto para carregar servidores FTP.

Você pode criar um plano de teste com uma combinação de HTTP, HTTPS, FTP e FTPS em uma única configuração de lote.

httperf

o httperf é uma ferramenta de alto desempenho que se concentra em benchmarks de nível micro e macro. Suporta os protocolos HTTP/1.1 e SSL.

Se você tiver o número esperado de usuários simultâneos e quiser testar se seu servidor da Web pode atender a várias solicitações, use o seguinte comando.

httperf --server localhost --port 80 --num-conns 1000 --rate 100

O comando acima testará com 100 solicitações por segundo para 1.000 solicitações HTTP.

Tsung

Tsung é uma ferramenta de teste de estresse distribuído multiprotocolo para enfatizar servidores HTTP, SOAP, PostgreSQL, LDAP, XAMP e MySQL. Ele suporta HTTP/1.0, HTTP/1.1 e os cookies são gerenciados automaticamente.

Gerar um relatório é viável com Tsung.

Conclusão

Espero que as ferramentas de benchmarking acima lhe dêem uma ideia sobre o desempenho do seu servidor web e decida o que funciona melhor para o seu projeto.

Em seguida, não se esqueça de monitorar o desempenho do seu site.