Recomendações para otimizar os custos de dimensionamento

Aplica-se a esta recomendação de lista de verificação da Otimização de Custos do Azure Well-Architected Framework:

CO:12 Otimizar os custos de dimensionamento. Avalie o dimensionamento alternativo em suas unidades de escala. Considere configurações alternativas de dimensionamento e alinhe-se com o modelo de custo. Considerações devem incluir a utilização em relação aos limites herdados de cada instância, recurso e limite de unidade de escala. Use estratégias para controlar a demanda e a oferta.

Este guia fornece recomendações para otimizar os custos de dimensionamento. O dimensionamento de otimização de custos é o processo de remoção de ineficiências no dimensionamento da carga de trabalho. A meta é reduzir os custos de dimensionamento enquanto ainda atende a todos os requisitos não funcionais. Gastar menos para obter o mesmo resultado. A otimização do dimensionamento permite evitar despesas desnecessárias, excesso de provisionamento e desperdício. Também ajuda a evitar picos inesperados nos custos controlando a demanda e limitando a oferta. Práticas de dimensionamento ineficientes podem levar ao aumento da carga de trabalho e dos custos operacionais e afetar negativamente a integridade financeira geral da carga de trabalho.

Definições

Termo Definição
Dimensionamento automático Uma abordagem de dimensionamento que adiciona ou remove recursos automaticamente quando um conjunto de condições é atendido.
Métricas de custo Dados numéricos relacionados ao custo da carga de trabalho.
Reduzir verticalmente Uma estratégia de dimensionamento vertical que muda para um SKU inferior para fornecer menos recursos para a carga de trabalho.
Reduzir horizontalmente Uma estratégia de dimensionamento horizontal que remove instâncias para fornecer menos recursos para a carga de trabalho.
Escalar horizontalmente Uma estratégia de dimensionamento horizontal que adiciona instâncias para fornecer mais recursos à carga de trabalho.
Unidades da escala Um grupo de recursos que são dimensionados proporcionalmente juntos.
Escalar verticalmente Uma estratégia de dimensionamento vertical que muda para um SKU mais alto para fornecer mais recursos para a carga de trabalho.
SKU (unidade de manutenção de estoque) Uma camada de serviço para um serviço do Azure.
Dados de uso Os dados de uso são informações diretas (reais) ou informações indiretas/representativas (proxy) sobre o quanto uma tarefa, um serviço ou um aplicativo está sendo usado.

Principais estratégias de design

O objetivo da otimização de custos é escalar verticalmente e escalar verticalmente no último momento responsável e reduzir verticalmente assim que for prático. Para otimizar o dimensionamento para sua carga de trabalho, você pode avaliar opções alternativas de dimensionamento dentro das unidades de escala e alinhá-las com o modelo de custo. Uma unidade de escala representa um agrupamento específico de recursos que podem ser dimensionados independentemente ou juntos. Você deve criar unidades de escala para lidar com uma quantidade específica de carga e elas podem incluir várias instâncias, servidores ou outros recursos. Você precisa avaliar o custo-benefício de suas unidades de escala de carga de trabalho e alternativas de modelo.

Se você não usar o dimensionamento, confira diretrizes sobre como dimensionar a carga de trabalho. Você precisa descobrir se seu aplicativo pode ser dimensionado. Aplicativos sem estado são mais fáceis de dimensionar porque podem lidar com várias solicitações ao mesmo tempo. Além disso, avalie se o aplicativo foi criado usando princípios de sistemas distribuídos. Os sistemas distribuídos podem lidar com o aumento da carga distribuindo a carga de trabalho entre vários nós. No entanto, um aplicativo singleton foi projetado para ter apenas uma instância em execução a qualquer momento. Portanto, o dimensionamento pode não ser apropriado para todas as cargas de trabalho.

Avaliar escalar horizontalmente versus escalar verticalmente

Avaliar a escala horizontal versus escalar verticalmente envolve determinar a abordagem mais econômica entre aumentar os recursos em um sistema existente (escalar verticalmente) ou adicionar mais instâncias desse sistema (escalar horizontalmente) com base em vários fatores, como preços, requisitos de carga de trabalho e tempo de inatividade aceitável. Escolher a abordagem de dimensionamento certa pode levar a uma economia significativa, garantindo que você pague apenas pelo que precisa enquanto ainda atende aos padrões de desempenho e confiabilidade.

A meta é determinar a escolha mais econômica com base em preços de camada de serviço, características de carga de trabalho, tempo de inatividade aceitável e o modelo de custo. Para alguns, pode ser mais econômico optar por instâncias mais caras em menos números. Por outro lado, para outras pessoas, uma camada mais barata com mais instâncias pode ser melhor. Para tomar uma decisão informada, você precisa analisar dados reais ou representativos de sua configuração e avaliar os méritos relativos de custo de cada estratégia. Para avaliar a abordagem mais econômica, considere estas recomendações:

  • Coletar dados de uso: colete dados de produção reais ou dados de proxy que representam os padrões de uso da carga de trabalho e a utilização de recursos. Esses dados devem incluir métricas como uso da CPU, uso de memória, tráfego de rede e quaisquer outras métricas relevantes que afetem o custo de dimensionamento.

  • Definir métricas de custo: identifique as métricas de custo relevantes para sua carga de trabalho, como o custo por hora, o custo por transação ou o custo por unidade de uso do recurso. Essas métricas ajudam você a comparar o custo-benefício de diferentes opções de dimensionamento.

  • Coletar dados de uso: colete dados de produção reais ou dados de proxy que representam os padrões de uso da carga de trabalho e a utilização de recursos. Esses dados devem incluir métricas como uso da CPU, uso de memória, tráfego de rede e quaisquer outras métricas relevantes que afetem o custo de dimensionamento

  • Definir métricas de custo: identifique as métricas de custo relevantes para sua carga de trabalho, como o custo por hora, o custo por transação ou o custo por unidade de uso do recurso. Essas métricas ajudam você a comparar o custo-benefício de diferentes opções de dimensionamento.

  • Consulte os requisitos: ao decidir entre estratégias de expansão e expansão, considere os requisitos de confiabilidade, desempenho e dimensionamento da carga de trabalho. O dimensionamento pode melhorar a confiabilidade por meio da redundância. O dimensionamento aumenta a capacidade de um recurso, mas pode haver limites para o quanto você pode escalar verticalmente.

  • Considere os limites de recursos: ao avaliar as opções de dimensionamento, é importante considerar os limites inerentes de cada instância, recurso e limite de unidade de escala. Lembre-se dos limites de dimensionamento superior para cada recurso e planeje adequadamente. Além disso, tenha em mente os limites de sua assinatura e de outros recursos.

  • Dimensionamento de teste: crie testes para diferentes cenários de dimensionamento, incluindo opções de expansão e expansão. Aplicando os dados de uso, simule o comportamento da carga de trabalho em diferentes configurações de dimensionamento. Realize testes do mundo real usando os cenários de dimensionamento modelados.

  • Calcular custos: use os dados coletados e as métricas de custo para calcular os custos associados a cada configuração de dimensionamento. Considere fatores como preços de instância, utilização de recursos e quaisquer custos extras relacionados ao dimensionamento.

Otimizar dimensionamento automático

A otimização da política de dimensionamento automático envolve a refinação do dimensionamento automático para reagir às alterações de carga com base nos requisitos não funcionais da carga de trabalho. Você pode limitar as atividades de dimensionamento excessivo ajustando os limites e usando o período de resfriamento correto. Para otimizar o dimensionamento automático, considere as seguintes recomendações:

  • Analisar a política de dimensionamento automático atual: entenda a política existente e seu comportamento em resposta a diferentes níveis de carga.

  • Consulte os requisitos não funcionais: identifique os requisitos não funcionais específicos que você precisa considerar, como tempo de resposta, utilização de recursos ou custo.

  • Ajustar limites de dimensionamento: ajuste os limites de dimensionamento com base nas características da carga de trabalho e nos requisitos não funcionais. Defina limites para escalar ou reduzir verticalmente com base em fatores como utilização da CPU ao longo do tempo, tráfego de rede ou comprimento da fila.

  • Ajustar um período de resfriamento: ajuste o período de resfriamento para evitar atividades de dimensionamento excessivas disparadas por picos de carga temporários. Um período de resfriamento introduz um atraso entre eventos de dimensionamento, permitindo que o sistema se estabilize antes de novas ações de dimensionamento.

  • Monitorar e ajustar: monitore continuamente o comportamento e o desempenho do sistema. Analise as atividades de dimensionamento e ajuste a política conforme necessário para otimizar o custo e atender aos requisitos não funcionais desejados.

Compensação: reduzir o número de eventos de dimensionamento aumenta as chances de encontrar problemas relacionados ao dimensionamento. Isso significa que você está eliminando a almofada ou buffer extra que pode ajudar a gerenciar possíveis problemas ou atrasos do dimensionamento.

Considerar o dimensionamento baseado em eventos

O dimensionamento automático controlado por eventos permite que o aplicativo ajuste dinamicamente os recursos com base em eventos ou gatilhos específicos, em vez de métricas tradicionais, como utilização de CPU ou memória. Por exemplo, o KEDA (dimensionamento automático controlado por eventos) do Kubernetes pode dimensionar aplicativos com base em dimensionadores, como o comprimento de um tópico kafka. A precisão ajuda a evitar flutuações desnecessárias de dimensionamento e desperdício de recursos. Um alto nível de precisão otimiza os custos. Para usar o dimensionamento baseado em eventos, siga estas etapas:

  • Escolha uma fonte de evento: determine a origem do evento que dispara o dimensionamento da unidade de escala. Uma origem pode ser uma fila de mensagens, uma plataforma de streaming ou qualquer outro sistema controlado por eventos.

  • Configurar a ingestão de eventos: configure seu aplicativo para consumir eventos da origem do evento escolhido. Normalmente, envolve estabelecer uma conexão, assinar tópicos ou filas relevantes e processar os eventos de entrada.

  • Implementar lógica de dimensionamento: escreva a lógica que determina quando e como sua unidade de escala deve ser dimensionada com base nos eventos de entrada. Essa lógica deve considerar fatores como o número de eventos, a taxa de eventos de entrada ou qualquer outra métrica relevante.

  • Integrar com mecanismos de dimensionamento: dependendo do ambiente de runtime do aplicativo, você pode usar mecanismos de dimensionamento diferentes para ajustar os recursos alocados ao aplicativo.

  • Configurar regras de dimensionamento: defina as regras de dimensionamento que especificam como sua unidade de escala deve ser dimensionada em resposta a eventos. Essas regras podem ser baseadas em limites, padrões ou qualquer outro critério que se alinhe aos requisitos do aplicativo. Os limites de dimensionamento devem estar relacionados às métricas de negócios. Por exemplo, se você adicionar mais duas instâncias, poderá dar suporte a mais 50 usuários no processamento de carrinhos de compras.

  • Teste e monitore: valide o comportamento da implementação de dimensionamento baseado em evento testando-o com diferentes cenários de evento. Monitore as ações de dimensionamento e verifique se as ações estão alinhadas com suas expectativas.

Troca A configuração e o ajuste fino do dimensionamento automático baseado em eventos podem ser complexos e a configuração inadequada pode levar ao excesso de provisionamento ou ao subprovisionamento de recursos.

Otimizar a demanda e a oferta

Controle a demanda em relação à sua oferta. Em cargas de trabalho em que o uso determina o dimensionamento, o custo se correlaciona com o dimensionamento. Para otimizar os custos de dimensionamento, você pode minimizar o dimensionamento dos gastos. Você pode descarregar a demanda distribuindo a demanda para outros recursos ou pode reduzir a demanda implementando filas de prioridade, descarregamento de gateway, buffer e limitação de taxa. Ambas as estratégias podem evitar custos indesejados devido ao dimensionamento e ao consumo de recursos. Você também pode controlar o fornecimento limitando os limites de dimensionamento. Para otimizar a demanda e a oferta da carga de trabalho, considere as recomendações a seguir.

Demanda de descarregamento

O descarregamento da demanda refere-se à prática de distribuir ou transferir a demanda de recursos para outros recursos ou serviços. Você pode usar várias tecnologias ou estratégias:

  • Cache: use o cache para armazenar dados ou conteúdo acessados com frequência, reduzindo a carga em sua infraestrutura de back-end. Por exemplo, use CDNs (redes de distribuição de conteúdo) para armazenar em cache e fornecer conteúdo estático, reduzindo a necessidade de dimensionar o back-end. No entanto, nem toda carga de trabalho pode armazenar dados em cache. Cargas de trabalho que exigem dados atualizados e em tempo real, como cargas de trabalho de negociação ou jogos, não devem usar um cache. Os dados armazenados em cache seriam antigos e irrelevantes para o usuário.

    Compensação. O cache pode introduzir desafios em termos de invalidação de cache, consistência e gerenciamento da expiração do cache. É importante projetar e implementar cuidadosamente estratégias de cache para evitar possíveis compensações.

  • Descarregamento de conteúdo: descarregue conteúdo para serviços ou plataformas externos para reduzir a carga de trabalho em sua infraestrutura. Por exemplo, em vez de armazenar arquivos de vídeo no servidor primário, você pode hospedar esses arquivos em um serviço de armazenamento separado que seja independente do servidor primário. Você pode carregar esses arquivos grandes diretamente do serviço de armazenamento. Essa abordagem libera recursos em seus servidores, permitindo que você use um servidor menor. Pode ser mais barato armazenar arquivos grandes em um armazenamento de dados separado. Você pode usar uma CDN para melhorar o desempenho.

  • Balanceamento de carga: distribua solicitações de entrada entre vários servidores usando o balanceamento de carga. O balanceamento de carga distribui uniformemente a carga de trabalho e impede que qualquer servidor único fique sobrecarregado. Os balanceadores de carga otimizam a utilização de recursos e melhoram a eficiência da infraestrutura.

  • Descarregamento de banco de dados: reduza a carga em seu servidor de aplicativos main descarregando operações de banco de dados para um servidor de banco de dados separado ou um serviço especializado. Por exemplo, use uma CDN para cache de conteúdo estático e um cache Redis para cache de conteúdo dinâmico (dados do banco de dados). Técnicas como fragmentação de banco de dados, réplicas de leitura ou uso de serviços de banco de dados gerenciado também podem reduzir a carga.

    Troca: Descarregar tarefas específicas para recursos alternativos ajuda a reduzir ou evitar dimensionamento extra e custos associados ao dimensionamento. No entanto, é importante considerar os desafios operacionais e de manutenção que podem surgir do descarregamento. Realizar uma análise abrangente de custo-benefício é crucial ao selecionar as técnicas de descarregamento mais apropriadas para sua carga de trabalho. Essa análise garante que o método escolhido seja eficiente e viável em relação à economia prevista e às complexidades operacionais.

Reduzir a demanda

Reduzir a demanda de recursos significa implementar estratégias que ajudam a minimizar a utilização de recursos em uma carga de trabalho. O descarregamento da demanda desloca a demanda para outros recursos. A redução da demanda diminui a demanda na carga de trabalho. Reduzir a demanda permite evitar o excesso de provisionamento de recursos e pagar por capacidade não utilizada ou subutilizada. Você deve usar padrões de design no nível do código para reduzir a demanda por recursos de carga de trabalho. Para reduzir a demanda por meio de padrões de design, siga estas etapas:

  • Entender os padrões de design: familiarize-se com vários padrões de design que promovem a otimização de recursos.

  • Analisar requisitos de carga de trabalho: avalie os requisitos específicos da carga de trabalho, incluindo seus padrões de demanda esperados, cargas de pico e necessidades de recursos.

  • Selecione os padrões de design apropriados: escolha os padrões de design que se alinham aos requisitos e objetivos da carga de trabalho. Por exemplo, se sua carga de trabalho tiver uma demanda flutuante, os padrões de escala e limitação controlados por eventos poderão ajudar a gerenciar a carga de trabalho alocando recursos dinamicamente. Aplique os padrões de design selecionados à sua arquitetura de carga de trabalho. Talvez seja necessário separar componentes de carga de trabalho, colocar aplicativos em contêineres, otimizar a utilização do armazenamento e muito mais.

  • Monitorar e otimizar continuamente: avalie regularmente a eficácia dos padrões de design implementados e ajuste conforme necessário. Monitore o uso de recursos, as métricas de desempenho e as oportunidades de otimização de custos.

Seguindo essas etapas e usando padrões de design apropriados, você pode reduzir a demanda de recursos, otimizar os custos e garantir a operação eficiente de suas cargas de trabalho.

Use estes padrões de design para reduzir a demanda:

  • Cache à parte: o padrão verifica o cache para ver se os dados já estão armazenados na memória. Se os dados forem encontrados no cache, o aplicativo poderá recuperar e retornar rapidamente os dados, reduzindo a necessidade de consultar o armazenamento de dados persistente.

  • Declaração marcar: ao separar dados do fluxo de mensagens, esse padrão reduz o tamanho das mensagens e dá suporte a uma solução de mensagens mais econômica.

  • Consumidores concorrentes: esse padrão lida com eficiência com itens em uma fila aplicando processamento distribuído e simultâneo. Esse padrão de design otimiza os custos dimensionando com base na profundidade da fila e definindo limites no máximo de instâncias de consumidor simultâneas.

  • Consolidação de recursos de computação: esse padrão aumenta a densidade e consolida os recursos de computação combinando vários aplicativos ou componentes na infraestrutura compartilhada. Ele maximiza a utilização de recursos, evitando a capacidade provisionada não utilizada e reduzindo os custos.

  • Selos de implantação: o uso de selos de implantação oferece várias vantagens, como distribuição geográfica de grupos de dispositivos, implantação de novos recursos em selos específicos e observação do custo por dispositivo. Os selos de implantação permitem uma melhor escalabilidade, tolerância a falhas e utilização eficiente de recursos.

  • Descarregamento de gateway: esse padrão descarrega o processamento de solicitações em um dispositivo de gateway, redirecionando os custos de recursos por nó para a implementação do gateway. O uso desse padrão de design pode resultar em um custo de propriedade menor em um modelo de processamento centralizado.

  • Publicador/assinante: esse padrão separa componentes em uma arquitetura, substituindo a comunicação direta por um agente de mensagens intermediário ou barramento de eventos. Ele permite uma abordagem controlada por eventos e cobrança baseada em consumo, evitando o excesso de provisionamento.

  • Nivelamento de carga baseado em fila: o padrão armazena em buffer solicitações ou tarefas de entrada em uma fila. O buffer suaviza a carga de trabalho e reduz a necessidade de superprovisionamento de recursos para lidar com a carga de pico. As solicitações de entrada são processadas de forma assíncrona para reduzir os custos.

  • Fragmentação: esse padrão direciona solicitações específicas para um destino lógico, permitindo otimizações com colocação de dados. A fragmentação pode levar à economia de custos usando várias instâncias de recursos de computação ou armazenamento de especificação inferior.

  • Hospedagem de conteúdo estático: esse padrão fornece conteúdo estático com eficiência usando uma plataforma de hospedagem projetada para essa finalidade. Ele evita o uso de hosts de aplicativos dinâmicos mais caros, otimizando a utilização de recursos.

  • Limitação: esse padrão coloca limites na taxa (limitação de taxa) ou na taxa de transferência de solicitações de entrada para um recurso ou componente. Ele ajuda a informar a modelagem de custos e pode ser vinculado diretamente ao modelo de negócios do aplicativo.

  • Chave de manobrista: esse padrão concede acesso seguro e exclusivo a um recurso sem envolver mais componentes, reduzindo a necessidade de recursos intermediários e melhorando a eficiência.

Fornecimento de controle

Definir um limite superior no valor que você está disposto a gastar em um determinado recurso ou serviço é uma maneira de controlar o fornecimento. É uma estratégia importante para controlar os custos e garantir que as despesas não excedam um determinado nível. Estabeleça um orçamento e monitore os gastos para garantir que ele permaneça dentro do valor definido. Você pode usar plataformas de gerenciamento de custos, alertas de orçamento ou padrões de uso e gastos de acompanhamento. Alguns serviços permitem limitar a oferta e limitar as taxas, e você deve usar esses recursos quando for útil.

Controlar a oferta refere-se à definição de um limite superior no valor que você está disposto a gastar em um determinado recurso ou serviço. É uma estratégia importante porque ajuda a controlar os custos e garante que as despesas não excedam um determinado nível. Estabeleça um orçamento e monitore os gastos para garantir que ele permaneça dentro do limite definido. Você pode usar plataformas de gerenciamento de custos, alertas de orçamento ou padrões de uso e gastos de acompanhamento. Alguns serviços permitem limitar a oferta e limitar as taxas, e você deve usar esses recursos quando for útil.

Compensação: limites mais rígidos podem resultar em oportunidades perdidas para dimensionar quando a demanda aumenta, potencialmente afetando a experiência do usuário. Isso pode causar desligamentos ou não conseguir responder à carga. É importante encontrar um equilíbrio entre a otimização de custos e garantir que você tenha recursos suficientes para atender às suas necessidades de negócios.

Facilitação do Azure

Avaliando a expansão versus a escala vertical: o Azure fornece um ambiente de teste em que você pode implantar e testar diferentes configurações de dimensionamento. Usando os dados reais da carga de trabalho ou os dados de proxy, você pode simular cenários reais e medir os efeitos sobre os custos. O Azure oferece ferramentas e serviços para teste de desempenho, teste de carga e monitoramento, o que pode ajudá-lo a avaliar o custo-benefício das opções escalar horizontalmente versus escalar verticalmente.

O Azure fornece recomendações de gerenciamento de custos por meio de várias ferramentas e serviços, como o Assistente do Azure. Essas recomendações analisam os padrões de uso, a utilização de recursos e as configurações de dimensionamento para fornecer insights e sugestões para otimizar os custos.

O Teste de Carga do Azure é um serviço de teste de carga totalmente gerenciado que gera carga de alta escala. O serviço simula o tráfego para seus aplicativos, independentemente de onde estão hospedados. Desenvolvedores, testadores e engenheiros de garantia de qualidade (QA) podem usar o teste de carga para otimizar o desempenho, a escalabilidade ou a capacidade do aplicativo.

Otimização do dimensionamento automático: muitos serviços de computação do Azure dão suporte à implantação de várias instâncias idênticas e ao ajuste rápido dos limites e políticas de dimensionamento. O Azure fornece recursos de dimensionamento automático que permitem ajustar automaticamente o número de instâncias ou recursos com base na demanda de carga de trabalho. Você pode definir regras de dimensionamento e limites para disparar ações de expansão ou redução horizontal. Usando o dimensionamento automático, você pode otimizar a alocação de recursos e a eficiência de custo dimensionando dinamicamente os recursos com base na demanda real.

O Azure mantém uma lista de limites de assinatura e serviço. Há um limite geral para o número de instâncias de um recurso que você pode implantar em cada grupo de recursos com algumas exceções. Para obter mais informações, consulte Limites de instância de recurso por grupo de recursos.

Otimizando a demanda e a oferta: o Azure Monitor fornece insights sobre o desempenho e a integridade de seus aplicativos e infraestrutura. Você pode usar o Azure Monitor para monitorar a carga em seus recursos e analisar tendências ao longo do tempo. Usando métricas e logs coletados pelo Azure Monitor, você pode identificar áreas em que os ajustes de dimensionamento podem ser necessários. Essas informações podem orientar o refinamento da política de dimensionamento automático para garantir que ela se alinhe aos requisitos não funcionais e às metas de otimização de custos.

  • Descarregamento de fornecimento: o Azure tem uma CDN (Rede de Distribuição de Conteúdo) de nuvem moderna chamada Azure Front Door e serviços de cache (Cache do Azure para Redis e Azure HPC Cache). A CDN armazena em cache o conteúdo mais próximo dos usuários finais, reduzindo a latência da rede e melhorando os tempos de resposta. O cache armazena uma cópia dos dados na frente do armazenamento de dados main, reduzindo a necessidade de solicitações repetidas para o back-end. Usando a CDN e os serviços de cache, você pode otimizar o desempenho e reduzir a carga nos servidores para uma possível economia de custos.

  • Controlando a oferta: o Azure também permite definir limites de recursos para sua carga de trabalho de nuvem. Ao definir limites de recursos, você pode garantir que sua carga de trabalho permaneça dentro dos recursos alocados e evitar custos desnecessários. O Azure fornece vários mecanismos para definir limites de recursos, como cotas, políticas e alertas de orçamento. Esses mecanismos ajudam você a monitorar e controlar o uso de recursos.

    Gerenciamento de API pode limitar e limitar solicitações. Ser capaz de limitar as solicitações de entrada é fundamental para o Gerenciamento de API do Azure. Ao controlar a taxa de solicitações ou as solicitações/dados totais transferidos, o Gerenciamento de API permite que os provedores de API protejam suas APIs contra o abuso e criem valor para diferentes níveis de produto de API.

Lista de verificação de Otimização de Custos

Consulte o conjunto completo de recomendações.