Teste de desempenho e antipadrões para aplicativos em nuvemPerformance testing and antipatterns for cloud applications

Os antipadrões de desempenho, assim como os padrões de design, são processos e implementações comuns de defeitos nas organizações.Performance antipatterns, much like design patterns, are common defective processes and implementations within organizations. São práticas comuns com grande probabilidade de causar problemas de escalabilidade quando um aplicativo está sob pressão.These are common practices that are likely to cause scalability problems when an application is under pressure. A conscientização dessas práticas pode ajudar a simplificar a comunicação de conceitos de alto nível entre os profissionais de software.Awareness of these practices can help simplify communication of high-level concepts amongst software practitioners.

Aqui está um cenário comum: um aplicativo se comporta bem durante o teste de desempenho.Here is a common scenario: An application behaves well during performance testing. Ele é liberado para produção e começa a lidar com cargas de trabalho reais.It's released to production, and begins to handle real workloads. Nesse ponto, ele começa a executar mal—, rejeitando solicitações do usuário, atrasando ou lançando exceções.At that point, it starts to perform poorly—rejecting user requests, stalling, or throwing exceptions. A equipe de desenvolvimento enfrenta duas perguntas:The development team is then faced with two questions:

  • Por que não esse comportamento é exibido durante o teste?Why didn't this behavior show up during testing?
  • Como podemos corrigir isso?How do we fix it?

A resposta à primeira pergunta é simples.The answer to the first question is straightforward. É 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.It's difficult to simulate real users in a test environment, along with their behavior patterns and the volumes of work they might perform. A única maneira totalmente garantida de compreender como um sistema se comporta sob carga é observá-lo em produção.The only completely sure way to understand how a system behaves under load is to observe it in production. Para ser claro, estamos não sugerindo que você deve ignorar o teste de desempenho.To be clear, we aren't suggesting that you should skip performance testing. O teste de desempenho é essencial para se obter as métricas de desempenho da linha de base.Performance testing is crucial for getting baseline performance metrics. Mas você deve estar preparado para observar e corrigir problemas de desempenho quando eles ocorrem no sistema de produção.But you must be prepared to observe and correct performance issues when they arise in the live system.

A resposta à segunda pergunta, como corrigir o problema, é menos direto.The answer to the second question, how to fix the problem, is less straightforward. Qualquer número de fatores pode contribuir e, às vezes, o problema só se manifesta em determinadas circunstâncias.Any number of factors might contribute, and sometimes the problem only manifests under certain circumstances. Instrumentação e registro em log são fundamentais para localizar a causa raiz, mas você também precisa saber o que procurar.Instrumentation and logging are key to finding the root cause, but you also have to know what to look for.

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.Based on our engagements with Microsoft Azure customers, we've identified some of the most common performance issues that customers see in production. Para cada antipadrão, descrevemos por que o antipadrão normalmente ocorre, sintomas de antipadrão e técnicas para resolver o problema.For each antipattern, we describe why the antipattern typically occurs, symptoms of the antipattern, and techniques for resolving the problem. Nós também fornecemos um exemplo de código que ilustra o antipadrão e uma sugestão de solução de escalabilidade.We also provide sample code that illustrates both the antipattern and a suggested scalability solution.

Esses antipadrões podem parecer óbvios quando você lê as descrições, mas eles ocorrem com mais frequência do que você imagina.Some of these antipatterns may seem obvious when you read the descriptions, but they occur more often than you might think. Às vezes, um aplicativo herda um design que funcionou no local, mas não escala na nuvem.Sometimes an application inherits a design that worked on-premises, but doesn't scale in the cloud. 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.Or an application might start with a very clean design, but as new features are added, one or more of these antipatterns creeps in. Independentemente, este guia ajudará você a identificar e corrigir esses antipadrões.Regardless, this guide will help you to identify and fix these antipatterns.

Catálogo de antipadrõesCatalog of antipatterns

Aqui está a lista das antipadrões que nós identificamos:Here is the list of the antipatterns that we've identified:

AntipadrãoAntipattern DescriçãoDescription
Banco de dados ocupadoBusy Database Descarregando muito processamento para um armazenamento de dados.Offloading too much processing to a data store.
Front-end ocupadoBusy Front End Movendo tarefas de uso intensivo de recursos em threads em segundo plano.Moving resource-intensive tasks onto background threads.
E/S com ruídosChatty I/O Continuamente enviar várias solicitações de rede pequena.Continually sending many small network requests.
Busca incorretaExtraneous Fetching Recuperando dados mais que o necessário, resultando em E/S desnecessária.Retrieving more data than is needed, resulting in unnecessary I/O.
Instanciação inadequadaImproper Instantiation Repetidamente, criação e destruição de objetos que são projetados para serem compartilhados e reutilizados.Repeatedly creating and destroying objects that are designed to be shared and reused.
Persistência monolíticaMonolithic Persistence Usando o mesmo armazenamento de dados para dados com padrões de uso muito diferentes.Using the same data store for data with very different usage patterns.
Sem cacheNo Caching Falha ao armazenar dados em cache.Failing to cache data.
Número excessivo de novas tentativasRetry Storm Tentando novamente com frequência excessiva as solicitações com falha para um servidor.Retrying failed requests to a server too often.
E/S síncronaSynchronous I/O Bloquear o thread de chamada enquanto a E/S é concluída.Blocking the calling thread while I/O completes.

Próximas etapasNext steps

Para obter mais informações sobre o ajuste de desempenho, confira Ajuste de desempenho de um aplicativo distribuídoFor more about performance tuning, see Performance tuning a distributed application