Medindo o desempenho de aplicações Web – Parte 2

No artigo anterior, vimos o que é um teste de carga, teste de stress e teste de não regressão de performance. Além disso vimos qual a importância de realizar testes de desempenho para garantir o bom funcionamento da aplicação web, e o quanto se perde em tempo (e dinheiro) tendo um site lento.

Nesse artigo veremos como um teste de carga poderá nos ajudar a descobrir o quão performática nossa aplicação e quais são os passos para planejar e executar um teste de carga.

Imagine que após uma campanha de marketing, seu e-commerce passa a receber um pico de visitas e no lugar de as vendas irem às alturas, elas caem drasticamente.

Como isso é possível, se estou recebendo mais visitas, por que faturo menos?

1_

Simples, porque com picos de acessos, seu site sofre com indisponibilidades, timeouts e por consequência pode ficar fora do ar durante os acessos. uma boa analogia seria o transito de São Paulo na hora do rush, com todos no mesmo lugar ao mesmo tempo, e tudo completamente travado.

Um bom exemplo foi o que ocorreu  durante as Olimpíadas de Londres em 2012, onde o site oficial demorava quase 1 minuto para completar seu carregamento. Ou até mesmo durante o BlackFriday quando as maiores redes de e-commerce simplesmente não aguentaram o pico de usuários ficando fora do ar, causando inúmeros processos além de virar motivo de piada em redes sociais.

Se você soubesse o quanto sua aplicação suporta, você poderia adotar soluções como: escalar os servidores por quantidade de requisições, Configurar melhor o seu CDN, criar salas de espera e reduzir a concorrência de requisições, etc; Dessa forma se antecipando aos problemas em ambiente de produção.

No entanto, esse tipo de informação só é obtida com a realização de testes de carga e desempenho.

Como planejar e executar seu teste de carga?

O teste de carga deve ser planejado de em fases:

01 – Identifique o ambiente de execução.

Importante saber onde os testes serão executados, para se ter uma ideia de quão abrangente serão os cenários de teste e quais ferramentas poderão ser utilizadas. Por exemplo, os testes poderão ser executados em um ambiente isolado como uma rede interna(VLAN), sem acesso externo a internet, ou o próprio ambiente de produção (sim, parece loucura, mas é comum ver testes de carga planejados e executados em ambiente de produção)

02 – Identifique os critérios de desempenho aceitáveis

Primeiramente saiba qual é a condição atual da aplicação, qual seu volume de usuários atual, o que pode ser considerado um tempo de resposta aceitável ou não para cada parte da aplicação de acordo com a regra de negócio (em geral tempos de respostas acima de 1 segundo por requisição são considerados altos).

03 - Identifique os cenários de teste

Defina até onde irá o teste. Por exemplo, se estamos falando de uma loja virtual, o teste vai até a efetivação da compra ou apenas pesquisando itens no catálogo? Quais são os pontos críticos atualmente da aplicação? O que costuma dar mais problema ou qual é maior fonte de reclamação dos usuários.

04 - Identifique os níveis de carga de teste

Defina qual o limite do teste. 10 Mil usuários simultâneos? 50 mil? 100 mil? Qual o Rampup? Essa definição será fundamental para você escolher a sua ferramenta de Carga.

05 – Identifique as ferramentas

Esse é o momento fundamental. Existem dezenas de ferramentas capazes de executar testes de carga, cada uma com sua particularidade, umas com bons pontos na qualidade dos relatórios de analise, outras melhores em relação a quantidade de carga (user load)

06 – Crie os scripts de teste

Baseado nos seus cenários (passo 03), crie seus scripts na ferramenta escolhida (no nosso caso exemplificaremos usando o Apache Jmeter).

07 – Execute os testes

Exporte e execute os scripts na nuvem (utilizaremos o BlazeMeter), nessa fase você irá se basear nas definições do níveis de carga de teste (passo 04).

08 – Analise os resultados

Exporte e execute os scripts na nuvem (utilizaremos o BlazeMeter), nessa fase você irá se basear nas definições dos níveis de carga de teste (passo 04).

*Provavelmente você terá que executar em loop os passos 6 e 7 algumas vezes antes de ter o resultado desejado

Quais os critérios para escolher a ferramenta adequada?

1. Defina as necessidades do projeto.

2. Compare as suas necessidades com as ferramentas disponíveis.

3. Veja o custo ($) da ferramenta.

4.  Veja a integração entre as ferramentas que foram escolhidas.

5. Veja a qualidade dos relatórios finais.

Quais as ferramentas disponíveis?

Existem três tipo de ferramentas quando se pensa em teste de carga:  Ferramentas de script de teste de carga Desktop, Ferramentas de teste de carga como um serviço (cloud), Ferramentas de monitoramento de recursos (analise do comportamento do servidor).

Ferramentas de script de teste de carga Desktop

•  Apache JMeter

•  Bees with Machine Guns

•  Gatling

•   HttpPerf

•  LoadImpact

•  LoadRunner

•  Loadster

•  Loadstorm

•  LoadUI

•  MultiMechanize

•  NeoLoad

•  OpenSTA

•  QEngine (ManageEngine)

•  Rational Performance Tester

•  Siege

•  Testing Anywhere

•  WAPT

•  WebLOAD

Ferramentas de teste de carga como um serviço (cloud)

•  Apica Load Test

•  Blazemeter

•  Blitz.io

•  CloudTest

•  Soasta

Ferramentas de monitoramento de recursos (hardware)

• AppDynamics

•  NewRelic

Quais ferramentas escolher?

Após definir os critérios de escolha das ferramentas, deve-se atentar para um ponto fundamental para a qualidade dos relatórios, portanto escolhendo as ferramentas com maior Integração.

Então, nosso time de ferramentas escolhido nesse post foi:

Criação de volta testadoExecuções de volta testadoAnalise fazer hardware
2_3_4_

Jmeter é a ferramenta mais usada para criação e execução dos scripts de testes de carga no mundo opensource. Considerando que os cenários serão  criados no Jmeter, a melhor escolha em termos de integração e execução desses scripts na nuvem é sem duvida o BlazeMeter, que por sua vez, além de relatórios ricos em detalhes ainda oferece integração com o New Relic, que como um “detetive” será responsável pelo monitoramento dos servidores de dados e de aplicação, incrementando os gráficos e relatórios com dados de utilização do hardware do servidor.

Dessa forma, temos três ferramentas que se integram para fornecer uma visão analítica completa sobre os resultados dos testes de carga.

5_

Um pouco mais sobre as ferramentas mencionadas

Apache Jmeter :

ResponsávelApache
WebSitehttp://jmeter.apache.org/
Ultima Versão2.10 (Dezembro de 2013)
LicençaApache 2.0
PlataformaJVM 1.6 +
Protocolos testadosHTTP, SOAP, JDBC, LDAP, JMS, SMTP, POP3, IMAP,
Injeção1 conexão por usuário virtual
Entradas/SaídasSíncronas
ConfiabilidadeO injetor é instável porque atinge rapidamente as limitações da JVM.Número de threads permite uma simulação de requisições realistas em páginas HTML.
Cenários de gravaçãoFuncionalidade "HTTP Proxy Server”, captura de HTTP entre a máquina e a rede para gerar scripts. Gerenciamento dinâmico de cabeçalhos HTTP tem a vantagem de exigir pouca manutenção.
Cenários de escrita e de manutençãoXML ou CSV - Exemplo
Scripts detalhados e difíceis de manter e evoluir.
AutomaçãoPossui um plug-in chamado Maven, que permite a execução de scripts (Este plugin de terceiros não é um projeto da Apache Software Foundation).
RelatóriosRelatórios nativos são fracos se comparados a outras ferramentas, no entanto o “LGPL” oferece mais gráficos, Muitos recursos de relatórios através de extensões, em plugins como: Jenkins, Hudson, Sonar, TeamCity

Posso utilizar apenas o Jmeter?

Já vimos que podemos utilizar o Jmeter pra criar, executar e analisar os resultados, então, por que utilizar uma outra ferramenta na nuvem pra executar e analisar os resultados, se poderíamos fazer os testes a partir de um simples desktop?

Simples, imagine que você está testando uma grande loja virtual, certamente ela terá mecanismos de defesa ante-hacker ou algum tipo de defesa contra ataques do tipo “DDoS ATTACK” (Distributed Denial-of-Service ATTACK ou “Ataque de negação de serviço”), o que significa que quando seu teste via Jmeter começar, vocês estará usando um mesmo IP para realizar as requisições ao servidor, e logicamente será facilmente reconhecido e bloqueado pelas ferramentas de proteção.

No entanto ao utilizar uma ferramenta de teste de carga na nuvem, ela instancia diversas máquinas (que criam outras maquinas virtuais) que por sua vez realizam requisições http para o endereço especificado. Fazendo uma analogia simples, usando uma ferramenta de teste de carga desktop, você será um soldado no meio de uma batalha, com uma metralhadora, disparando contra seu alvo, se for localizado, será neutralizado. Enquanto se utilizar uma ferramenta de teste de carga na nuvem, você comandará um exercito de metralhadoras, todas espalhadas em diversos pontos, disparando em um mesmo alvo.

6_

BlazeMeter: Aplicativo Web, pago sob demanda de uso, que fornece uma integração simples aos scripts Jmeter para testes de cargas, simulando milhares de usuários visitando um site simultaneamente usando o Amazon Elastic Compute Cloud (EC2) como serviço para execução dos testes.

NewRelic :

7_

É uma solução SaaS  que permite monitorar aplicações Web. A idéia é bem simples, existe um agente que coleta os dados de performance e envia isto assincronamente para um servidor da New Relic, exibindo assim uma espécie de raio-x sua aplicação, com informações de CPU, memória, tempo de resposta, throughtput, número de requisições, erros, transações mais lentas, uso do banco de dados, jvm em real time.

Exemplos de relatórios criados

Tempo de resposta por rampup.8_
Tempo de resposta por picos de usuários.9_
Monitoramento Web10_
Monitoramento de hardware.11_

Conclusão

12_

Apesar foco em velocidade ser uma prática antiga dos gigantes da internet, hoje as empresas começam a observar que seus clientes querem além de tudo desempenho na navegação, no entanto a relação entre quantidade de usuários e tempo de resposta é por vezes exponencial, ou seja, depois de um ponto, quanto mais usuários sua aplicação possui, mais tempo ele levará para carregar, assim criando novos desafios para quem deseja se tornar grande na web.

Uma boa estratégia para se manter sempre um passo a frente, é utilizar técnicas de testes de desempenho, a fim de descobrir o comportamento da aplicação durante um pico de uso, além de descobrir os gargalos e, obviamente, o limite de acessos.

Quem quer se tornar grande na internet, deve priorizar a realização de testes de desempenho. Afinal, tempo é dinheiro, e com tantas opções disponíveis ninguém mais está disposto a perder tempo.

Realizar testes de carga com frequência permite acompanhar a evolução da aplicação a cada release, e medir se houve regressão de desempenho entre supostas melhorias no site. Mas isso já é assunto pro proximo post =)