Benchmarking Tools

4,289 views
4,176 views

Published on

Ferramentas para testes de carga, com foco no JMeter.

Published in: Technology
0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,289
On SlideShare
0
From Embeds
0
Number of Embeds
107
Actions
Shares
0
Downloads
0
Comments
0
Likes
7
Embeds 0
No embeds

No notes for slide







  • Regra básica.
  • Teste simples do contexto raiz da aplicação.
  • Programação em BASH do teste de carga.




































  • Vejamos agora como trabalhar com aplicações que mantém estado de execução.
  • Em nossa aplicação exemplo, há 3 JSPs e 1 Servlet que se interagem da seguinte forma.
  • Então, o usuário acessa o primeiro JSP pelo browser, preenche seu nome e clica OK, que gera um requisição para a Servlet que recebe o nome preenchido e armazena-o na sessão do usuário, devolvendo-lhe um segundo JSP. Neste JSP, o usuário seleciona algum link, que o leva a um terceiro JSP, que recupera da sessão o nome preenchido na primeira página.
  • O primeiro teste é trivial. Só criar um Sampler com a URL raiz da aplicação web.

  • O teste da chamada da Servlet deve simular o envio do parâmetro pela página index.jsp

  • O teste da página funcionalidade1.jsp deve fazê-la recuperar o atributo ‘nome’ da sessão do usuário.


  • Perceba que o parâmetro nome foi recebido pela requisição e incluído no resultado do JSP.

  • No primeiro teste, um identificador de sessão de usuário é criado.
  • Mas no segundo teste, um outro identificador de sessão é criado.
  • E na terceira requisição, outro JSESSIONID é criado! (:-O
    Ou seja, não está havendo o controle desses JSESSIONID para que a sessão do usuário seja mantida.
  • Geralmente, JSESSIONIDs são armazenados em cookie, nativamente suportados em web browsers, mas não no JMeter.












  • Usaremos uma simples aplicaçãõ JSF que simula um sistema de busca.
  • A cada pesquisa realizada retorna um resultado que é armazenado em um cache do servidor.
  • O cache cresce a cada nova pesquisa, simulando um Memory Leak.
  • 1. Clique no link “Memory Leak” para apresentação da página memoryleak.jsp
    2. Chamada à página memoryleak.jsp
    3. Clique no botão “Buscar”
    4. Execução da “regra” de busca, com persistência dos dados recuperados no cache (5)
    ...



  • Simulação do clique no link da página index.jsp para abertura da página memoryleak.jsp onde serão feitas as pesquisas.
  • Resultado do teste.
    Página memoryleak.jsp aberta.

  • Clique no botão de pesquisa.
  • Campos HTML gerados por páginas JSF têm nomeclatura estranha.
  • Outros campos, tem conteúdo mais estranho ainda.
    Seus valores são definidos em tempo de execução, o que torna inviável a criação de scripts de testes.
  • O ideal é descobrir esses valores dinâmicos em tempo de execução e utilizá-los para alimentar as configurações do script de testes.
  • Após a primeira requisição, capture o valor da expressão regular “(.+?)” retornado e guarde-o na variável jsfViewState.
  • O pós-processamento ocorre após a primeira requisição
  • Requisição para teste da funcionalidade de busca. Perceba o conjunto de parâmetros para simulação do preenchimento do formulário.
  • A forma mais fácil de se configurar samplers para o teste de JSF é gerando-os automaticamente a partir da dupla Recording Controller e HTTP Proxy Server.
  • A forma mais fácil de se configurar samplers para o teste de JSF é gerando-os automaticamente a partir da dupla Recording Controller e HTTP Proxy Server.







  • Configure o browser para utilizar o HTTP Proxy Server do JMeter e execute a aplicação pelo navegador.
  • Ao final da execução via browser, finalize o HTTP Proxy Server e verifique os Samplers criados sob o Recording Controller.


  • HTTP Sampler gerado para simulação da funcionalidade de busca, que é o que nos mais interessa, pela complexidade dos campos gerados pelo JSF.
  • Finalizado o teste:
    - Remova os samplers que não forem interessantes para o TestSuite
    - Reposicione os samplers interessantes no TestSuite
    - Substitua valores fixos por variáveis, se necessário (e.g. ${jsfViewState})
    - Apague Recording Controller e HTTP Proxy Server (opcional)




  • Cada requisição está criando uma sessão de usuário diferente.
  • Cada requisição está criando uma sessão de usuário diferente.

  • Após o HTTP Cookie Manager, a primeira requisição cria a sessão do usuário e a segunda reutiliza-a.


  • Incrementar o número de threads para a suite não provocará o estouro de memória.
  • Cada thread está criando uma nova sessão. Ainda não é isso que queremos. Queremos executar a busca várias vezes dentro de uma mesma sessão, para que haja o acúmulo de memória através do crescimento do cache simulado.
  • O controlador Loop Controller possibilita a iteração de um conjunto de Samplers.
  • Para cada requisição à página memoryleak.jsp, duas requisições de busca serão executadas.
  • Para melhor legibilidade, demos nomes significativos pra cada Sampler.
  • - Para cada requisição à página de abertura do sistema, duas simulações de busca foram executadas.
    - As duas requisições à página de abertura foram configuradas no Thread Group. Cada thread criou uma JSESSIONID própria. É como se fossem dois usuários distintos.
    - As duas simulações de busca foram configuradas no Loop Controller. Ambas as simulações utilizam a mesma sessão da thread.
  • Cada par de simulação de busca utiliza a sessão de uma thread.
  • E com isso, conseguimos automatizar a simulação do memory leak.


  • - Após a primeira requisição, o ViewState é criado.
    - Nas requisições subsequentes, o ViewState deve ser reenviado para correta manutenção de estado dos componentes JSF
  • Então, no JSF, funciona assim... (explicar)
    Só que o valor obtido na primeira resposta deve ser exatamemente o valor utilizado nas reqs posteriores.
    Logo, sempre teremos que executar a primeira requisição, aguardar a resposta, coletar manualmente o valor gerado e informá-los nos samplers seguintes, o que acaba gerando um grande desperdício de tempo no processo de testes.
  • Então, no JSF, funciona assim... (explicar)
    Só que o valor obtido na primeira resposta deve ser exatamemente o valor utilizado nas reqs posteriores.
    Logo, sempre teremos que executar a primeira requisição, aguardar a resposta, coletar manualmente o valor gerado e informá-los nos samplers seguintes, o que acaba gerando um grande desperdício de tempo no processo de testes.
  • Então, no JSF, funciona assim... (explicar)
    Só que o valor obtido na primeira resposta deve ser exatamemente o valor utilizado nas reqs posteriores.
    Logo, sempre teremos que executar a primeira requisição, aguardar a resposta, coletar manualmente o valor gerado e informá-los nos samplers seguintes, o que acaba gerando um grande desperdício de tempo no processo de testes.
  • Então, no JSF, funciona assim... (explicar)
    Só que o valor obtido na primeira resposta deve ser exatamemente o valor utilizado nas reqs posteriores.
    Logo, sempre teremos que executar a primeira requisição, aguardar a resposta, coletar manualmente o valor gerado e informá-los nos samplers seguintes, o que acaba gerando um grande desperdício de tempo no processo de testes.
  • Então, no JSF, funciona assim... (explicar)
    Só que o valor obtido na primeira resposta deve ser exatamemente o valor utilizado nas reqs posteriores.
    Logo, sempre teremos que executar a primeira requisição, aguardar a resposta, coletar manualmente o valor gerado e informá-los nos samplers seguintes, o que acaba gerando um grande desperdício de tempo no processo de testes.
  • - Pra ficar mais dinâmico, a gente captura o valor em tempo de execução, logo após a primeira requisição, guarda-o em uma variável e o reutiliza nas próximas requisições.
  • Como eu soube que esses eram os dados a serem enviados pelo JMeter?
  • Ora, eu entrei na página...
  • ...e vi o código fonte.




  • Na prática, isso funciona da seguinte forma:
  • Na verdade, este proxy é um elemento do JMeter e tem o nome de HTTP Proxy Server.

  • 1a parte: buscador.war
    2a parte: aplicação real









  • Página principal do Tomcat contém a mensagem “Thanks for using Tomcat!”
  • - Deseja-se que toda resposta de HTTP Request contenha a string “Thanks for using Tomcoat”
    - A string não é encontrada na resposta e o teste falha.
  • - Deseja-se que toda resposta de HTTP Request contenha a string “Thanks for using Tomcat”
    - Teste bem sucedido!
  • [ToDo] Detalhar?





  • Chega uma hora que o jmeter não consegue gerar a carga de requisições desejada.
  • Nesses casos, é necessário pedir ajuda.
  • Com o jmeter, é possível executar testes distribuídos.





  • - Não deixem de conferir a documentação.
    - Teste banco, FTP, ldap, webservice, JMS....











  • Benchmarking Tools

    1. 1. JBoss Tuning Ferramentas de Benchmarking
    2. 2. 2
    3. 3. Objetivo Conhecer as principais ferramentas para simulação de carga em aplicacões web 3
    4. 4. Cobaias Exemplo de aplicativo sem manutencão de estado Aplicações que serão usadas para demonstração das ferramentas de benchmarking 4
    5. 5. Cobaias Exemplo de aplicativo com manutencão de estado tela de login menu principal funcionalidade qualquer 5
    6. 6. netcat 6
    7. 7. 7
    8. 8. echo -e "GET / HTTP/1.0nn" | nc 127.0.0.1 8080 8
    9. 9. $ echo -e "GET /VerySimpleStatelessWebApp/ HTTP/1.0nn" | nc 127.0.0.1 8080 HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=52D81F441BABD06C80806B67150E137E; Path=/ VerySimpleStatelessWebApp Content-Type: text/html Content-Length: 53 Date: Thu, 30 Apr 2009 14:07:38 GMT Connection: close <html> <body> <h2>Hello World!</h2> </body> </html> 9
    10. 10. for ((i = 1; i <= 10; i++)) do echo "---------------------------------" echo -e "GET /VerySimpleStatelessWebApp/ HTTP/1.0nn" | nc 127.0.0.1 8080 done 10
    11. 11. Apache Benchmarking ab ‟ ab is a tool for benchmarking your Apache Hypertext Transfer Protocol (HTTP) server. It is designed to give you an impression of how your current Apache installation performs.This especially shows you how many requests per second your Apache installation is capable of serving. http://httpd.apache.org/docs/2.0/programs/ab.html 11
    12. 12. 12
    13. 13. 13
    14. 14. 14
    15. 15. 10 requisições enviadas por 1 thread (10 req/th) ao aplicativo stateless 15
    16. 16. 1 requisição enviada por 10 threads (0.1 req/th) ao aplicativo stateless o.O 16
    17. 17. 10 requisições enviadas por 10 threads (1 req/th) ao aplicativo stateless :-) 17
    18. 18. Resultado em HTML 18
    19. 19. Resultado em HTML 19
    20. 20. Log a cada requisição, uma mensagem é impressa Página principal do aplicativo stateful 20
    21. 21. Simulação da operacão de login do aplicativo stateful 21
    22. 22. Simulação de acesso à funcionalidade 1 do aplicativo stateful 22
    23. 23. Nível 1 de verbosidade 23
    24. 24. Nível 2 de verbosidade - cabeçalho da requisição HTTP - 24
    25. 25. Nível 1 de verbosidade - códigos de resposta HTTP - 25
    26. 26. Nível 4 de verbosidade - corpo da resposta HTTP - 26
    27. 27. Atributo ‘nome’ não sendo pego da sessão do usuário 27
    28. 28. Cada requisição está tentando criar uma nova sessão 28
    29. 29. ? Como armazenar o cookie JSESSIONID para utilizar sempre a mesma sessão do usuário no servidor? 29
    30. 30. #fail Com o ‘ab’, isso não é possível :-( Mas com um pouco de script, sim ;-) 30
    31. 31. Usar netcat e ab para teste de aplicações web stateless e stateful. Verifique a limitação com sistemas stateful. 31
    32. 32. Apache JMeter ‟ Apache JMeter is a 100% pure Java desktop application designed to load test functional behavior and measure performance. It was originally designed for testing Web Applications but has since expanded to other test functions. http://jakarta.apache.org/jmeter/ 32
    33. 33. Stateless 33
    34. 34. Pivô de tudo GUI Java simples 34
    35. 35. Dar nome ao plano de teste 35
    36. 36. Definir o conjunto de threads que executará o plano de teste 10 threads que devem ser, todas, iniciadas em 5 segundos 36
    37. 37. Definir o tipo de requisições que serão feitas pelas threads criadas Vamos gerar requisições HTTP 37
    38. 38. Endereço do Servidor HTTP HTTP Request Sampler Porta do Servidor HTTP Método de acesso Nome do contexto ao Servidor HTTP da aplicação Sampler para http://localhost:8080/VerySimpleStatelessWebApp 38
    39. 39. Iniciar a execução do plano de teste Log do servidor durante a execução do plano de teste 10 requisições à pagina index.jsp 39
    40. 40. Coleta informacões durante a execução do plano de teste Apresenta os resultados dos testes em uma árvore Para ver o resultado dos testes 40
    41. 41. 10 requisições 41
    42. 42. View Results Tree Listener 42
    43. 43. View Results Tree Listener 43
    44. 44. JUnit revisão • Test Plan - Base de toda a execução • Thread Group - Conjunto de threads responsáveis pela carga • Sampler - Tipo de requisições que serão enviadas pelo Thread Group • Listener - Coleta informações durante a execução do Test Plan 44
    45. 45. Usar JMeter para teste de aplicações web stateless. Compreenda seus principais conceitos. 45
    46. 46. Stateful 46
    47. 47. VerySimpleStatefulWebApp tela de login menu principal funcionalidade qualquer 47
    48. 48. VerySimpleStatefulWebApp HTTPSession nome=”Alexandre” 7 3 index.jsp 2 AutenticacaoServlet 4 main.jsp funcionalidade1.jsp 1 6 5 8 48
    49. 49. VerySimpleStatefulWebApp tela de login menu principal funcionalidade qualquer 49
    50. 50. VerySimpleStatefulWebApp HTTPSession nome=”Alexandre” 7 3 index.jsp 2 AutenticacaoServlet 4 main.jsp funcionalidade1.jsp 1 6 5 8 50
    51. 51. VerySimpleStatefulWebApp index.jsp 51
    52. 52. VerySimpleStatefulWebApp HTTPSession nome=”Alexandre” 7 3 index.jsp 2 AutenticacaoServlet 4 main.jsp funcionalidade1.jsp 1 6 5 8 52
    53. 53. VerySimpleStatefulWebApp AutenticacaoServlet Parâmetro que será enviado pela requisição até a Servlet de Servlet de autenticação Autenticação e então disponibilizado na sessão do usuário 53
    54. 54. VerySimpleStatefulWebApp HTTPSession nome=”Alexandre” 7 3 index.jsp 2 AutenticacaoServlet 4 main.jsp funcionalidade1.jsp 1 6 5 8 54
    55. 55. VerySimpleStatefulWebApp funcionalidade1.jsp Deve recuperar atributo ‘nome’ da sessão do usuário 55
    56. 56. Resultado do teste Resultado do teste da index.jsp VerySimpleStatefulWebApp - Tela de Autenticacão - 56
    57. 57. main.jsp gerado após invocação da Servlet de Autenticação. VerySimpleStatefulWebApp - Menu principal - 57
    58. 58. null Resultado do teste de funcionalidade1.jsp VerySimpleStatefulWebApp - Funcionalidade 1 - 58
    59. 59. Um sessão sendo criada pra cada requisição JSESSIONID=8287.... 59
    60. 60. Um sessão sendo criada pra cada requisição JSESSIONID=126A... 60
    61. 61. Um sessão sendo criada pra cada requisição JSESSIONID=58FC... 61
    62. 62. O JSESSIONID era pra ser armazenado em um cookie no cliente, mas o cliente não sabia como fazer isso. 62
    63. 63. Atributo recuperado da sessão HTTP Cookie Manager Agora sim 63
    64. 64. sem set-cookie na resposta 64
    65. 65. Usar JMeter para teste de aplicações web stateful. Sinta na pele o problema da manutenção de estado. 65
    66. 66. Nosso teste sempre envia os mesmos parâmetros 66
    67. 67. Nossos testes não estão tão realistas.... Alexandre Alexandre WebApp Alexandre Alexandre 67
    68. 68. Na prática, N usuário diferentes farão o acesso Alexandre Túlio WebApp Luciana Lula 68
    69. 69. $ cat nomes.txt Zezinho Huguinho Luizinho Pato Donald 69
    70. 70. CSV Data Set Config 70
    71. 71. CSV Data Set Config Arquivo CSV deve estar no mesmo diretório que o arquivo do teste. Cada campo lido do arquivo será armazenado nesta variável 71
    72. 72. Uso da variávél definida no CSV Data Set Config 72
    73. 73. Reexecutar os testes da aplicação Stateful com um arquivo CSV para variar o usuário enviado. Enriqueça seus testes 73
    74. 74. JSF 74
    75. 75. Buscador 75
    76. 76. Buscador tamanho do cache de resultados no servidor 76
    77. 77. Buscador 77
    78. 78. Buscador StringBuffer CACHE 5 4 index.jsp 2 memoryleak.jsp BuscadorBean.java (JSP) (JSF) 6 (JAVA) 3 1 7 78
    79. 79. Buscador index.jsp → memoryleak.jsp 79
    80. 80. Buscador index.jsp → memoryleak.jsp StringBuffer CACHE 5 4 index.jsp 2 memoryleak.jsp BuscadorBean.java (JSP) (JSF) 6 (JAVA) 3 1 7 80
    81. 81. Buscador index.jsp → memoryleak.jsp 81
    82. 82. Buscador index.jsp → memoryleak.jsp 82
    83. 83. Buscador Simulação da busca 83
    84. 84. Buscador StringBuffer CACHE 5 4 index.jsp 2 memoryleak.jsp BuscadorBean.java (JSP) (JSF) 6 (JAVA) 3 1 7 84
    85. 85. Buscador memoryleak.jsp Critério da busca: <input id="j_id_jsp_841419806_1:criterio" type="text" name="j_id_jsp_841419806_1:criterio" /> <input type="submit" name="j_id_jsp_841419806_1:j_id_jsp_841419806_3" value="Buscar" /> 85
    86. 86. Buscador memoryleak.jsp input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="H4sIAAAAAAAAAJ1WS2wbRRgeb55NSx9JSHkoVUKrJqHx2o6TKCWp0rzjyIlRnATaSrhjexJvut4dZmezm0ZUKRJUogK1Ag5IQV SAxKW9wAU48BAHpEpFIhIcOKAKISEkygFVKnAAZtbeXT/WpDCH8az3n+9/ff//7/ U7oEYnoOlMdBWuQVGGyooYS66iFB288tXTb3XumQBABMDAGo1AsIpNStquiIuwxTSRIixLKUglVRFjFNI0SxU4AoikSyWjywQhObUNLq7 /PEnN4JTn+7hOMYQ4KuNazPzKAwTqwpSqLgYWZKQMa+qFDSvJqR0YlXDiYHeUG/oECwPxE0tWfBBSAYwxbIYW +QDM3K4jTbJlWS9cQJ2TgDDMUHOnfAiShYpwvIpKA +RSSKiKTaANMWQPcOAGNqNguV9KhOqap4WhS2AScswK4dAGM6tU3yQuv9P2hRSTnnidZn6hyNL8E51bsnRosDFnl0KjFAqGVmIa6p+ +7zL1rOfl0FhEnQIKswPQlTVCURsItmCNIyqpw28fBJC6LWqOdAXAEtpoaBkoxj4lhs9snY3MTcQiIyHmf6mlx9I4TA9aikUfPidusbX8 I3q4AvAqo16TyyWCsY1ZxvFNRw14LeAQuxQB7x0rs4P8+1LkUmnkrMx2IL3OkmE+MK/HRCYdXRqKrKCCq32sjmN1t// ioA32lQswZlnVnmszL0IOBQDdMLs9HE6Eg8MkbBvkAWZVWyzm6eExk8g9zvehtVU1BGF34/cHYr +McvAqiOgPoMi3iK1VkU1KVUXaFknYJGq5wD3IxAnBJJWRmMgnr +qLP65KofZeJrkEhQodajif9miwJhMc42xg8Air2JKBSx0m784dq79y5eGhB4mPPe2CZacnN6NonIi9dfb9392u3LdvOowRg7lPF5EKql gFD8tKeMGz7+917r5T72WFeU2FBBcXonJ5yX7KlQM/nXYe/XfaaJueZGZ2vh20Gac93mDW85zFOW1PaC3hgw/YZh +JfZS79OZKTwdKVx6XIiUO0Rn3bntNc5VbkxwwVXStp5Pv83tpd++rl1Y8rOiI/ m0+emhSX8qHevsJr7NKtZROJwDZFTNz848erWrVkBCFGwKyVDTZuDWZtYDRqTSVt3KGjJUVFSA3GWHChL52FSRoOsiJi6DpWssCkCUxkk rkINIyIiWZzR8BK3bMLErFVoLILw1J3vg80fDvEZQsBDOSOZZImY0bB55vZnf10VLLEmR8yVeOeFl+K/nd4esqJgBIC/ pNw6w6HunmBXW8fhjaSupWBaJaLNq +c6mMXtBRaXG8AHX3to5srb0vMCt5UHZMToBM1ecIVVk5u5GJusE7V6dagn7Gsc8vGKBOQzgVHJeuVuuGx3AXJ/ 4qJLLDf8t22TscJ97yxX0EPMoRPwYPEh51RbwF1WLl2ePnuVMb92rND/xkL/czM2b/8JTrHOShSbRTSjpt3cDe/egN8eJC/ nOPawQ55SufcDNy//eK/3FSGf31HDD46V0ainjEbWgVgkeqyYRKUaOIsuXRv+6Jn37sZsFsWNo6CxHK2cQ1Zcj/ PAcja5qaKgdtS6U5JpXCm3uT5Wq+nJrGTNiJl//Q6o0Ixsa6zuPVjQa/ IJ4j8njT4QLotgf3dPb3EEKWSfURl1XB3jkWOR5JfHDRE8UlmoUpHdN+F6uRJ/cb1M2ZFqcSJVKUCHvAJ0fxPOZ084r4HUzwbSf/ Cij4MGKrYN/vHHs/2AKAYkJY1M6+uwnA8ey633fwD/RBipTAwAAA==" /> 86
    87. 87. Buscador memoryleak.jsp input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="H4sIAAAAAAAAAJ1WS2wbRRgeb55NSx9JSHkoVUKrJqHx2o6TKCWp0rzjyIlRnATaSrhjexJvut4dZmezm0ZUKRJUogK1Ag5IQV SAxKW9wAU48BAHpEpFIhIcOKAKISEkygFVKnAAZtbeXT/WpDCH8az3n+9/ff//7/ U7oEYnoOlMdBWuQVGGyooYS66iFB288tXTb3XumQBABMDAGo1AsIpNStquiIuwxTSRIixLKUglVRFjFNI0SxU4AoikSyWjywQhObUNLq7 /PEnN4JTn+7hOMYQ4KuNazPzKAwTqwpSqLgYWZKQMa+qFDSvJqR0YlXDiYHeUG/oECwPxE0tWfBBSAYwxbIYW É preciso configurar o +QDM3K4jTbJlWS9cQJ2TgDDMUHOnfAiShYpwvIpKA +RSSKiKTaANMWQPcOAGNqNguV9KhOqap4WhS2AScswK4dAGM6tU3yQuv9P2hRSTnnidZn6hyNL8E51bsnRosDFnl0KjFAqGVmIa6p+ +7zL1rOfl0FhEnQIKswPQlTVCURsItmCNIyqpw28fBJC6LWqOdAXAEtpoaBkoxj4lhs9snY3MTcQiIyHmf6mlx9I4TA9aikUfPidusbX8 I3q4AvAqo16TyyWCsY1ZxvFNRw14LeAQuxQB7x0rs4P8+1LkUmnkrMx2IL3OkmE+MK/HRCYdXRqKrKCCq32sjmN1t// teste em runtime! ioA32lQswZlnVnmszL0IOBQDdMLs9HE6Eg8MkbBvkAWZVWyzm6eExk8g9zvehtVU1BGF34/cHYr +McvAqiOgPoMi3iK1VkU1KVUXaFknYJGq5wD3IxAnBJJWRmMgnr +qLP65KofZeJrkEhQodajif9miwJhMc42xg8Air2JKBSx0m784dq79y5eGhB4mPPe2CZacnN6NonIi9dfb9392u3LdvOowRg7lPF5EKql gFD8tKeMGz7+917r5T72WFeU2FBBcXonJ5yX7KlQM/nXYe/XfaaJueZGZ2vh20Gac93mDW85zFOW1PaC3hgw/YZh +JfZS79OZKTwdKVx6XIiUO0Rn3bntNc5VbkxwwVXStp5Pv83tpd++rl1Y8rOiI/ m0+emhSX8qHevsJr7NKtZROJwDZFTNz848erWrVkBCFGwKyVDTZuDWZtYDRqTSVt3KGjJUVFSA3GWHChL52FSRoOsiJi6DpWssCkCUxkk rkINIyIiWZzR8BK3bMLErFVoLILw1J3vg80fDvEZQsBDOSOZZImY0bB55vZnf10VLLEmR8yVeOeFl+K/nd4esqJgBIC/ pNw6w6HunmBXW8fhjaSupWBaJaLNq +c6mMXtBRaXG8AHX3to5srb0vMCt5UHZMToBM1ecIVVk5u5GJusE7V6dagn7Gsc8vGKBOQzgVHJeuVuuGx3AXJ/ 4qJLLDf8t22TscJ97yxX0EPMoRPwYPEh51RbwF1WLl2ePnuVMb92rND/xkL/czM2b/8JTrHOShSbRTSjpt3cDe/egN8eJC/ nOPawQ55SufcDNy//eK/3FSGf31HDD46V0ainjEbWgVgkeqyYRKUaOIsuXRv+6Jn37sZsFsWNo6CxHK2cQ1Zcj/ PAcja5qaKgdtS6U5JpXCm3uT5Wq+nJrGTNiJl//Q6o0Ixsa6zuPVjQa/ IJ4j8njT4QLotgf3dPb3EEKWSfURl1XB3jkWOR5JfHDRE8UlmoUpHdN+F6uRJ/cb1M2ZFqcSJVKUCHvAJ0fxPOZ084r4HUzwbSf/ Cij4MGKrYN/vHHs/2AKAYkJY1M6+uwnA8ey633fwD/RBipTAwAAA==" /> 87
    88. 88. jMeter recuperação dinâmica de valores 88
    89. 89. jMeter recuperação dinâmica de valores Referência ao valor recuperado 89
    90. 90. Utilização do valor recuperado anteriormente. 90
    91. 91. JMeter gravação do test case HTTP Proxy Server na Workbench 91
    92. 92. JMeter gravação do test case 92
    93. 93. 93
    94. 94. Recording Controller 93
    95. 95. HTTP Proxy Server 93
    96. 96. Porta do proxy 93
    97. 97. Inicie o proxy 93
    98. 98. JMeter gravação do test case 94
    99. 99. JMeter samplers gravados 95
    100. 100. 96
    101. 101. 97
    102. 102. 98
    103. 103. Valor estático substituído por variável 99
    104. 104. Execute a suíte de testes TesteDeMemoryLeak 100
    105. 105. 1o. teste Clique no link da primeira página 101
    106. 106. 2o. teste Simulação de uma consulta Memória alocada 102
    107. 107. Olhando de perto, há algo errado... 103
    108. 108. 1a. req JSESSIONID=A6421... 2a. req JSESSIONID=97F97... 104
    109. 109. JSESSIONID=A6421... 2a. req JSESSIONID=97F97... 104
    110. 110. 2a. req JSESSIONID=97F97... 104
    111. 111. Esquecemos do HTTP Cookie Manager 105
    112. 112. JSESSIONID=2F040C8... JSESSIONID=2F040C8... 106
    113. 113. Mas, de carga, este teste não tem nada. 107
    114. 114. Apenas 1 thread sendo instanciada 108
    115. 115. 2 threads agora
    116. 116. 6EEF3... 278B2... 110 98
    117. 117. 111
    118. 118. 2 iterações do que estiver dentro do Loop Controller 112
    119. 119. 113
    120. 120. thread 1 thread 2 114
    121. 121. 115
    122. 122. 1a. busca da 1a. thread Cache resultante da 1a. busca da 1a. thread 2a. busca da 1a. thread Cache resultante da 2a. busca da 1a. thread 116
    123. 123. 1a. busca da 2a. thread Cache resultante da 1a. busca da 2a. thread 2a. busca da 2a. thread Cache resultante da 2a. busca da 2a. thread 117
    124. 124. Em resumo... 118
    125. 125. algumaPaginaJSF javax.faces.ViewState=H4sIAAAAAAAAAJ javax.faces.ViewState=H4sIAAAAAAAAAJ JBoss javax.faces.ViewState=H4sIAAAAAAAAAJ 119
    126. 126. http://localhost:8080/buscador/faces/memoryleak.jsp javax.faces.ViewState=H4sIAAAAAAAAAJ javax.faces.ViewState=H4sIAAAAAAAAAJ j_id_jsp_841419806_1=j_id_jsp_841419806_1 j_id_jsp_841419806_1=criterio1DeBusca JBoss O cache de resultados já está com 50008 bytes. javax.faces.ViewState=H4sIAAAAAAAAAJ j_id_jsp_841419806_1=j_id_jsp_841419806_1 j_id_jsp_841419806_1=criterio2DeBusca O cache de resultados já está com 100016 bytes. 120
    127. 127. http://localhost:8080/buscador/faces/memoryleak.jsp javax.faces.ViewState=H4sIAAAAAAAAAJ javax.faces.ViewState=H4sIAAAAAAAAAJ j_id_jsp_841419806_1=j_id_jsp_841419806_1 j_id_jsp_841419806_1=criterio1DeBusca JBoss O cache de resultados já está com 50008 bytes. javax.faces.ViewState=H4sIAAAAAAAAAJ j_id_jsp_841419806_1=j_id_jsp_841419806_1 j_id_jsp_841419806_1=criterio2DeBusca O cache de resultados já está com 100016 bytes. 120
    128. 128. http://localhost:8080/buscador/faces/memoryleak.jsp javax.faces.ViewState=H4sIAAAAAAAAAJ javax.faces.ViewState=H4sIAAAAAAAAAJ j_id_jsp_841419806_1=j_id_jsp_841419806_1 j_id_jsp_841419806_1=criterio1DeBusca JBoss O cache de resultados já está com 50008 bytes. javax.faces.ViewState=H4sIAAAAAAAAAJ j_id_jsp_841419806_1=j_id_jsp_841419806_1 j_id_jsp_841419806_1=criterio2DeBusca O cache de resultados já está com 100016 bytes. 120
    129. 129. http://localhost:8080/buscador/faces/memoryleak.jsp javax.faces.ViewState=H4sIAAAAAAAAAJ variavel=H4sIAAAAAAAAAJ javax.faces.ViewState=${variavel} j_id_jsp_841419806_1=j_id_jsp_841419806_1 j_id_jsp_841419806_1=criterio1DeBusca JBoss O cache de resultados já está com 50008 bytes. javax.faces.ViewState=${variavel} j_id_jsp_841419806_1=j_id_jsp_841419806_1 j_id_jsp_841419806_1=criterio2DeBusca O cache de resultados já está com 100016 bytes. 121
    130. 130. http://localhost:8080/buscador/faces/memoryleak.jsp javax.faces.ViewState=H4sIAAAAAAAAAJ variavel=H4sIAAAAAAAAAJ javax.faces.ViewState=${variavel} j_id_jsp_841419806_1=j_id_jsp_841419806_1 RegExp j_id_jsp_841419806_1=criterio1DeBusca Extractor JBoss O cache de resultados já está com 50008 bytes. javax.faces.ViewState=${variavel} j_id_jsp_841419806_1=j_id_jsp_841419806_1 j_id_jsp_841419806_1=criterio2DeBusca O cache de resultados já está com 100016 bytes. 121
    131. 131. javax.faces.ViewState=H4sIAAAAAAAAAJ j_id_jsp_841419806_1=j_id_jsp_841419806_1 j_id_jsp_841419806_1=criterio1DeBusca ? 122
    132. 132. 123
    133. 133. 124
    134. 134. 124
    135. 135. E se a página JSF tivesse dezenas de campos? 125
    136. 136. E se a página JSF tivesse dezenas de campos? #fail 125
    137. 137. 126
    138. 138. http://localhost:8080/buscador/ http://localhost:8080/buscador/faces/memoryleak.jsp 127
    139. 139. http://localhost:8080/buscador/faces/memoryleak.jsp javax.faces.ViewState=H4sIAAAAAAAAAJ j_id_jsp_841419806_1=j_id_jsp_841419806_1 j_id_jsp_841419806_1=criterio1 http://localhost:8080/buscador/faces/memoryleak.jsp javax.faces.ViewState=H4sIAAAAAAAAAJ j_id_jsp_841419806_1=j_id_jsp_841419806_1 j_id_jsp_841419806_1=criterio2 128
    140. 140. Proxy 129
    141. 141. HTTP Proxy Server 130
    142. 142. Ao testar JSF, lembre-se • Enviar todos os parâmetros requeridos - Analise o código fonte da página • Enviar corretamente o campo ViewState - Utilize o valor gerado pela primeira requisição nas requisições subsequentes • Gerenciar sessão com HTTP Cookie Manager - Senão cada requisição de uma mesma thread será vista como um novo usuário ★ Usar RegExp Extrator pra o ViewState; ★ Usar HTTP Proxy Server pra facilitar a criação do Test Plan 131
    143. 143. Usar JMeter para teste de aplicações web stateful e JSF. Siga passo a passo para sensibilizar-se com o problema 132
    144. 144. Mais sobre JMeter 133
    145. 145. Test Plan Define toda a estratégia de teste. 134
    146. 146. Thread Group Threads a serem instanciadas para execução do Plano de Testes 135
    147. 147. Controllers Logic Sampler Controller Núcleo do Plano de Teste 136
    148. 148. Sampler Controller Gerador de requisições 137
    149. 149. Logic Controller Define quando será o envio das requisições dos Samplers 138
    150. 150. Listeners Apresenta informações coletadas pelo Plano de Teste durante sua execução 139
    151. 151. Timers Pausa entre requisições 140
    152. 152. Assertions Verifica se o teste está gerando os resultados esperados 141
    153. 153. 142
    154. 154. Tomcoat 143
    155. 155. Tomcat 144
    156. 156. Configuration Elements Usados para adicionar ou modificar requisições 145
    157. 157. Configuration Elements Usados para adicionar ou modificar requisições 145
    158. 158. Pre-Processors Modifica a requisição antes de ser enviada pelo Sampler 146
    159. 159. Post-Processors Extração de dados da resposta HTTP 147
    160. 160. Ordem de Execução 1. Configuration elements 2. Pre-Processors 3. Timers 4. Sampler 5. Post-Processors 6. Assertions 7. Listeners 148
    161. 161. Propriedades jmeter.properties ... log_level.jmeter=INFO log_level.jmeter.junit=DEBUG user.properties=user.properties system.properties=system.properties ... 149
    162. 162. JMeter Remote Testing 150
    163. 163. ! 151
    164. 164. ! 152
    165. 165. slaves master $JMETER_HOME/bin/jmeter-server $JMETER_HOME/bin/jmeter $JMETER_HOME/bin/jmeter-server $JMETER_HOME/bin/jmeter-server 153
    166. 166. Master GUI # Remote Hosts - comma delimited remote_hosts=192.168.0.2, 192.168.0.3, 192.168.0.4 JMETER_HOME/bin/jmeter.properties 154
    167. 167. Master non-GUI jmeter -n -t script.jmx -r ou jmeter -n -t script.jmx -R 192.168.0.2,192.168.0.3,192.168.0.4 $ tail -f JMETER_HOME/bin/jmeter.log 155
    168. 168. Slave $ ./jmeter-server $ tail -f JMETER_HOME/bin/jmeter-server.log 156
    169. 169. 157
    170. 170. Repita, em modo distribuído, todos os testes anteriores Negocie o uso de máquinas de colegas. 158
    171. 171. 159
    172. 172. Outras Ferramentas 160
    173. 173. Lobo Continuous Tuning ‟ Lobo is a tool for tracking performance designed to register as the performance of your systems evolve. It is especially useful if you employ agile practices, because its code and its architecture evolve. http://lobo-ct.sourceforge.net 161
    174. 174. httperf ‟ Httperf is a tool for measuring web server performance. It provides a flexible facility for generating various HTTP workloads and for measuring server performance. http://www.hpl.hp.com/research/linux/httperf 162
    175. 175. Selenium ‟ Selenium IDE is a Firefox add-on that records clicks, typing, and other actions to make a test, which you can play back in the browser. http://seleniumhq.org 163
    176. 176. http_load ‟ http_load runs multiple http fetches in parallel, to test the throughput of a web server. However unlike most such test clients, it runs in a single process, so it doesn't bog down the client machine. It can be configured to do https fetches as well. http://www.acme.com/software/http_load 164
    177. 177. Siege ‟ Siege is an http regression testing and benchmarking utility. It was designed to let web developers measure the performance of their code under duress, to see how it will stand up to load on the internet. http://www.joedog.org/index/siege-home 165
    178. 178. OpenWebLoad ‟ OpenWebLoad is a tool for load testing web applications. It aims to be easy to use and providing near real-time performance measurements of the application under test. This is particulary useful when you are doing optimization as you can see the impact of your changes almost immediately. http://openwebload.sourceforge.net 166
    179. 179. Grinder ‟ The Grinder is a Java TM load testing framework that makes it easy to run a distributed test using many load injector machines. http://grinder.sourceforge.net 167
    180. 180. Outras mais • Apache JMeter • httperf • Sipp • benerator • http_load • SLAMD • CLIF is a Load Injection Framework • JChav • Soap-Stone • curl-loader • JCrawler • stress_driver • Database Opensource Test Suite • Lobo, Continuous Tuning • TestMaker • DBMonster • MessAdmin • TPTEST • Deluge • NTime • Tsung • Dieseltest • OpenSTA • Valgrind • Faban • OpenWebLoad • WebApp Load Simulator • FunkLoad • p-unit • Web Polygraph • FWPTT load testing web applications • PandoraFMS • WebLOAD • Grinder • Pylot • Hammerhead 2 - Web Testing Tool • Seagull • Hammerora • Siege http://www.opensourcetesting.org/performance.php 168
    181. 181. Recursos • Load Testing - http://en.wikipedia.org/wiki/Load_testing • Software Performance Testing - http://en.wikipedia.org/wiki/Software_performance_testing • Benchmarking - http://en.wikipedia.org/wiki/Benchmark_(computing) • Conducting a benchmark - http://www.xenoclast.org/doc/benchmark/HTTP-benchmarking-HOWTO/node6.html • Benchmarking and Monitoring Tools of the Trade (Part I) Presentation - http://www.scribd.com/doc/2602028/Benchmarking-and-Monitoring-Tools-of-the-Trade-Part-I-Presentation • Performance Testing Guidance - http://www.codeplex.com/PerfTesting • Performance Testing Videos - http://msdn.microsoft.com/en-us/library/bb671346.aspx • Better Tests, Better Results - http://www.perftestplus.com/pubs.htm 169
    182. 182. Q&A

    ×