SlideShare a Scribd company logo
1 of 182
JBoss Tuning
Ferramentas de Benchmarking
2
Objetivo
Conhecer as principais ferramentas para
 simulação de carga em aplicacões web




                                          3
Cobaias
Exemplo de aplicativo sem
  manutencão de estado




Aplicações que serão usadas para demonstração
       das ferramentas de benchmarking
                                                4
Cobaias
              Exemplo de aplicativo com
                manutencão de estado
tela de
 login



           menu
          principal




                         funcionalidade
                            qualquer




                                          5
netcat




         6
7
echo -e "GET / HTTP/1.0nn" | nc 127.0.0.1 8080




                                               8
$ 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
for ((i = 1; i <= 10; i++))
do
   echo "---------------------------------"
   echo -e "GET /VerySimpleStatelessWebApp/ HTTP/1.0nn" | nc 127.0.0.1 8080
done




                                                                            10
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
13
14
10 requisições enviadas por 1 thread (10 req/th) ao aplicativo stateless
                                                                           15
1 requisição enviada por 10 threads (0.1 req/th) ao aplicativo stateless
                                 o.O                                       16
10 requisições enviadas por 10 threads (1 req/th) ao aplicativo stateless
                                  :-)
                                                                            17
Resultado em HTML
                    18
Resultado em HTML
                    19
Log
a cada requisição,
uma mensagem é
    impressa




                     Página principal do aplicativo stateful
                                                               20
Simulação da operacão de login do aplicativo stateful
                                                        21
Simulação de acesso à funcionalidade 1 do aplicativo stateful
                                                                22
Nível 1 de verbosidade
                         23
Nível 2 de verbosidade
- cabeçalho da requisição HTTP -   24
Nível 1 de verbosidade
- códigos de resposta HTTP -   25
Nível 4 de verbosidade
- corpo da resposta HTTP -   26
Atributo ‘nome’ não sendo pego da sessão do usuário
                                                      27
Cada requisição está tentando criar uma nova sessão   28
?
Como armazenar o cookie JSESSIONID para utilizar
 sempre a mesma sessão do usuário no servidor?


                                                   29
#fail


 Com o ‘ab’, isso não é possível :-(
Mas com um pouco de script, sim ;-)


                                       30
Usar netcat e ab para teste de
aplicações web stateless e stateful.

    Verifique a limitação com sistemas stateful.
                                                  31
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
Stateless



            33
Pivô de tudo




               GUI Java simples
                                  34
Dar nome ao
plano de teste




                 35
Definir o conjunto de
 threads que executará o
      plano de teste




10 threads que devem ser,
  todas, iniciadas em 5
        segundos




                            36
Definir o tipo de
requisições que serão
 feitas pelas threads
        criadas           Vamos gerar
                        requisições HTTP




                                           37
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
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
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
10 requisições   41
View Results Tree Listener   42
View Results Tree Listener
                             43
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
Usar JMeter para teste de
aplicações web stateless.

Compreenda seus principais conceitos.
                                        45
Stateful



           46
VerySimpleStatefulWebApp

tela de
 login



              menu
             principal




                         funcionalidade
                            qualquer




                                          47
VerySimpleStatefulWebApp

                                      HTTPSession



                               nome=”Alexandre”




                                                               7
                           3




index.jsp   2   AutenticacaoServlet       4         main.jsp   funcionalidade1.jsp
1




                                                                   6
                                                       5




                                                                          8
                                                                                 48
VerySimpleStatefulWebApp

tela de
 login



              menu
             principal




                         funcionalidade
                            qualquer




                                          49
VerySimpleStatefulWebApp

                                      HTTPSession



                               nome=”Alexandre”




                                                               7
                           3




index.jsp   2   AutenticacaoServlet       4         main.jsp   funcionalidade1.jsp
1




                                                                   6
                                                       5




                                                                          8
                                                                                 50
VerySimpleStatefulWebApp
          index.jsp




                           51
VerySimpleStatefulWebApp

                                      HTTPSession



                               nome=”Alexandre”




                                                               7
                           3




index.jsp   2   AutenticacaoServlet       4         main.jsp   funcionalidade1.jsp
1




                                                                   6
                                                       5




                                                                          8
                                                                                 52
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
VerySimpleStatefulWebApp

                                      HTTPSession



                               nome=”Alexandre”




                                                               7
                           3




index.jsp   2   AutenticacaoServlet       4         main.jsp   funcionalidade1.jsp
1




                                                                   6
                                                       5




                                                                          8
                                                                                 54
VerySimpleStatefulWebApp
        funcionalidade1.jsp




                     Deve recuperar
                    atributo ‘nome’ da
                    sessão do usuário




                                         55
Resultado do teste




       Resultado do teste
          da index.jsp




    VerySimpleStatefulWebApp
             - Tela de Autenticacão -   56
main.jsp gerado após
 invocação da Servlet de
      Autenticação.




VerySimpleStatefulWebApp
         - Menu principal -   57
null




Resultado do teste de
 funcionalidade1.jsp



VerySimpleStatefulWebApp
         - Funcionalidade 1 -          58
Um sessão sendo criada pra cada requisição
          JSESSIONID=8287....                59
Um sessão sendo criada pra cada requisição
          JSESSIONID=126A...                 60
Um sessão sendo criada pra cada requisição
          JSESSIONID=58FC...                 61
O JSESSIONID era pra ser armazenado em um cookie no
    cliente, mas o cliente não sabia como fazer isso.   62
Atributo recuperado da sessão




HTTP Cookie Manager




                      Agora sim
                                                                  63
sem set-cookie na resposta

                             64
Usar JMeter para teste de
     aplicações web stateful.

Sinta na pele o problema da manutenção de estado.
                                                    65
Nosso teste sempre
 envia os mesmos
   parâmetros
                     66
Nossos testes não estão
    tão realistas....
    Alexandre




    Alexandre

                  WebApp
    Alexandre




    Alexandre


                           67
Na prática, N usuário
diferentes farão o acesso

     Alexandre




       Túlio

                   WebApp
      Luciana




       Lula

                            68
$ cat nomes.txt
Zezinho
Huguinho
Luizinho
Pato Donald



                  69
CSV Data Set Config




                     70
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
Uso da variávél
    definida no
CSV Data Set Config




                     72
Reexecutar os testes da aplicação Stateful com
um arquivo CSV para variar o usuário enviado.

                Enriqueça seus testes
                                                 73
JSF



      74
Buscador




           75
Buscador




           tamanho do cache
            de resultados no
                servidor
                               76
Buscador




           77
Buscador
                                              StringBuffer


                                              CACHE




                                                  5
                                      4
index.jsp   2    memoryleak.jsp           BuscadorBean.java
  (JSP)             (JSF)         6            (JAVA)
                   3
   1




                         7




                                                              78
Buscador
index.jsp → memoryleak.jsp




                             79
Buscador
                index.jsp → memoryleak.jsp
                                                   StringBuffer


                                                   CACHE




                                                       5
                                           4
index.jsp   2         memoryleak.jsp           BuscadorBean.java
  (JSP)                  (JSF)         6            (JAVA)
                        3
   1




                              7




                                                                   80
Buscador
index.jsp → memoryleak.jsp




                             81
Buscador
index.jsp → memoryleak.jsp




                             82
Buscador
Simulação da busca




                     83
Buscador
                                              StringBuffer


                                              CACHE




                                                  5
                                      4
index.jsp   2    memoryleak.jsp           BuscadorBean.java
  (JSP)             (JSF)         6            (JAVA)
                   3
   1




                         7




                                                              84
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
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
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
jMeter
recuperação dinâmica de valores




                                  88
jMeter
recuperação dinâmica de valores




            Referência ao valor
                recuperado
                                  89
Utilização do valor
    recuperado
 anteriormente.




                      90
JMeter
                    gravação do test case




HTTP Proxy Server
  na Workbench




                                            91
JMeter
gravação do test case




                        92
93
Recording
Controller




             93
HTTP Proxy
  Server




             93
Porta do
 proxy




           93
Inicie o proxy



                 93
JMeter
gravação do test case




                        94
JMeter
samplers gravados




                    95
96
97
98
Valor estático
substituído por
    variável

                  99
Execute a
suíte de testes
  TesteDeMemoryLeak




                      100
1o. teste
Clique no link da
primeira página




                    101
2o. teste
Simulação de uma
    consulta




                   Memória
                   alocada


                             102
Olhando de perto,
 há algo errado...



                     103
1a. req




          JSESSIONID=A6421...




2a. req
          JSESSIONID=97F97...
                                104
JSESSIONID=A6421...




2a. req
          JSESSIONID=97F97...
                                104
2a. req
          JSESSIONID=97F97...
                                104
Esquecemos do
HTTP Cookie Manager
                      105
JSESSIONID=2F040C8...




JSESSIONID=2F040C8...



                        106
Mas, de carga,
este teste não tem nada.



                           107
Apenas 1 thread
sendo instanciada




                    108
2 threads agora
6EEF3...




278B2...




           110
            98
111
2 iterações do que estiver
dentro do Loop Controller




                             112
113
thread 1




thread 2




           114
115
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
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
Em resumo...



               118
algumaPaginaJSF



javax.faces.ViewState=H4sIAAAAAAAAAJ




javax.faces.ViewState=H4sIAAAAAAAAAJ
                                       JBoss




javax.faces.ViewState=H4sIAAAAAAAAAJ




                                               119
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
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
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
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
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
javax.faces.ViewState=H4sIAAAAAAAAAJ
j_id_jsp_841419806_1=j_id_jsp_841419806_1
j_id_jsp_841419806_1=criterio1DeBusca




               ?                            122
123
124
124
E se a página JSF tivesse dezenas de campos?




                                               125
E se a página JSF tivesse dezenas de campos?



                   #fail


                                               125
126
http://localhost:8080/buscador/




http://localhost:8080/buscador/faces/memoryleak.jsp




                                                      127
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
Proxy




        129
HTTP
Proxy
Server




         130
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
Usar JMeter para teste de
  aplicações web stateful e JSF.

Siga passo a passo para sensibilizar-se com o problema
                                                         132
Mais sobre JMeter



                    133
Test Plan


Define toda a estratégia de teste.




                                    134
Thread Group
Threads a serem instanciadas para
  execução do Plano de Testes




                                    135
Controllers


                             Logic
Sampler
                           Controller




      Núcleo do Plano de Teste
                                        136
Sampler Controller
   Gerador de requisições




                            137
Logic Controller
Define quando será o envio das
  requisições dos Samplers




                                138
Listeners
Apresenta informações coletadas pelo
Plano de Teste durante sua execução




                                       139
Timers
Pausa entre requisições




                          140
Assertions
Verifica se o teste está gerando os
      resultados esperados




                                     141
142
Tomcoat




          143
Tomcat




         144
Configuration Elements
     Usados para adicionar ou
      modificar requisições




                                145
Configuration Elements
     Usados para adicionar ou
      modificar requisições




                                145
Pre-Processors
Modifica a requisição antes de ser
     enviada pelo Sampler




                                    146
Post-Processors
  Extração de dados da
     resposta HTTP




                         147
Ordem de Execução

1. Configuration elements
2. Pre-Processors
3. Timers
4. Sampler
5. Post-Processors
6. Assertions
7. Listeners
                           148
Propriedades
          jmeter.properties



...
log_level.jmeter=INFO
log_level.jmeter.junit=DEBUG
user.properties=user.properties
system.properties=system.properties
...




                                      149
JMeter



Remote Testing


                 150
!

    151
!




    152
slaves                          master




$JMETER_HOME/bin/jmeter-server




                                 $JMETER_HOME/bin/jmeter
$JMETER_HOME/bin/jmeter-server




$JMETER_HOME/bin/jmeter-server                       153
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
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
Slave


            $ ./jmeter-server



$ tail -f JMETER_HOME/bin/jmeter-server.log


                                          156
157
Repita, em modo distribuído,
  todos os testes anteriores

  Negocie o uso de máquinas de colegas.
                                          158
159
Outras
Ferramentas




              160
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
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
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
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
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
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
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
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
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
Q&A

More Related Content

What's hot

UOL Tech Day: Testes de Integração com OpenEJB
UOL Tech Day: Testes de Integração com OpenEJBUOL Tech Day: Testes de Integração com OpenEJB
UOL Tech Day: Testes de Integração com OpenEJBGabriel Ozeas
 
A arquitetura modular do Java 9
A arquitetura modular do Java 9A arquitetura modular do Java 9
A arquitetura modular do Java 9Helder da Rocha
 
Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Helder da Rocha
 
API de segurança do Java EE 8
API de segurança do Java EE 8API de segurança do Java EE 8
API de segurança do Java EE 8Helder da Rocha
 
Paralelize seus testes web e mobile para ter feedbacks mais rápidos
Paralelize seus testes web e mobile para ter feedbacks mais rápidosParalelize seus testes web e mobile para ter feedbacks mais rápidos
Paralelize seus testes web e mobile para ter feedbacks mais rápidosElias Nogueira
 
Testes Funcionais com Selenium
Testes Funcionais com Selenium Testes Funcionais com Selenium
Testes Funcionais com Selenium Mayron Cachina
 
CDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeCDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeRafael Benevides
 
Apresentação maven
Apresentação mavenApresentação maven
Apresentação mavenAndré Justi
 
TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?Rafael Benevides
 
Minicurso Play Framework - Tão fácil que nem parece Java
Minicurso Play Framework - Tão fácil que nem parece JavaMinicurso Play Framework - Tão fácil que nem parece Java
Minicurso Play Framework - Tão fácil que nem parece JavaWandesson Soares
 
Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Helder da Rocha
 

What's hot (20)

UOL Tech Day: Testes de Integração com OpenEJB
UOL Tech Day: Testes de Integração com OpenEJBUOL Tech Day: Testes de Integração com OpenEJB
UOL Tech Day: Testes de Integração com OpenEJB
 
A arquitetura modular do Java 9
A arquitetura modular do Java 9A arquitetura modular do Java 9
A arquitetura modular do Java 9
 
Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)
 
Plugin Maven no Eclipse
Plugin Maven no EclipsePlugin Maven no Eclipse
Plugin Maven no Eclipse
 
Maven na prática
Maven na práticaMaven na prática
Maven na prática
 
API de segurança do Java EE 8
API de segurança do Java EE 8API de segurança do Java EE 8
API de segurança do Java EE 8
 
Paralelize seus testes web e mobile para ter feedbacks mais rápidos
Paralelize seus testes web e mobile para ter feedbacks mais rápidosParalelize seus testes web e mobile para ter feedbacks mais rápidos
Paralelize seus testes web e mobile para ter feedbacks mais rápidos
 
Java 9, 10, 11
Java 9, 10, 11Java 9, 10, 11
Java 9, 10, 11
 
Maven 2
Maven 2Maven 2
Maven 2
 
Aplicações web parte 2
Aplicações web parte 2Aplicações web parte 2
Aplicações web parte 2
 
Testes Funcionais com Selenium
Testes Funcionais com Selenium Testes Funcionais com Selenium
Testes Funcionais com Selenium
 
Apache e Java
Apache e JavaApache e Java
Apache e Java
 
Java 08
Java 08Java 08
Java 08
 
CDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeCDI Extensions e DeltaSpike
CDI Extensions e DeltaSpike
 
servlet-introducao
servlet-introducaoservlet-introducao
servlet-introducao
 
Apresentação maven
Apresentação mavenApresentação maven
Apresentação maven
 
Apresentação maven
Apresentação mavenApresentação maven
Apresentação maven
 
TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?
 
Minicurso Play Framework - Tão fácil que nem parece Java
Minicurso Play Framework - Tão fácil que nem parece JavaMinicurso Play Framework - Tão fácil que nem parece Java
Minicurso Play Framework - Tão fácil que nem parece Java
 
Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)
 

Similar to Benchmarking Tools

Testando a integração com APIs - RSonRails/11
Testando a integração com APIs - RSonRails/11Testando a integração com APIs - RSonRails/11
Testando a integração com APIs - RSonRails/11Rafael Souza
 
Assespro pr-workshop-robot framework
Assespro pr-workshop-robot frameworkAssespro pr-workshop-robot framework
Assespro pr-workshop-robot frameworkMayara Fernandes
 
Diapositivos práticos - Integração de Sistemas.pdf
Diapositivos práticos - Integração de Sistemas.pdfDiapositivos práticos - Integração de Sistemas.pdf
Diapositivos práticos - Integração de Sistemas.pdfJ0071
 
Programação para Web II: Estrutura de um projeto Java Web
Programação para Web II: Estrutura de um projeto Java WebProgramação para Web II: Estrutura de um projeto Java Web
Programação para Web II: Estrutura de um projeto Java WebAlex Camargo
 
Entregando conteúdo em ambientes extremos na JVM
Entregando conteúdo em ambientes extremos na JVMEntregando conteúdo em ambientes extremos na JVM
Entregando conteúdo em ambientes extremos na JVMRodrigo Zaccara
 
2 Ads
2 Ads2 Ads
2 Adslcbj
 
Técnicas e recursos para desenvolvimento Web em cenários de grande escala
Técnicas e recursos para desenvolvimento Web em cenários de grande escalaTécnicas e recursos para desenvolvimento Web em cenários de grande escala
Técnicas e recursos para desenvolvimento Web em cenários de grande escalaAlexandre Tarifa
 
Robot Framework no DevTests #34
Robot Framework no DevTests #34Robot Framework no DevTests #34
Robot Framework no DevTests #34Mayara Fernandes
 
Automação de Teste para REST, Web e Mobile
Automação de Teste para REST, Web e MobileAutomação de Teste para REST, Web e Mobile
Automação de Teste para REST, Web e MobileElias Nogueira
 
Java Web Dev Introdução
Java Web Dev IntroduçãoJava Web Dev Introdução
Java Web Dev IntroduçãoMarcio Marinho
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Rafael Benevides
 
Testes de regressão automatizados
Testes de regressão automatizadosTestes de regressão automatizados
Testes de regressão automatizadosCristian R. Silva
 

Similar to Benchmarking Tools (20)

Testando a integração com APIs - RSonRails/11
Testando a integração com APIs - RSonRails/11Testando a integração com APIs - RSonRails/11
Testando a integração com APIs - RSonRails/11
 
Servlets e JSP
Servlets e JSPServlets e JSP
Servlets e JSP
 
Assespro pr-workshop-robot framework
Assespro pr-workshop-robot frameworkAssespro pr-workshop-robot framework
Assespro pr-workshop-robot framework
 
Desafio Rest API
Desafio Rest APIDesafio Rest API
Desafio Rest API
 
Python cherrypy
Python cherrypyPython cherrypy
Python cherrypy
 
Diapositivos práticos - Integração de Sistemas.pdf
Diapositivos práticos - Integração de Sistemas.pdfDiapositivos práticos - Integração de Sistemas.pdf
Diapositivos práticos - Integração de Sistemas.pdf
 
Ruby On Rails Regis
Ruby On Rails RegisRuby On Rails Regis
Ruby On Rails Regis
 
Programação para Web II: Estrutura de um projeto Java Web
Programação para Web II: Estrutura de um projeto Java WebProgramação para Web II: Estrutura de um projeto Java Web
Programação para Web II: Estrutura de um projeto Java Web
 
Entregando conteúdo em ambientes extremos na JVM
Entregando conteúdo em ambientes extremos na JVMEntregando conteúdo em ambientes extremos na JVM
Entregando conteúdo em ambientes extremos na JVM
 
2 Ads
2 Ads2 Ads
2 Ads
 
Técnicas e recursos para desenvolvimento Web em cenários de grande escala
Técnicas e recursos para desenvolvimento Web em cenários de grande escalaTécnicas e recursos para desenvolvimento Web em cenários de grande escala
Técnicas e recursos para desenvolvimento Web em cenários de grande escala
 
Robot Framework no DevTests #34
Robot Framework no DevTests #34Robot Framework no DevTests #34
Robot Framework no DevTests #34
 
Automação de Teste para REST, Web e Mobile
Automação de Teste para REST, Web e MobileAutomação de Teste para REST, Web e Mobile
Automação de Teste para REST, Web e Mobile
 
Java Web Dev Introdução
Java Web Dev IntroduçãoJava Web Dev Introdução
Java Web Dev Introdução
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007
 
Testes de regressão automatizados
Testes de regressão automatizadosTestes de regressão automatizados
Testes de regressão automatizados
 
De 0 a DevOps
De 0 a DevOpsDe 0 a DevOps
De 0 a DevOps
 
Manual
ManualManual
Manual
 
Cactus xp
Cactus xpCactus xp
Cactus xp
 
Infrastructure Testing
Infrastructure TestingInfrastructure Testing
Infrastructure Testing
 

More from SEA Tecnologia

Loomio how to Series - Working on a Discussion
Loomio how to Series - Working on a DiscussionLoomio how to Series - Working on a Discussion
Loomio how to Series - Working on a DiscussionSEA Tecnologia
 
Loomio how to Series - Creating a new Group of People
Loomio how to Series - Creating a new Group of PeopleLoomio how to Series - Creating a new Group of People
Loomio how to Series - Creating a new Group of PeopleSEA Tecnologia
 
Loomio how to Series - Creating a new Discussion
Loomio how to Series - Creating a new DiscussionLoomio how to Series - Creating a new Discussion
Loomio how to Series - Creating a new DiscussionSEA Tecnologia
 
Gerentes em Crise existencial - Existimos no Universo Ágil?
Gerentes em Crise existencial - Existimos no Universo Ágil?Gerentes em Crise existencial - Existimos no Universo Ágil?
Gerentes em Crise existencial - Existimos no Universo Ágil?SEA Tecnologia
 
O curioso caso de Náutilus Button
O curioso caso de Náutilus ButtonO curioso caso de Náutilus Button
O curioso caso de Náutilus ButtonSEA Tecnologia
 
Contratos de desenvolvimento de software para governo blue pill or red pill?
Contratos de desenvolvimento de software para governo  blue pill or red pill?Contratos de desenvolvimento de software para governo  blue pill or red pill?
Contratos de desenvolvimento de software para governo blue pill or red pill?SEA Tecnologia
 
Os benefícios e desafios da participação pública digital
Os benefícios e desafios da participação pública digitalOs benefícios e desafios da participação pública digital
Os benefícios e desafios da participação pública digitalSEA Tecnologia
 
A escola do século XXI deve ser ágil, enxuta e empreendedora.
A escola do século XXI deve ser ágil, enxuta e empreendedora.A escola do século XXI deve ser ágil, enxuta e empreendedora.
A escola do século XXI deve ser ágil, enxuta e empreendedora.SEA Tecnologia
 
Open data, scraping e thacks com Software Livre
Open data, scraping e thacks com Software LivreOpen data, scraping e thacks com Software Livre
Open data, scraping e thacks com Software LivreSEA Tecnologia
 
Agilidade dos projetos à empresa, uma história de Intracontágio
Agilidade dos projetos à empresa, uma história de IntracontágioAgilidade dos projetos à empresa, uma história de Intracontágio
Agilidade dos projetos à empresa, uma história de IntracontágioSEA Tecnologia
 
Roadshow Brasília Novas funcionalidades Liferay 6
Roadshow Brasília Novas funcionalidades Liferay 6Roadshow Brasília Novas funcionalidades Liferay 6
Roadshow Brasília Novas funcionalidades Liferay 6SEA Tecnologia
 
Roadshow Liferay no Brasil 2010
Roadshow Liferay no Brasil 2010Roadshow Liferay no Brasil 2010
Roadshow Liferay no Brasil 2010SEA Tecnologia
 
Sem tesão não há solução
Sem tesão não há soluçãoSem tesão não há solução
Sem tesão não há soluçãoSEA Tecnologia
 
Empreendimentos em Rede
Empreendimentos em RedeEmpreendimentos em Rede
Empreendimentos em RedeSEA Tecnologia
 

More from SEA Tecnologia (20)

Loomio how to Series - Working on a Discussion
Loomio how to Series - Working on a DiscussionLoomio how to Series - Working on a Discussion
Loomio how to Series - Working on a Discussion
 
Loomio how to Series - Creating a new Group of People
Loomio how to Series - Creating a new Group of PeopleLoomio how to Series - Creating a new Group of People
Loomio how to Series - Creating a new Group of People
 
Loomio how to Series - Creating a new Discussion
Loomio how to Series - Creating a new DiscussionLoomio how to Series - Creating a new Discussion
Loomio how to Series - Creating a new Discussion
 
Gerentes em Crise existencial - Existimos no Universo Ágil?
Gerentes em Crise existencial - Existimos no Universo Ágil?Gerentes em Crise existencial - Existimos no Universo Ágil?
Gerentes em Crise existencial - Existimos no Universo Ágil?
 
O curioso caso de Náutilus Button
O curioso caso de Náutilus ButtonO curioso caso de Náutilus Button
O curioso caso de Náutilus Button
 
Contratos de desenvolvimento de software para governo blue pill or red pill?
Contratos de desenvolvimento de software para governo  blue pill or red pill?Contratos de desenvolvimento de software para governo  blue pill or red pill?
Contratos de desenvolvimento de software para governo blue pill or red pill?
 
#Fail
#Fail#Fail
#Fail
 
Agilidade no Governo
Agilidade no GovernoAgilidade no Governo
Agilidade no Governo
 
Os benefícios e desafios da participação pública digital
Os benefícios e desafios da participação pública digitalOs benefícios e desafios da participação pública digital
Os benefícios e desafios da participação pública digital
 
A escola do século XXI deve ser ágil, enxuta e empreendedora.
A escola do século XXI deve ser ágil, enxuta e empreendedora.A escola do século XXI deve ser ágil, enxuta e empreendedora.
A escola do século XXI deve ser ágil, enxuta e empreendedora.
 
Lean Startup
Lean StartupLean Startup
Lean Startup
 
Open Data
Open DataOpen Data
Open Data
 
Open data, scraping e thacks com Software Livre
Open data, scraping e thacks com Software LivreOpen data, scraping e thacks com Software Livre
Open data, scraping e thacks com Software Livre
 
Agilidade dos projetos à empresa, uma história de Intracontágio
Agilidade dos projetos à empresa, uma história de IntracontágioAgilidade dos projetos à empresa, uma história de Intracontágio
Agilidade dos projetos à empresa, uma história de Intracontágio
 
Roadshow Brasília Novas funcionalidades Liferay 6
Roadshow Brasília Novas funcionalidades Liferay 6Roadshow Brasília Novas funcionalidades Liferay 6
Roadshow Brasília Novas funcionalidades Liferay 6
 
Roadshow Liferay no Brasil 2010
Roadshow Liferay no Brasil 2010Roadshow Liferay no Brasil 2010
Roadshow Liferay no Brasil 2010
 
Sem tesão não há solução
Sem tesão não há soluçãoSem tesão não há solução
Sem tesão não há solução
 
Empreendimentos em Rede
Empreendimentos em RedeEmpreendimentos em Rede
Empreendimentos em Rede
 
Java Profiling Tools
Java Profiling ToolsJava Profiling Tools
Java Profiling Tools
 
Misc Monitoring Tools
Misc Monitoring ToolsMisc Monitoring Tools
Misc Monitoring Tools
 

Recently uploaded

ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx2m Assessoria
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsDanilo Pinotti
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploDanilo Pinotti
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx2m Assessoria
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuisKitota
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx2m Assessoria
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfSamaraLunas
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx2m Assessoria
 

Recently uploaded (8)

ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 

Benchmarking Tools

  • 2. 2
  • 3. Objetivo Conhecer as principais ferramentas para simulação de carga em aplicacões web 3
  • 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. Cobaias Exemplo de aplicativo com manutencão de estado tela de login menu principal funcionalidade qualquer 5
  • 6. netcat 6
  • 7. 7
  • 8. echo -e "GET / HTTP/1.0nn" | nc 127.0.0.1 8080 8
  • 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. for ((i = 1; i <= 10; i++)) do echo "---------------------------------" echo -e "GET /VerySimpleStatelessWebApp/ HTTP/1.0nn" | nc 127.0.0.1 8080 done 10
  • 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
  • 13. 13
  • 14. 14
  • 15. 10 requisições enviadas por 1 thread (10 req/th) ao aplicativo stateless 15
  • 16. 1 requisição enviada por 10 threads (0.1 req/th) ao aplicativo stateless o.O 16
  • 17. 10 requisições enviadas por 10 threads (1 req/th) ao aplicativo stateless :-) 17
  • 20. Log a cada requisição, uma mensagem é impressa Página principal do aplicativo stateful 20
  • 21. Simulação da operacão de login do aplicativo stateful 21
  • 22. Simulação de acesso à funcionalidade 1 do aplicativo stateful 22
  • 23. Nível 1 de verbosidade 23
  • 24. Nível 2 de verbosidade - cabeçalho da requisição HTTP - 24
  • 25. Nível 1 de verbosidade - códigos de resposta HTTP - 25
  • 26. Nível 4 de verbosidade - corpo da resposta HTTP - 26
  • 27. Atributo ‘nome’ não sendo pego da sessão do usuário 27
  • 28. Cada requisição está tentando criar uma nova sessão 28
  • 29. ? Como armazenar o cookie JSESSIONID para utilizar sempre a mesma sessão do usuário no servidor? 29
  • 30. #fail Com o ‘ab’, isso não é possível :-( Mas com um pouco de script, sim ;-) 30
  • 31. Usar netcat e ab para teste de aplicações web stateless e stateful. Verifique a limitação com sistemas stateful. 31
  • 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. Stateless 33
  • 34. Pivô de tudo GUI Java simples 34
  • 35. Dar nome ao plano de teste 35
  • 36. Definir o conjunto de threads que executará o plano de teste 10 threads que devem ser, todas, iniciadas em 5 segundos 36
  • 37. Definir o tipo de requisições que serão feitas pelas threads criadas Vamos gerar requisições HTTP 37
  • 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. 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. 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
  • 42. View Results Tree Listener 42
  • 43. View Results Tree Listener 43
  • 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. Usar JMeter para teste de aplicações web stateless. Compreenda seus principais conceitos. 45
  • 46. Stateful 46
  • 47. VerySimpleStatefulWebApp tela de login menu principal funcionalidade qualquer 47
  • 48. VerySimpleStatefulWebApp HTTPSession nome=”Alexandre” 7 3 index.jsp 2 AutenticacaoServlet 4 main.jsp funcionalidade1.jsp 1 6 5 8 48
  • 49. VerySimpleStatefulWebApp tela de login menu principal funcionalidade qualquer 49
  • 50. VerySimpleStatefulWebApp HTTPSession nome=”Alexandre” 7 3 index.jsp 2 AutenticacaoServlet 4 main.jsp funcionalidade1.jsp 1 6 5 8 50
  • 51. VerySimpleStatefulWebApp index.jsp 51
  • 52. VerySimpleStatefulWebApp HTTPSession nome=”Alexandre” 7 3 index.jsp 2 AutenticacaoServlet 4 main.jsp funcionalidade1.jsp 1 6 5 8 52
  • 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. VerySimpleStatefulWebApp HTTPSession nome=”Alexandre” 7 3 index.jsp 2 AutenticacaoServlet 4 main.jsp funcionalidade1.jsp 1 6 5 8 54
  • 55. VerySimpleStatefulWebApp funcionalidade1.jsp Deve recuperar atributo ‘nome’ da sessão do usuário 55
  • 56. Resultado do teste Resultado do teste da index.jsp VerySimpleStatefulWebApp - Tela de Autenticacão - 56
  • 57. main.jsp gerado após invocação da Servlet de Autenticação. VerySimpleStatefulWebApp - Menu principal - 57
  • 58. null Resultado do teste de funcionalidade1.jsp VerySimpleStatefulWebApp - Funcionalidade 1 - 58
  • 59. Um sessão sendo criada pra cada requisição JSESSIONID=8287.... 59
  • 60. Um sessão sendo criada pra cada requisição JSESSIONID=126A... 60
  • 61. Um sessão sendo criada pra cada requisição JSESSIONID=58FC... 61
  • 62. O JSESSIONID era pra ser armazenado em um cookie no cliente, mas o cliente não sabia como fazer isso. 62
  • 63. Atributo recuperado da sessão HTTP Cookie Manager Agora sim 63
  • 64. sem set-cookie na resposta 64
  • 65. Usar JMeter para teste de aplicações web stateful. Sinta na pele o problema da manutenção de estado. 65
  • 66. Nosso teste sempre envia os mesmos parâmetros 66
  • 67. Nossos testes não estão tão realistas.... Alexandre Alexandre WebApp Alexandre Alexandre 67
  • 68. Na prática, N usuário diferentes farão o acesso Alexandre Túlio WebApp Luciana Lula 68
  • 70. CSV Data Set Config 70
  • 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. Uso da variávél definida no CSV Data Set Config 72
  • 73. Reexecutar os testes da aplicação Stateful com um arquivo CSV para variar o usuário enviado. Enriqueça seus testes 73
  • 74. JSF 74
  • 75. Buscador 75
  • 76. Buscador tamanho do cache de resultados no servidor 76
  • 77. Buscador 77
  • 78. Buscador StringBuffer CACHE 5 4 index.jsp 2 memoryleak.jsp BuscadorBean.java (JSP) (JSF) 6 (JAVA) 3 1 7 78
  • 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
  • 84. Buscador StringBuffer CACHE 5 4 index.jsp 2 memoryleak.jsp BuscadorBean.java (JSP) (JSF) 6 (JAVA) 3 1 7 84
  • 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. 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. 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
  • 89. jMeter recuperação dinâmica de valores Referência ao valor recuperado 89
  • 90. Utilização do valor recuperado anteriormente. 90
  • 91. JMeter gravação do test case HTTP Proxy Server na Workbench 91
  • 93. 93
  • 95. HTTP Proxy Server 93
  • 100. 96
  • 101. 97
  • 102. 98
  • 104. Execute a suíte de testes TesteDeMemoryLeak 100
  • 105. 1o. teste Clique no link da primeira página 101
  • 106. 2o. teste Simulação de uma consulta Memória alocada 102
  • 107. Olhando de perto, há algo errado... 103
  • 108. 1a. req JSESSIONID=A6421... 2a. req JSESSIONID=97F97... 104
  • 109. JSESSIONID=A6421... 2a. req JSESSIONID=97F97... 104
  • 110. 2a. req JSESSIONID=97F97... 104
  • 113. Mas, de carga, este teste não tem nada. 107
  • 114. Apenas 1 thread sendo instanciada 108
  • 116. 6EEF3... 278B2... 110 98
  • 117. 111
  • 118. 2 iterações do que estiver dentro do Loop Controller 112
  • 119. 113
  • 121. 115
  • 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. 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. Em resumo... 118
  • 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. 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. 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. 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. 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
  • 132. 123
  • 133. 124
  • 134. 124
  • 135. E se a página JSF tivesse dezenas de campos? 125
  • 136. E se a página JSF tivesse dezenas de campos? #fail 125
  • 137. 126
  • 140. Proxy 129
  • 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. Usar JMeter para teste de aplicações web stateful e JSF. Siga passo a passo para sensibilizar-se com o problema 132
  • 145. Test Plan Define toda a estratégia de teste. 134
  • 146. Thread Group Threads a serem instanciadas para execução do Plano de Testes 135
  • 147. Controllers Logic Sampler Controller Núcleo do Plano de Teste 136
  • 148. Sampler Controller Gerador de requisições 137
  • 149. Logic Controller Define quando será o envio das requisições dos Samplers 138
  • 150. Listeners Apresenta informações coletadas pelo Plano de Teste durante sua execução 139
  • 152. Assertions Verifica se o teste está gerando os resultados esperados 141
  • 153. 142
  • 154. Tomcoat 143
  • 155. Tomcat 144
  • 156. Configuration Elements Usados para adicionar ou modificar requisições 145
  • 157. Configuration Elements Usados para adicionar ou modificar requisições 145
  • 158. Pre-Processors Modifica a requisição antes de ser enviada pelo Sampler 146
  • 159. Post-Processors Extração de dados da resposta HTTP 147
  • 160. Ordem de Execução 1. Configuration elements 2. Pre-Processors 3. Timers 4. Sampler 5. Post-Processors 6. Assertions 7. Listeners 148
  • 161. Propriedades jmeter.properties ... log_level.jmeter=INFO log_level.jmeter.junit=DEBUG user.properties=user.properties system.properties=system.properties ... 149
  • 163. ! 151
  • 164. ! 152
  • 165. slaves master $JMETER_HOME/bin/jmeter-server $JMETER_HOME/bin/jmeter $JMETER_HOME/bin/jmeter-server $JMETER_HOME/bin/jmeter-server 153
  • 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. 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. Slave $ ./jmeter-server $ tail -f JMETER_HOME/bin/jmeter-server.log 156
  • 169. 157
  • 170. Repita, em modo distribuído, todos os testes anteriores Negocie o uso de máquinas de colegas. 158
  • 171. 159
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. Q&A

Editor's Notes

  1. Regra b&amp;#xE1;sica.
  2. Teste simples do contexto raiz da aplica&amp;#xE7;&amp;#xE3;o.
  3. Programa&amp;#xE7;&amp;#xE3;o em BASH do teste de carga.
  4. Vejamos agora como trabalhar com aplica&amp;#xE7;&amp;#xF5;es que mant&amp;#xE9;m estado de execu&amp;#xE7;&amp;#xE3;o.
  5. Em nossa aplica&amp;#xE7;&amp;#xE3;o exemplo, h&amp;#xE1; 3 JSPs e 1 Servlet que se interagem da seguinte forma.
  6. Ent&amp;#xE3;o, o usu&amp;#xE1;rio acessa o primeiro JSP pelo browser, preenche seu nome e clica OK, que gera um requisi&amp;#xE7;&amp;#xE3;o para a Servlet que recebe o nome preenchido e armazena-o na sess&amp;#xE3;o do usu&amp;#xE1;rio, devolvendo-lhe um segundo JSP. Neste JSP, o usu&amp;#xE1;rio seleciona algum link, que o leva a um terceiro JSP, que recupera da sess&amp;#xE3;o o nome preenchido na primeira p&amp;#xE1;gina.
  7. O primeiro teste &amp;#xE9; trivial. S&amp;#xF3; criar um Sampler com a URL raiz da aplica&amp;#xE7;&amp;#xE3;o web.
  8. O teste da chamada da Servlet deve simular o envio do par&amp;#xE2;metro pela p&amp;#xE1;gina index.jsp
  9. O teste da p&amp;#xE1;gina funcionalidade1.jsp deve faz&amp;#xEA;-la recuperar o atributo &amp;#x2018;nome&amp;#x2019; da sess&amp;#xE3;o do usu&amp;#xE1;rio.
  10. Perceba que o par&amp;#xE2;metro nome foi recebido pela requisi&amp;#xE7;&amp;#xE3;o e inclu&amp;#xED;do no resultado do JSP.
  11. No primeiro teste, um identificador de sess&amp;#xE3;o de usu&amp;#xE1;rio &amp;#xE9; criado.
  12. Mas no segundo teste, um outro identificador de sess&amp;#xE3;o &amp;#xE9; criado.
  13. E na terceira requisi&amp;#xE7;&amp;#xE3;o, outro JSESSIONID &amp;#xE9; criado! (:-O Ou seja, n&amp;#xE3;o est&amp;#xE1; havendo o controle desses JSESSIONID para que a sess&amp;#xE3;o do usu&amp;#xE1;rio seja mantida.
  14. Geralmente, JSESSIONIDs s&amp;#xE3;o armazenados em cookie, nativamente suportados em web browsers, mas n&amp;#xE3;o no JMeter.
  15. Usaremos uma simples aplica&amp;#xE7;&amp;#xE3;&amp;#xF5; JSF que simula um sistema de busca.
  16. A cada pesquisa realizada retorna um resultado que &amp;#xE9; armazenado em um cache do servidor.
  17. O cache cresce a cada nova pesquisa, simulando um Memory Leak.
  18. 1. Clique no link &amp;#x201C;Memory Leak&amp;#x201D; para apresenta&amp;#xE7;&amp;#xE3;o da p&amp;#xE1;gina memoryleak.jsp 2. Chamada &amp;#xE0; p&amp;#xE1;gina memoryleak.jsp 3. Clique no bot&amp;#xE3;o &amp;#x201C;Buscar&amp;#x201D; 4. Execu&amp;#xE7;&amp;#xE3;o da &amp;#x201C;regra&amp;#x201D; de busca, com persist&amp;#xEA;ncia dos dados recuperados no cache (5) ...
  19. Simula&amp;#xE7;&amp;#xE3;o do clique no link da p&amp;#xE1;gina index.jsp para abertura da p&amp;#xE1;gina memoryleak.jsp onde ser&amp;#xE3;o feitas as pesquisas.
  20. Resultado do teste. P&amp;#xE1;gina memoryleak.jsp aberta.
  21. Clique no bot&amp;#xE3;o de pesquisa.
  22. Campos HTML gerados por p&amp;#xE1;ginas JSF t&amp;#xEA;m nomeclatura estranha.
  23. Outros campos, tem conte&amp;#xFA;do mais estranho ainda. Seus valores s&amp;#xE3;o definidos em tempo de execu&amp;#xE7;&amp;#xE3;o, o que torna invi&amp;#xE1;vel a cria&amp;#xE7;&amp;#xE3;o de scripts de testes.
  24. O ideal &amp;#xE9; descobrir esses valores din&amp;#xE2;micos em tempo de execu&amp;#xE7;&amp;#xE3;o e utiliz&amp;#xE1;-los para alimentar as configura&amp;#xE7;&amp;#xF5;es do script de testes.
  25. Ap&amp;#xF3;s a primeira requisi&amp;#xE7;&amp;#xE3;o, capture o valor da express&amp;#xE3;o regular &amp;#x201C;(.+?)&amp;#x201D; retornado e guarde-o na vari&amp;#xE1;vel jsfViewState.
  26. O p&amp;#xF3;s-processamento ocorre ap&amp;#xF3;s a primeira requisi&amp;#xE7;&amp;#xE3;o
  27. Requisi&amp;#xE7;&amp;#xE3;o para teste da funcionalidade de busca. Perceba o conjunto de par&amp;#xE2;metros para simula&amp;#xE7;&amp;#xE3;o do preenchimento do formul&amp;#xE1;rio.
  28. A forma mais f&amp;#xE1;cil de se configurar samplers para o teste de JSF &amp;#xE9; gerando-os automaticamente a partir da dupla Recording Controller e HTTP Proxy Server.
  29. A forma mais f&amp;#xE1;cil de se configurar samplers para o teste de JSF &amp;#xE9; gerando-os automaticamente a partir da dupla Recording Controller e HTTP Proxy Server.
  30. Configure o browser para utilizar o HTTP Proxy Server do JMeter e execute a aplica&amp;#xE7;&amp;#xE3;o pelo navegador.
  31. Ao final da execu&amp;#xE7;&amp;#xE3;o via browser, finalize o HTTP Proxy Server e verifique os Samplers criados sob o Recording Controller.
  32. HTTP Sampler gerado para simula&amp;#xE7;&amp;#xE3;o da funcionalidade de busca, que &amp;#xE9; o que nos mais interessa, pela complexidade dos campos gerados pelo JSF.
  33. Finalizado o teste: - Remova os samplers que n&amp;#xE3;o forem interessantes para o TestSuite - Reposicione os samplers interessantes no TestSuite - Substitua valores fixos por vari&amp;#xE1;veis, se necess&amp;#xE1;rio (e.g. ${jsfViewState}) - Apague Recording Controller e HTTP Proxy Server (opcional)
  34. Cada requisi&amp;#xE7;&amp;#xE3;o est&amp;#xE1; criando uma sess&amp;#xE3;o de usu&amp;#xE1;rio diferente.
  35. Cada requisi&amp;#xE7;&amp;#xE3;o est&amp;#xE1; criando uma sess&amp;#xE3;o de usu&amp;#xE1;rio diferente.
  36. Ap&amp;#xF3;s o HTTP Cookie Manager, a primeira requisi&amp;#xE7;&amp;#xE3;o cria a sess&amp;#xE3;o do usu&amp;#xE1;rio e a segunda reutiliza-a.
  37. Incrementar o n&amp;#xFA;mero de threads para a suite n&amp;#xE3;o provocar&amp;#xE1; o estouro de mem&amp;#xF3;ria.
  38. Cada thread est&amp;#xE1; criando uma nova sess&amp;#xE3;o. Ainda n&amp;#xE3;o &amp;#xE9; isso que queremos. Queremos executar a busca v&amp;#xE1;rias vezes dentro de uma mesma sess&amp;#xE3;o, para que haja o ac&amp;#xFA;mulo de mem&amp;#xF3;ria atrav&amp;#xE9;s do crescimento do cache simulado.
  39. O controlador Loop Controller possibilita a itera&amp;#xE7;&amp;#xE3;o de um conjunto de Samplers.
  40. Para cada requisi&amp;#xE7;&amp;#xE3;o &amp;#xE0; p&amp;#xE1;gina memoryleak.jsp, duas requisi&amp;#xE7;&amp;#xF5;es de busca ser&amp;#xE3;o executadas.
  41. Para melhor legibilidade, demos nomes significativos pra cada Sampler.
  42. - Para cada requisi&amp;#xE7;&amp;#xE3;o &amp;#xE0; p&amp;#xE1;gina de abertura do sistema, duas simula&amp;#xE7;&amp;#xF5;es de busca foram executadas. - As duas requisi&amp;#xE7;&amp;#xF5;es &amp;#xE0; p&amp;#xE1;gina de abertura foram configuradas no Thread Group. Cada thread criou uma JSESSIONID pr&amp;#xF3;pria. &amp;#xC9; como se fossem dois usu&amp;#xE1;rios distintos. - As duas simula&amp;#xE7;&amp;#xF5;es de busca foram configuradas no Loop Controller. Ambas as simula&amp;#xE7;&amp;#xF5;es utilizam a mesma sess&amp;#xE3;o da thread.
  43. Cada par de simula&amp;#xE7;&amp;#xE3;o de busca utiliza a sess&amp;#xE3;o de uma thread.
  44. E com isso, conseguimos automatizar a simula&amp;#xE7;&amp;#xE3;o do memory leak.
  45. - Ap&amp;#xF3;s a primeira requisi&amp;#xE7;&amp;#xE3;o, o ViewState &amp;#xE9; criado. - Nas requisi&amp;#xE7;&amp;#xF5;es subsequentes, o ViewState deve ser reenviado para correta manuten&amp;#xE7;&amp;#xE3;o de estado dos componentes JSF
  46. Ent&amp;#xE3;o, no JSF, funciona assim... (explicar) S&amp;#xF3; que o valor obtido na primeira resposta deve ser exatamemente o valor utilizado nas reqs posteriores. Logo, sempre teremos que executar a primeira requisi&amp;#xE7;&amp;#xE3;o, aguardar a resposta, coletar manualmente o valor gerado e inform&amp;#xE1;-los nos samplers seguintes, o que acaba gerando um grande desperd&amp;#xED;cio de tempo no processo de testes.
  47. Ent&amp;#xE3;o, no JSF, funciona assim... (explicar) S&amp;#xF3; que o valor obtido na primeira resposta deve ser exatamemente o valor utilizado nas reqs posteriores. Logo, sempre teremos que executar a primeira requisi&amp;#xE7;&amp;#xE3;o, aguardar a resposta, coletar manualmente o valor gerado e inform&amp;#xE1;-los nos samplers seguintes, o que acaba gerando um grande desperd&amp;#xED;cio de tempo no processo de testes.
  48. Ent&amp;#xE3;o, no JSF, funciona assim... (explicar) S&amp;#xF3; que o valor obtido na primeira resposta deve ser exatamemente o valor utilizado nas reqs posteriores. Logo, sempre teremos que executar a primeira requisi&amp;#xE7;&amp;#xE3;o, aguardar a resposta, coletar manualmente o valor gerado e inform&amp;#xE1;-los nos samplers seguintes, o que acaba gerando um grande desperd&amp;#xED;cio de tempo no processo de testes.
  49. Ent&amp;#xE3;o, no JSF, funciona assim... (explicar) S&amp;#xF3; que o valor obtido na primeira resposta deve ser exatamemente o valor utilizado nas reqs posteriores. Logo, sempre teremos que executar a primeira requisi&amp;#xE7;&amp;#xE3;o, aguardar a resposta, coletar manualmente o valor gerado e inform&amp;#xE1;-los nos samplers seguintes, o que acaba gerando um grande desperd&amp;#xED;cio de tempo no processo de testes.
  50. Ent&amp;#xE3;o, no JSF, funciona assim... (explicar) S&amp;#xF3; que o valor obtido na primeira resposta deve ser exatamemente o valor utilizado nas reqs posteriores. Logo, sempre teremos que executar a primeira requisi&amp;#xE7;&amp;#xE3;o, aguardar a resposta, coletar manualmente o valor gerado e inform&amp;#xE1;-los nos samplers seguintes, o que acaba gerando um grande desperd&amp;#xED;cio de tempo no processo de testes.
  51. - Pra ficar mais din&amp;#xE2;mico, a gente captura o valor em tempo de execu&amp;#xE7;&amp;#xE3;o, logo ap&amp;#xF3;s a primeira requisi&amp;#xE7;&amp;#xE3;o, guarda-o em uma vari&amp;#xE1;vel e o reutiliza nas pr&amp;#xF3;ximas requisi&amp;#xE7;&amp;#xF5;es.
  52. Como eu soube que esses eram os dados a serem enviados pelo JMeter?
  53. Ora, eu entrei na p&amp;#xE1;gina...
  54. ...e vi o c&amp;#xF3;digo fonte.
  55. Na pr&amp;#xE1;tica, isso funciona da seguinte forma:
  56. Na verdade, este proxy &amp;#xE9; um elemento do JMeter e tem o nome de HTTP Proxy Server.
  57. 1a parte: buscador.war 2a parte: aplica&amp;#xE7;&amp;#xE3;o real
  58. P&amp;#xE1;gina principal do Tomcat cont&amp;#xE9;m a mensagem &amp;#x201C;Thanks for using Tomcat!&amp;#x201D;
  59. - Deseja-se que toda resposta de HTTP Request contenha a string &amp;#x201C;Thanks for using Tomcoat&amp;#x201D; - A string n&amp;#xE3;o &amp;#xE9; encontrada na resposta e o teste falha.
  60. - Deseja-se que toda resposta de HTTP Request contenha a string &amp;#x201C;Thanks for using Tomcat&amp;#x201D; - Teste bem sucedido!
  61. [ToDo] Detalhar?
  62. Chega uma hora que o jmeter n&amp;#xE3;o consegue gerar a carga de requisi&amp;#xE7;&amp;#xF5;es desejada.
  63. Nesses casos, &amp;#xE9; necess&amp;#xE1;rio pedir ajuda.
  64. Com o jmeter, &amp;#xE9; poss&amp;#xED;vel executar testes distribu&amp;#xED;dos.
  65. - N&amp;#xE3;o deixem de conferir a documenta&amp;#xE7;&amp;#xE3;o. - Teste banco, FTP, ldap, webservice, JMS....