Como prevenir problemas de performance em sua aplicação

 

Um dos grandes desafios que as empresas de TI enfrentam ao colocar seus sistemas em produção é a impossibilidade de garantir o desempenho e a confiabilidade destas aplicações.

 

Não raro sites muito visitados não conseguem comportar a quantidade de acessos. Um bom exemplo disto são as falhas que acontecem quando empresas aéreas disponibilizam promoções a partir de um certo horário de um determinado dia. Alguns sistemas têm graves problemas de desempenho em um período específico do dia ou sempre no mesmo dia da semana, o que dificulta bastante o diagnóstico, pois a equipe terá que esperar até o próximo dia para que o erro volte a acontecer.

 

Em ambiente de desenvolvimento, estes gargalos são dificilmente detectados e na maioria das vezes os responsáveis pelo sistema – já em produção – são chamados com urgência para apagar o incêndio.

 

No entanto, há uma forma mais satisfatória e mais oportuna para se evitar este tipo de dificuldade: utilizando o Silk Performer da Borland.

 

O Silk Performer é uma ferramenta robusta e fácil de usar, que permite que você desenhe, construa, execute e avalie testes de carga e performance. Seu principal objetivo é detectar gargalos e falhas na aplicação, apontando as causas destes problemas. Com isto, ele minimiza a probabilidade do sistema não estar de acordo com os requisitos de desempenho.

 

A criação do teste inicia-se com a utilização do Recorder (imagem 1), que grava todas as ações do usuário e gera um script com base nestas ações. Este, por sua vez, é alterável e bastante fácil de entender, porém não será necessário modificá-lo, pois praticamente todas as tarefas do Silk Performer são executadas por meio dos wizards.

 

image001.gif

1 - Recorder do Silk Performer

 

Após a gravação deste script, é possível realizar uma simulação das ações tomadas no passo anterior.

 

Para tanto, é preciso criar perfis de usuários representativos de seus próprios clientes para esta simulação. Definem-se nestes perfis:

- a velocidade de conexão com a internet;

- o navegador utilizado;

- o tempo médio de resposta do usuário com o sistema;

- usuário e senha, caso esteja conectando em um servidor remoto;

- se imagens serão baixadas do servidor ao acessar o sistema (imagens normalmente são pesadas e sobrecarregam muito a rede);

- outros.

 

Antes de executar a simulação, é possível também configurar dados dos formulários da sua aplicação. Para cada campo de entrada de dados do seu sistema, podem-se colocar variáveis para que cada vez que a simulação aconteça, uma informação diferente apareça neste campo. Basta cadastrar alguns números, válidos ou não, no Silk Performer para verificar, ao executar o teste, se a validação de um campo (um número de CPF, por exemplo) está correta.

 

Até o momento, o objetivo principal foi gravar um script abrangente e que atendesse às necessidades para o teste de performance do sistema. O próximo passo é testar este script e analisar os resultados obtidos. Parte das informações colhidas compreende:

            - tempo de resposta das transações (mínimo, máximo, médio);

            - tempo em que o servidor esteve ocupado (server busy);

            - quantidade de dados enviados e recebidos em cada formulário;

            - descrição dos erros, caso ocorram;

            - outros.

Estes dados são gerados em forma de relatório, mas também podem ser gravados em um repositório.

 

Se os resultados estiverem em um nível aceitável, basta então aprovar este script e seguir para o teste propriamente dito.

 

Há, no Silk Performer, seis modelos de teste de carga e performance:

          Queuing

         Cada usuário virtual inicia suas transações após certo tempo de espera na fila.

         Cada usuário executa suas tarefas apenas uma vez.

         O teste termina quando todos os usuários finalizam suas tarefas.

         O teste pode durar mais do que o tempo de simulação especificado em virtude do tempo de espera.

         Steady State

         Cada usuário começa suas transações sem tempo de espera.

         Há sempre o mesmo número de usuários executando.

         Cada usuário executa as tarefas repetidas vezes até que o tempo de simulação termine.

         Increasing

         Cada usuário começa a executar suas tarefas de acordo com um intervalo pré-estabelecido.

         Cada usuário executa as tarefas repetidas vezes até que o tempo de simulação termine.

         Este tipo de teste é importante para detectar em que momento o sistema ‘cai’ ou passa a fornecer tempos de resposta inaceitáveis.

         All Day

         Cada usuário começa e termina o teste de acordo com intervalos pré-estabelecidos.

         Cada usuário executa as tarefas repetidas vezes até que o tempo designado a ele termine.

         A carga é ajustável durante o teste.

         Este tipo de teste é útil para se representar cenários complexos e de longa duração.

         Dynamic

         Cada usuário começa e termina suas tarefas de acordo com as mudanças manuais feitas pelo executor do teste.

         Cada usuário executa as tarefas repetidas vezes até que seja interrompido.

         Um número máximo de usuários é escolhido e, de acordo com este limite, pode-se aumentar e diminuir a quantidade de usuários.

         É preciso parar o teste manualmente.

         Verification

         Um único usuário executa suas tarefas apenas uma vez.

 

Durante a execução dos testes é possível monitorar alguns dados: utilização de CPU, utilização de memória e a rapidez com a qual o computador se torna disponível para resolver a próxima tarefa. Se algum destes dados exceder um limite tolerável, é necessário desconsiderar as informações deste teste, pois seguramente o mau desempenho da máquina irá interferir nos resultados obtidos.

 

Concluídos os testes, faz-se a análise dos resultados finais. Informações - tanto do lado do cliente quanto do servidor - são colhidas e indicam onde está o problema. Gráficos são recursos muito interessantes para o exame de dados. Eles são produzidos ‘arrastando e soltando’ as informações do relatório gerado na área de criação do gráfico.

 

Há alguns exemplos de gráfico que podem fornecer informações esclarecedoras.

 

 

image002.gif

2 - Aplicação estável

 

A imagem 2 mostra uma aplicação estável, cujos indícios são:

            - Não há erros. Estes seriam representados por uma linha vermelha (Errors/sec)

            - A linha que representa transações/segundo (verde claro) cresce acompanhando a linha dos usuários ativos (linha azul), demonstrando que o servidor está conseguindo suportar as requisições.

- As linhas que representam dados enviados (verde escuro) e dados recebidos (laranja) seguem de acordo com a linha dos usuários ativos (linha azul), indicando que não há problemas na rede.

 

image003.gif

3 - Aplicação com problemas no servidor

 

Observa-se, na imagem 3, alguns indicativos de que esta aplicação pode estar com problemas em seu servidor: as linhas que representam transações/segundo (verde claro), dados enviados (verde escuro) e dados recebidos (laranja) começam a decrescer por volta de 20 usuários (note a linha azul, no ponto 20 do eixo y, onde as outras linhas começam a indicar problemas).

 

 

image004.gif

4 - Aplicação com problemas na rede

 

Possíveis problemas na rede são representados na imagem 4, pelos seguintes motivos:

         Erros aparecem por volta de 70 usuários.

         A linha que representa conexões concorrentes (roxa) começa a nivelar, indicando um provável problema de rede.

         A linha que representa dados enviados (verde escuro) e também a linha laranja (dados recebidos) seguem a linha de usuários ativos (azul), demonstrando não haver um problema no servidor.

 

Silk Performer é a ferramenta da praticidade e da eficiência que, sem exigir nenhum conhecimento de programação, torna possível criar um script de teste e aplicá-lo em um sistema para detectar problemas de servidor ou de rede, mas que pode também levar à conclusão de que sua aplicação está estável e pode entrar em produção sem problemas de performance.