Teste de desempenho e antipadrões para aplicativos em nuvem

Os antipadrões de desempenho, assim como os padrões de design, são processos e implementações comuns de defeitos nas organizações. São práticas comuns com grande probabilidade de causar problemas de escalabilidade quando um aplicativo está sob pressão. O conhecimento dessas práticas pode ajudar a simplificar a comunicação de conceitos de alto nível entre os profissionais de software, e o conhecimento de antipadrões pode ser útil ao revisar código ou diagnosticar problemas de desempenho.

Aqui está um cenário comum: um aplicativo se sai bem durante o teste de desempenho. Ele é liberado para produção e começa a lidar com cargas de trabalho reais. Nesse ponto, ele começa a apresentar mau desempenho – rejeitando solicitações do usuário, atrasando ou lançando exceções. A equipe de desenvolvimento enfrenta duas perguntas:

  • Por que não esse comportamento é exibido durante o teste?
  • Como podemos corrigir isso?

A resposta à primeira pergunta é simples. É difícil simular usuários reais em um ambiente de teste, com seus padrões de comportamento e os volumes de trabalho que eles podem executar. A única maneira totalmente garantida de compreender como um sistema se comporta sob carga é observá-lo em produção. Para ser claro, estamos não sugerindo que você deve ignorar o teste de desempenho. O teste de desempenho é essencial para se obter as métricas de desempenho da linha de base. Mas você deve estar preparado para observar e corrigir problemas de desempenho quando eles ocorrem no sistema de produção.

A resposta à segunda pergunta, como corrigir o problema, é menos direto. Qualquer número de fatores pode contribuir e, às vezes, o problema só se manifesta em determinadas circunstâncias. Instrumentação e registro em log são fundamentais para localizar a causa raiz, mas você também precisa saber o que procurar.

Com base em nossos contratos com clientes do Microsoft Azure, identificamos alguns dos problemas de desempenho mais comuns que os clientes veem em produção. Para cada antipadrão, descrevemos por que o antipadrão normalmente ocorre, sintomas de antipadrão e técnicas para resolver o problema. Nós também fornecemos um exemplo de código que ilustra o antipadrão e uma sugestão de solução de escalabilidade.

Esses antipadrões podem parecer óbvios quando você lê as descrições, mas eles ocorrem com mais frequência do que você imagina. Às vezes, um aplicativo herda um design que funcionou no local, mas não escala na nuvem. Ou um aplicativo pode iniciar com um design bem simples, mas à medida que novos recursos são adicionados, um ou mais desses antipadrões podem surgir. Independentemente, este guia ajudará você a identificar e corrigir esses antipadrões.

Catálogo de antipadrões

Aqui está a lista dos antipadrões que identificamos:

Antipadrão Descrição
Banco de dados ocupado Descarregando muito processamento para um armazenamento de dados.
Front-end ocupado Movendo tarefas de uso intensivo de recursos em threads em segundo plano.
E/S com ruídos Continuamente enviar várias solicitações de rede pequena.
Busca incorreta Recuperando dados mais que o necessário, resultando em E/S desnecessária.
Instanciação inadequada Repetidamente, criação e destruição de objetos que são projetados para serem compartilhados e reutilizados.
Persistência monolítica Usando o mesmo armazenamento de dados para dados com padrões de uso muito diferentes.
Sem cache Falha ao armazenar dados em cache.
Vizinho barulhento Um único locatário usa uma quantidade desproporcional dos recursos.
Número excessivo de novas tentativas Tentando novamente com frequência excessiva as solicitações com falha para um servidor.
E/S síncrona Bloquear o thread de chamada enquanto a E/S é concluída.

Próximas etapas

Para obter mais informações sobre o ajuste de desempenho, confira Ajuste de desempenho de um aplicativo distribuído