Otimizar o desempenho de uma aplicação distribuída

Nesta série, percorremos vários cenários de aplicações cloud e mostramos como uma equipa de desenvolvimento utilizou testes de carga e métricas para diagnosticar problemas de desempenho. Estes artigos baseiam-se no teste de carga real que realizámos ao desenvolver aplicações de exemplo. O código de cada cenário está disponível no GitHub.

Cenários:

O que é o desempenho?

O desempenho é, frequentemente, medido em termos de débito, tempo de resposta e disponibilidade. Os objetivos de desempenho devem ter por base as operações de negócio. As tarefas voltadas para o cliente podem ter requisitos mais rígidos do que tarefas operacionais como a geração de relatórios.

Defina um objetivo de nível de serviço (SLO) que estabeleça os objetivos de desempenho de cada carga de trabalho. Normalmente, você atinge esse objetivo dividindo uma meta de desempenho em um conjunto de indicadores-chave de desempenho (KPIs), como:

  • Latência ou tempo de resposta de pedidos específicos
  • O número de pedidos realizados por segundo
  • O ritmo a que o sistema gera exceções.

Os objetivos de desempenho devem incluir explicitamente uma carga de destino. Além disso, nem todos os usuários recebem exatamente o mesmo nível de desempenho, mesmo quando acessam o sistema simultaneamente e executam o mesmo trabalho. Portanto, um SLO deve ser definido em termos de percentis.

Um exemplo de SLO para pode ser: "As solicitações do cliente têm uma resposta dentro de 500 ms @ P90, em cargas de até 25 K solicitações/segundo."

Desafios à otimização do desempenho de um sistema distribuído

Pode ser particularmente difícil diagnosticar problemas de desempenho numa aplicação distribuída. Alguns dos desafios são:

  • Uma única operação ou transação de negócio geralmente envolve vários componentes do sistema. Pode ser difícil obter uma visão holística completa de uma única operação.

  • O consumo dos recursos é distribuído por vários nós. Para obter uma visão consistente, tem de agregar os registos e métricas num único local.

  • A cloud oferece dimensionamento elástico. O dimensionamento automático é uma técnica importante para gerir os picos de carga, mas também pode mascarar problemas subjacentes. Além disso, pode ser difícil perceber que componentes têm de ser dimensionados e quando.

  • As cargas de trabalho geralmente não são dimensionadas entre núcleos ou threads. É importante entender os requisitos de suas cargas de trabalho e procurar tamanhos otimizados melhores. Alguns tamanhos oferecem núcleos restritos e hyperthreading desativado para melhorar cargas de trabalho licenciadas orientadas a um único núcleo e por núcleo.

  • As falhas consecutivas podem causar falhas a montante do problema raiz. Por conseguinte, o primeiro sinal do problema pode surgir num componente diferente do da causa raiz.

Melhores práticas gerais

A otimização do desempenho tem tanto de arte como de ciência, mas pode aproximar-se mais da ciência através de uma abordagem sistemática. Aqui estão algumas melhores práticas:

  • Ative a telemetria para recolher métricas. Instrumentalize o seu código. Siga as melhores práticas de monitorização. Utilize o rastreio correlacionado para poder ver todas as etapas de uma transação.

  • Monitorize os percentis de 90/95/99, não apenas a média. A média pode mascarar valores atípicos. A taxa de amostragem das métricas também é importante. Se a taxa de amostragem for demasiado baixa, poderá estar a ocultar picos ou valores atípicos que podem ser reveladores de problemas.

  • Resolva um estrangulamento de cada vez. Formule uma hipótese e testa-a ao alterar uma variável de cada vez. A remoção de um estrangulamento irá, muitas vezes, revelar outro estrangulamento a montante ou a jusante.

  • Os erros e repetições podem ter um impacto significativo no desempenho. Se você perceber que os serviços de back-end estão limitando seu sistema, dimensione ou tente otimizar o uso (por exemplo, ajustando consultas de banco de dados).

  • Procure antipadrões de desempenho comuns.

  • Procure oportunidades de paralelizar. Duas origens comuns de estrangulamentos são as filas de mensagens e as bases de dados. Em ambos os casos, a fragmentação pode ajudar. Para obter mais informações, veja Criação de partições de dados horizontais, verticais e funcionais. Procure partições muito ativas que possam indicar cargas de leitura ou escrita desequilibradas.

Próximos passos

Leia os cenários de otimização do desempenho