Como fazer um Benchmark de aplicações HTTP
Trabalho a 7 anos para um cliente com um banco de dados já bem ultrapassado, poucas pessoas conhecem ele, é o ZIM, e por ser bem antigo ele não possui nenhuma feature nativa para conexão com linguagens WEB, sendo assim, eu com mais um colega de trabalho que é desenvolvedor ZIM desenvolvemos conector PHP 2 ZIM para poder trabalhar, mas este conector trabalha com algumas limitações que ocasionalmente demandam um pouco mais de tempo de desenvolvimento, mas em momento nenhum impedem o desenvolvimento….
Tentando melhorar esta plataforma desenvolvi um “driver ODBC para ZIM” que tirou todas as limitações de comando no banco (ele não tirou a limitação de telas, mas nem é preciso, afinal de contas quem vai trabalhar com as telas é o HTML com PHP), ficou a coisa mais linda do mundo mas antes de sair implementando com esta nova ferramenta resolvi fazer um benchmark de um algoritmo rodando no sistema antigo e no sistema novo para ajudar na escolha de implementação.
Legal… mas como fazer um benchmark de aplicações HTTP?
Pesquisando encontrei três ferramentas:
- httperf
Ferramenta capas de fazer tudo a partir de simples requisições para simular clientes, disponível em:http://www.hpl.hp.com/personal/David_Mosberger/httperf.html - Apache Bench
Ferramente simples de benchmarking, distribuida com o servidor web Apache. - Autobench
É um script Perl script para automatizar uma série de testes no httperf em todo o servidor (um uma parte do servidor). Ele faz um “parse” na saída do httperf conseguindo exportas os dados para documentos CSV ou até mesmo gráficos. Disponível em:http://www.xenoclast.org/autobench/
A ferramenta chamada “ab” ou Apache HTTP server benchmarking tool, é uma simples e excelente ferramenta, consultando o manual(”man ab”) dá para incrementar o benchmark, mas basicamente dá para fazer assim:
ab -n [número de requisições] -c [número de conexões concorrentes] [http://site]
Exemplo:
[root@server ~]# ab -n 100 -c 5 http://www.google.com.br/This is ApacheBench,
Version 2.0.41-dev <$Revision: 1.141 $> apache-2.0
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 1998-2002 The Apache Software Foundation,
http://www.apache.org/Benchmarking www.google.com.br (be patient)…..done
Server Software: gws
Server Hostname: www.google.com.br
Server Port: 80
Document Path: /
Document Length: 2976 bytes
Concurrency Level: 5
Time taken for tests: 8.54946 seconds
Complete requests: 100
Failed requests: 16
(Connect: 0, Length: 16, Exceptions: 0)
Write errors: 0
Total transferred: 328742 bytes
HTML transferred: 297542 bytes
Requests per second: 12.41 [#/sec] (mean)
Time per request: 402.747 [ms] (mean)
Time per request: 80.549 [ms] (mean, across all concurrent requests)
Transfer rate: 39.85 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 161 170 7.3 172 196
Processing: 190 224 59.2 207 613
Waiting: 166 199 58.9 183 589
Total: 352 394 59.7 380 774
Percentage of the requests served within a certain time (ms)
50% 380
66% 384
75% 395
80% 400
90% 417
95% 532
98% 680
99% 774
100% 774 (longest request)
[root@server ~]#
HTTPERF
httperf [--burst-length N] [--client I/N] [--close-with-
reset] [-d|--debug N] [--failure-status N] [-h|--help]
[--hog] [--http-version S] [--num-calls N] [--num-conns N]
[--port N] [--rate X] [--recv-buffer N] [--send-buffer N]
[--server S] [--think-timeout X] [--timeout X] [--uri S]
[-v|--verbose] [-V|--version] [--wlog y|n,F] [--wsess
N,N,X] [--wset N,X]
Manual: http://www.hpl.hp.com/research/linux/httperf/httperf-man.txt
AUTOBENCH
O autobench pode ser executado desta forma:
autobench --single_host --host1 www.test.com --uri1 /10K --quiet
--low_rate 20 --high_rate 200 --rate_step 20 --num_call 10
--num_conn 5000 --timeout 5 --file resultado.tsv
O resultado deste comuando vai ser o arquivo resultado.tsv:
---------------------- dem_req_rate req_rate_testhost con_rate_testhost min_rep_rate_testhost avg_rep_rate_testhost max_rep_rate_testhost stddev_rep_rate_testhost resp_time_testhost net_io_testhost errors_testhost 200 199.3 19.9 182.0 199.7 200.6 2.6 90.0 243.7 0 300 298.4 29.8 273.8 299.2 300.6 4.6 90.0 364.9 0 400 397.2 39.7 364.7 398.6 401.8 7.1 90.1 485.7 0 500 495.7 49.6 454.9 497.8 501.8 10.1 90.1 606.0 0 600 593.7 59.4 546.0 596.7 601.8 13.6 90.1 725.9 0 700 691.5 69.1 637.6 695.6 700.2 16.7 90.1 845.5 0 800 788.8 78.9 728.6 794.1 802.8 20.7 90.1 964.4 0 900 885.9 88.6 819.5 892.8 900.4 24.3 90.2 1083.2 0 1000 982.5 98.3 910.6 991.1 1008.2 28.8 90.2 1201.3 0 1100 1078.8 107.9 1001.7 1089.1 1101.2 32.8 90.2 1319.0 0 1200 1175.0 117.5 1092.6 1186.5 1200.4 38.0 90.5 1436.6 0 1300 1270.4 127.0 1182.5 1283.1 1312.3 44.9 90.6 1553.3 0 1400 1365.8 136.6 1273.3 1381.7 1401.1 47.8 91.4 1669.9 0 1500 1459.3 145.9 1341.9 1474.6 1505.1 65.1 100.8 1784.2 0 1600 1549.5 155.0 1414.9 1561.9 1607.7 72.6 124.2 1894.5 0 1700 1619.9 162.0 1443.8 1628.7 1726.8 96.6 212.4 1980.6 0 1800 1580.3 158.3 1478.3 1656.2 1757.1 100.2 282.6 1932.2 0.016025641025641 1900 1636.8 165.6 1481.0 1646.9 1759.6 118.4 300.1 2001.2 0.115314586283633 ---------------------- 2000 1641.5 173.0 1502.6 1659.1 1741.4 94.3 312.5 2006.9 0.53740779768177
Um exemplo de gráfico gerado pelo autobench:
Agora com o tempo de execução eu cheguei a conclusão que a nova versão precisa de melhorias na performance, pois a antiga ainda está ganhando
Abraços,
Fernando Costa
Fontes:
http://www.xenoclast.org/autobench/
http://www.hpl.hp.com/research/linux/httperf/
http://www.apache.org/
setembro 18th, 2007 at 20:35:41
[...] Fernando Costa » Como fazer um Benchmark de aplicações HTTP Uma experiência com ferramentas de benchmark em HTTP (tags: HTTP Tools CapacityPlaning) Converta este post para pdf. [...]
setembro 24th, 2008 at 16:37:58
E ai Fernando!!! Também sou desenvolvedor ZIM e enfrento problemas com o ODBC nativo, pois utilizamos a versão 4.2 e a mesma não dá suporte ao Zim Integrated Server, para usarmos o ODBC, como você resolveu este problema? O seu ODBC roda em qq versão? Existe a possibilidade de compartilhar o conhecimento? Vlw!!!