Tutorial: Executar um teste de carga para identificar gargalos de desempenho em um aplicativo Web

Neste tutorial, você aprenderá a identificar gargalos de desempenho em um aplicativo Web usando a versão prévia do Teste de Carga do Azure. Você criará um teste de carga para um aplicativo Node.js de exemplo.

O aplicativo de exemplo é composto por uma API Web do Node.js que interage com um banco de dados NoSQL. Você implantará a API Web em aplicativos Web do Serviço de Aplicativo do Azure e usará o Azure Cosmos DB como o banco de dados.

Saiba mais sobre os principais conceitos para o Teste de Carga do Azure.

Neste tutorial, você aprenderá como:

  • Implantar o aplicativo de exemplo.
  • Criar e executar um teste de carga.
  • Identificar gargalos de desempenho no aplicativo.
  • Remover um gargalo.
  • Executar novamente o teste de carga para verificar as melhorias de desempenho.

Importante

O Teste de Carga do Azure está em versão prévia. Para os termos legais que se aplicam aos recursos do Azure que estão em versão beta, versão prévia ou que, de outra forma, ainda não foram lançados em disponibilidade geral, confira os Termos de Uso Complementares para Versões Prévias do Microsoft Azure.

Pré-requisitos

  • Uma conta do Azure com uma assinatura ativa. Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.
  • CLI do Azure, versão 2.2.0 ou posterior. Execute az --version para localizar a versão que está instalada em seu computador. Se precisar instalar ou atualizar a CLI, do Azure, confira Como instalar a CLI do Azure.
  • Visual Studio Code. Caso ainda não o tenha, baixe-o e instale-o.
  • Git. Caso ainda não o tenha, baixe-o e instale-o.

Implantar o aplicativo de exemplo

Antes de poder fazer o teste de carga no aplicativo de exemplo, você precisa implantá-lo e executá-lo. Use comandos da CLI do Azure, do Git e do PowerShell para fazer isso.

  1. Abra o Windows PowerShell, entre no Azure e defina a assinatura:

    az login
    az account set --subscription <your-Azure-Subscription-ID>
    
  2. Clone o repositório de origem do aplicativo de exemplo:

     git clone https://github.com/Azure-Samples/nodejs-appsvc-cosmosdb-bottleneck.git
    

    O aplicativo de exemplo é um aplicativo Node.js que consiste de um componente Web de Serviço de Aplicativo do Azure e um banco de dados do Azure Cosmos DB. O repositório inclui um script do PowerShell que implanta o aplicativo de exemplo em sua assinatura do Azure. Ele também tem um script Apache JMeter que você usará em etapas posteriores.

  3. Acesse o diretório do aplicativo Node.js e implante o aplicativo de exemplo usando este script do PowerShell:

     cd nodejs-appsvc-cosmosdb-bottleneck
     .\deploymentscript.ps1
    

    Dica

    Você pode instalar o PowerShell Core no Linux/WSL ou macOS.

    Depois de instalá-lo, você pode executar o comando anterior como pwsh ./deploymentscript.ps1.

  4. No prompt, forneça:

    • Sua ID da assinatura do Azure.
    • Um nome exclusivo para o aplicativo Web.
    • Um local. Por padrão, o local é eastus. Você pode obter códigos de região executando o comando Get-AzLocation.

    Importante

    Use apenas letras minúsculas e números no nome do aplicativo Web. Não use espaços nem caracteres especiais.

  5. Depois de concluir a implantação, acesse o aplicativo de exemplo em execução abrindo https://<yourappname>.azurewebsites.net em uma janela do navegador.

  6. Para ver os componentes do aplicativo, entre no portal do Azure e acesse o grupo de recursos criado.

    Screenshot that shows the list of Azure resource groups.

Agora que o aplicativo está implantado e em execução, você pode executar o primeiro teste de carga nele.

Configurar e criar o teste de carga

Nesta seção, você criará um teste de carga usando um script de teste Apache JMeter de exemplo.

O repositório de origem do aplicativo de exemplo inclui um script Apache JMeter chamado SampleApp.jmx. Esse script executa três chamadas à API ao aplicativo Web em cada iteração de teste:

  • add: executa uma operação de inserção de dados no Azure Cosmos DB para o número de visitantes no aplicativo Web.
  • get: executa uma operação GET do Azure Cosmos DB para recuperar a contagem.
  • lasttimestamp: atualiza o carimbo de data/hora desde que o último usuário entrou no site.

Observação

O script Apache JMeter de exemplo requer dois plug-ins: Custom Thread Groups e Throughput Shaping Timer. Para abrir o script na instância local do Apache JMeter, você precisa instalar os dois plug-ins. Para isso, você pode usar o Gerenciador de plug-ins do Apache JMeter.

Criar o recurso de Teste de Carga do Azure

O Teste de Carga é um recurso de nível superior para suas atividades de teste de carga. Esse recurso fornece um local centralizado para exibir e gerenciar testes de carga, resultados de teste e artefatos relacionados.

Se você já tem um recurso de Teste de Carga, ignore esta seção e prossiga para Criar um teste de carga.

Se você ainda não tem um recurso de Teste de Carga, crie um agora:

  1. Entre no portal do Microsoft Azure usando as credenciais de assinatura do Azure.

  2. Clique no botão de menu no canto superior esquerdo do portal e selecione + Criar um recurso.

    Screenshot that shows the button for creating a resource.

  3. Use a barra de pesquisa para localizar Teste de Carga do Azure.

  4. Selecione Teste de carga do Azure.

  5. No painel Teste de Carga do Azure, selecione Criar.

    Screenshot that shows the Azure Load Testing pane.

  6. Forneça as informações a seguir para configurar seu novo recurso do Teste de Carga do Azure:

    Campo Descrição
    Assinatura Selecione a assinatura do Azure que deseja usar para esse recurso de Teste de Carga do Azure.
    Grupo de recursos Selecione um grupo de recursos existente. Ou selecione Criar e insira um nome exclusivo para o novo grupo de recursos.
    Nome Insira um nome exclusivo para identificar o recurso de Teste de Carga do Azure.
    O nome não pode conter caracteres especiais, como \/""[]:|<>+=;,?*@& nem espaços em branco. O nome não pode começar com um sublinhado (_) e não pode terminar com um ponto (.) ou um traço (-). O comprimento deve ser entre 1 e 64 caracteres.
    Localidade Selecione um local geográfico para hospedar o recurso de Teste de Carga do Azure.
    Esse local também determina onde os mecanismos de teste são hospedados e de onde as solicitações do cliente JMeter originam.

    Observação

    Você também pode configurar mais detalhes na guia Marcas. As marcas são pares nome/valor que permitem categorizar recursos e exibir a cobrança consolidada por meio da aplicação da mesma marca a vários recursos e grupos de recursos.

  7. Depois de concluir a configuração do recurso, clique em Examinar + Criar.

  8. Examine todas as definições e selecione Criar para iniciar a implantação do recurso de Teste de Carga do Azure.

    Quando o processo for finalizado, será exibida uma mensagem de êxito da implantação.

  9. Para exibir o novo recurso, selecione Ir para o recurso.

    Screenshot that shows the deployment completion screen.

  10. Opcionalmente, gerencie o acesso ao recurso do Teste de Carga do Azure.

    O Teste de Carga do Azure usa o RBAC (controle de acesso baseado em função) para gerenciar permissões para seu recurso. Se você encontrar essa mensagem, sua conta não terá as permissões necessárias para gerenciar testes.

    Screenshot that shows an error message in the Azure portal that you're not authorized to use the Azure Load Testing resource.

Criar um teste de carga

Para criar um teste de carga no recurso de Teste de Carga do aplicativo de exemplo:

  1. Acesse o recurso Teste de Carga e selecione Criar novo teste na barra de comandos.

    Screenshot that shows the button for creating a new test.

  2. Na guia Básico, insira o Nome do teste e as informações de Descrição do teste. Como opção, você pode selecionar a caixa Executar teste após a criação para iniciar o teste de carga automaticamente depois de criá-lo.

    Screenshot that shows the Basics tab for creating a test.

  3. Na guia Plano de teste, selecione o método de teste Script do JMeter e o script de teste SampleApp.jmx do diretório do aplicativo de exemplo clonado. Depois, selecione Carregar para carregar o arquivo no Azure e configurar o teste de carga.

    Screenshot that shows the Test plan tab and how to upload an Apache JMeter script.

    Como opção, você pode selecionar e carregar arquivos de configuração adicionais do Apache JMeter ou outros arquivos referenciados no arquivo JMX. Por exemplo, se o script de teste usar conjuntos de dados CSV, você poderá carregar os arquivos .csv correspondentes.

  4. Na guia Parâmetros, adicione uma nova variável de ambiente. Insira webapp no Nome e no Valor. Substitua o texto do espaço reservado <yourappname> pelo nome do aplicativo de exemplo recém-implantado. Não inclua o prefixo https://.

    O script de teste do Apache JMeter usa a variável de ambiente para recuperar a URL do aplicativo Web. Em seguida, o script invocará as três APIs no aplicativo Web.

    Screenshot that shows the parameters tab to add environment variable.

  5. Na guia Carga, configure os detalhes a seguir. Para este tutorial, você pode usar o valor padrão.

    Configuração Valor Descrição
    Instâncias de mecanismo 1 O número de mecanismos de teste paralelos que executam o script Apache JMeter.

    Screenshot that shows the Load tab for creating a test.

  6. Na guia Monitoramento, especifique os componentes do aplicativo que deseja monitorar com as métricas de recurso. Selecione Adicionar/modificar para gerenciar a lista de componentes de aplicativos.

    Screenshot that shows the Monitoring tab for creating a test.

    Screenshot that shows how to add Azure resources to monitor during the load test.

    Screenshot that shows the Monitoring tab with the list of Azure resources to monitor.

  7. Selecione Examinar + criar, examine todas as configurações e selecione Criar.

    Screenshot that shows the tab for reviewing and creating a test.

Observação

Você pode atualizar a configuração de teste a qualquer momento, por exemplo, para carregar um arquivo JMX diferente. Escolha o teste na lista de testes e, em seguida, selecione Editar.

Executar o teste de carga no portal do Azure

Nesta seção, você usará o portal do Azure para iniciar manualmente o teste de carga criado anteriormente. Caso tenha marcado a caixa Executar teste após a criação, o teste já estará em execução.

  1. Selecione Testes para exibir a lista de testes e escolha aquele que você criou.

    Screenshot that shows the list of tests.

    Dica

    Você pode usar a caixa de pesquisa e o filtro Intervalo de tempo para limitar o número de testes.

  2. Na página que mostra os detalhes do teste, selecione Executarou Executar teste.

    Screenshot that shows selections for running a test.

  3. Selecione Executar na página de resumo da execução para iniciar o teste de carga. Você verá a lista de execuções de teste.

    Screenshot that shows the run summary page.

    O Teste de Carga do Azure começa a monitorar e exibir as métricas do servidor do aplicativo no painel.

    Você pode ver a transmissão das métricas do lado do cliente enquanto o teste está em execução. Por padrão, os resultados são atualizados automaticamente a cada cinco segundos.

    Screenshot that shows the dashboard with test results.

    Você pode aplicar vários filtros ou agregar os resultados a percentis diferentes para personalizar os gráficos.

    Dica

    Você pode interromper um teste de carga a qualquer momento no portal do Azure selecionando Parar.

Aguarde até que o teste de carga seja totalmente concluído antes de seguir para a próxima seção.

Identificar gargalos de desempenho

Nesta seção, você analisará os resultados do teste de carga para identificar gargalos de desempenho no aplicativo. Examine as métricas do lado do cliente e do lado do servidor para determinar a causa raiz do problema.

  1. Primeiro, analise as métricas do lado do cliente. Você observará que o 90º percentil da métrica Tempo de resposta para as solicitações de API e get é maior do que para a API lasttimestamp.

    Screenshot that shows the client-side metrics.

    Você pode ver um padrão semelhante para Erros, em que a API tem menos erros do que as outras.

    Screenshot that shows the error chart.

    Os resultados das APIs add e get são semelhantes, enquanto a API lasttimestamp se comporta de maneira diferente. A causa pode estar relacionada ao banco de dados, porque as APIs add e get envolvem acesso ao banco de dados.

  2. Para investigar esse gargalo mais detalhadamente, role para baixo até a seção do painel Métricas do lado do servidor.

    As métricas do lado do servidor mostram informações detalhadas sobre os componentes do aplicativo do Azure: Plano do Serviço de Aplicativo do Azure, Aplicativo Web do Serviço de Aplicativo do Azure e Azure Cosmos DB.

    Screenshot that shows the Azure App Service plan metrics.

    Nas métricas do Plano do Serviço de Aplicativo do Azure, você pode ver que as métricas Percentual de CPU e Percentual de Memória estão dentro de um intervalo aceitável.

  3. Agora, analise métricas do lado do servidor do Azure Cosmos DB.

    Screenshot that shows Azure Cosmos DB metrics.

    Note que a métrica Consumo de RU Normalizado mostra que o banco de dados estava sendo executado rapidamente, com utilização de recursos de 100%. O alto uso de recursos pode ter causado erros de limitação do banco de dados. Isso também pode ter aumentado os tempos de resposta para as APIs Web add e get.

    Você também pode ver que a métrica Taxa de transferência provisionada para a instância do Azure Cosmos DB tem uma taxa de transferência máxima de 400 RUs. É possível resolver o problema de desempenho aumentando a taxa de transferência provisionada do banco de dados.

Aumentar a taxa de transferência do banco de dados

Nesta seção, você alocará mais recursos ao banco de dados para resolver o gargalo de desempenho.

Para o Azure Cosmos DB, aumente a configuração de escala de RU do banco de dados:

  1. Vá para o recurso do Azure Cosmos DB que você provisionou como parte da implantação do aplicativo de exemplo.

  2. Selecione a guia Data Explorer.

    Screenshot that shows Data Explorer tab.

  3. Selecione Escala Configurações e atualize o valor da taxa de transferência para 1200.

    Screenshot that shows the updated Azure Cosmos D B scale settings.

  4. Selecione Salvar para confirmar as alterações.

Validar as melhorias de desempenho

Agora que aumentou a taxa de transferência do banco de dados, execute novamente o teste de carga e verificará se os resultados do desempenho melhoraram:

  1. Retorne à página que mostra os detalhes da execução de teste e selecione Executar novamente. Depois selecione Executar na página de resumo da execução.

    Screenshot that shows selections for running the load test.

    Você verá uma nova entrada de execução de teste com uma coluna status que percorre em ciclos os estados de Provisionando, Executando e Concluído. A qualquer momento, selecione a execução de teste para monitorar como o teste de carga está progredindo.

  2. Após a conclusão do teste de carga, verifique os resultados de Tempo de resposta e de Erros nas métricas do lado do cliente.

  3. Verifique as métricas do lado do servidor para o Azure Cosmos DB e verifique se o desempenho melhorou.

    Screenshot that shows the Azure Cosmos D B client-side metrics after update of the scale settings.

    O Consumo de RU Normalizado do Azure Cosmos DB agora está bem abaixo de 100%.

Agora que você alterou as configurações de escala do banco de dados, verá que:

  • O tempo de resposta das APIs adde get melhorou.
  • O consumo de RU normalizado permanece bem abaixo do limite.

Como resultado, o desempenho geral do aplicativo foi aprimorado.

Limpar os recursos

Importante

Você pode reutilizar o recurso de Teste de Carga do Azure que criou para outros tutoriais de Teste de Carga do Azure e artigos de instruções.

Se você não pretende usar nenhum dos recursos criados, exclua-os para não gerar custos. Se você implantou o aplicativo de exemplo em um grupo de recursos diferente, talvez queira repetir as etapas a seguir.

Para excluir recursos usando o portal do Azure:

  1. Clique no botão de menu no canto superior esquerdo e selecione Grupos de recursos.

  2. Selecione o grupo de recursos que você criou por meio da lista.

  3. Selecione Excluir grupo de recursos. Screenshot of the selections to delete a resource group in the Azure portal.

  4. Insira o nome do grupo de recursos. Em seguida, selecione Excluir.

Para excluir recursos usando a CLI do Azure, insira o seguinte comando:

az group delete --name <yourresourcegroup>

Lembre-se de que excluir o grupo de recursos exclui todos os recursos dentro dele.

Próximas etapas

Avance para o próximo tutorial para saber como configurar um fluxo de trabalho de teste de regressão automatizado usando o Azure Pipelines ou o GitHub Actions.