Partilhar via


Recomendações para otimizar o código e a infraestrutura

Aplica-se a esta recomendação de lista de verificação de Eficiência de Desempenho do Azure Well-Architected Framework:

PE:07 Otimizar o código e a infraestrutura. Utilize código com desempenho e certifique-se de que descarrega as responsabilidades para a plataforma. Utilize código e infraestrutura apenas para fins fundamentais e apenas quando necessário.

Este guia descreve as recomendações para otimizar o desempenho do código e da infraestrutura. Para otimizar o código e a infraestrutura, deve utilizar os seus componentes apenas para fins essenciais e apenas quando necessário. Quando utiliza o código e a infraestrutura em excesso, este cria consumo desnecessário de recursos, estrangulamentos e respostas lentas. Para compensar essas ineficiências, tem de adicionar mais recursos para realizar as mesmas tarefas.

Definições

Termo Definição
Simultaneidade Quando várias tarefas ou processos são executados ao mesmo tempo, mas não necessariamente ao mesmo tempo.
Arquitetura da CPU Os componentes e princípios que afetam o funcionamento do computador.
Compressão de dados A ação de reduzir o tamanho dos ficheiros ao minimizar os dados redundantes.
Área dinâmica para dados Uma área na memória utilizada para alocações de memória de tempo de execução.
Fuga de memória Quando uma carga de trabalho não consegue libertar a memória alocada depois de a memória deixar de ser necessária.
Paralelismo Quando são efetuadas várias tarefas ou processos ao mesmo tempo.

Principais estratégias de design

Otimizar o código e a infraestrutura implica otimizar o código e a infraestrutura de suporte para melhorar a eficiência de desempenho. Requer código de execução que execute tarefas rapidamente e não desperdice recursos. Requer uma infraestrutura bem concebida que seja simplificada para evitar complexidades desnecessárias. Uma carga de trabalho deve utilizar as capacidades inerentes da plataforma. É uma abordagem que ajuda a garantir que o código e a infraestrutura são utilizados principalmente para os seus objetivos principais e apenas quando necessário.

Otimizar o desempenho do código

Para otimizar o desempenho do código, modifique o código para reduzir a utilização de recursos, minimizar o runtime e melhorar o desempenho. Pode modificar o código para melhorar a eficiência e a velocidade de um programa de software. Não mascarar problemas de desempenho com força bruta. Força bruta significa adicionar recursos de computação para compensar o desempenho do código, como adicionar capacidade extra em vez de abordar a origem. Tem de corrigir problemas de desempenho com a otimização. Quando otimiza o desempenho do código, ajuda a maximizar a utilização dos recursos do sistema, melhora o tempo de resposta, reduz a latência e melhora a experiência do utilizador.

Instrumentar o código

O código de instrumentação refere-se à prática de adicionar fragmentos de código ou bibliotecas a códigos que recolhem dados e monitorizam o desempenho do código durante o runtime. A instrumentação de código permite que os programadores recolham informações sobre as principais métricas, como o consumo de recursos (CPU, utilização da memória) e o tempo de execução. Ao instrumentar código, os programadores podem obter informações sobre caminhos frequentes de código, identificar estrangulamentos de desempenho e otimizar o código para uma melhor eficiência de desempenho.

Num ambiente ideal, deve fazer a análise de código no início do ciclo de vida de desenvolvimento de software. Quanto mais cedo se detetar um problema de código, mais barato será corrigi-lo. Quer automatizar o máximo possível desta análise de código. Utilize ferramentas de análise de código dinâmicos e estáticos para reduzir o esforço manual. No entanto, tenha em atenção que este teste ainda é uma simulação de produção. A produção fornece a compreensão mais clara da otimização do código.

Desvantagem: é provável que as ferramentas de monitorização de código aumentem os custos.

Identificar caminhos quentes

Ao instrumentar o código, pode medir o consumo de recursos para diferentes caminhos de código. Estas medidas ajudam-no a identificar caminhos frequentes. Os caminhos frequentes têm um efeito significativo no desempenho e na utilização de recursos. São secções críticas ou executadas frequentemente de um programa que requerem um elevado desempenho e baixa latência. Para identificar caminhos frequentes de código, considere estes passos:

  • Analisar dados de runtime: recolha dados de runtime e analise-os para identificar áreas do código que consomem recursos significativos, como operações de CPU, memória ou E/S. Procure padrões ou secções de código que são frequentemente executados ou demoram muito tempo a concluir.

  • Medir o desempenho: utilize ferramentas de criação de perfis ou estruturas de teste de desempenho para medir o tempo de execução e o consumo de recursos de diferentes caminhos de código. Ajuda a identificar estrangulamentos e áreas para melhorar.

  • Considere a lógica de negócio e o efeito do utilizador: avalie a importância de diferentes caminhos de código com base na respetiva relevância para a funcionalidade da aplicação ou operações empresariais críticas. Determine que caminhos de código são cruciais para fornecer valor aos utilizadores ou cumprir os requisitos de desempenho.

Otimizar a lógica de código

Otimizar a lógica de código consiste em refinar a estrutura e a estrutura do código para realizar tarefas com menos recursos. A lógica melhorada reduz as operações desnecessárias. Cria uma execução mais rápida com menos consumo de recursos. Deve remover quaisquer operações desnecessárias no caminho do código que possam afetar o desempenho. Dê prioridade à otimização de caminhos frequentes para ver os maiores ganhos de eficiência de desempenho. Para otimizar a lógica de código, considere as seguintes estratégias:

  • Remover chamadas de função desnecessárias: reveja o código e identifique quaisquer funções que não sejam essenciais para a funcionalidade pretendida e que possam afetar negativamente o desempenho. Por exemplo, se uma chamada de função executar uma validação concluída anteriormente no código, pode remover a chamada de função de validação desnecessária.

  • Minimizar as operações de registo: o registo pode ser útil para depuração e análise, mas o registo excessivo pode afetar o desempenho. Avalie a necessidade de cada operação de registo e remova quaisquer chamadas de registo desnecessárias que não sejam essenciais para a análise de desempenho.

  • Otimizar ciclos e condicionais: analise ciclos e condicionais no seu código e identifique quaisquer iterações ou condições desnecessárias que possam ser eliminadas. Simplificar e otimizar estas estruturas pode melhorar o desempenho do seu código. Minimize as chamadas de função dentro de ciclos e elimine cálculos redundantes. Considere mover cálculos para fora do ciclo ou utilizar a anulação da inscrição do ciclo.

  • Reduzir o processamento de dados desnecessários: reveja o código para quaisquer operações de processamento de dados desnecessárias, tais como cálculos redundantes ou transformações. Elimine estas operações desnecessárias para melhorar a eficiência do seu código.

  • Otimizar estruturas de dados. Para armazenar e obter dados de forma eficiente, selecione estruturas de dados adequadas, como matrizes, listas ligadas, árvores e tabelas hash. Escolha a melhor estrutura de dados para um problema específico. Uma estrutura de dados adequada melhora o desempenho da aplicação.

  • Minimizar pedidos de rede: se o código envolver a realização de pedidos de rede, minimize o número de pedidos e otimize a respetiva utilização. Quando possível, o Batch pede e evita viagens de ida e volta desnecessárias para melhorar o desempenho.

  • Minimizar alocações: identifique as áreas onde ocorre a alocação excessiva de memória. Otimize o código ao reduzir as alocações desnecessárias e reutilizar os recursos existentes sempre que possível. Ao minimizar as alocações, pode melhorar a eficiência da memória e o desempenho geral. Utilize as estratégias de gestão de memória e de recolha de memória adequadas para a sua linguagem de programação.

  • Reduzir o tamanho da estrutura de dados: avalie o tamanho das suas estruturas de dados, como classes, e identifique as áreas onde a redução é possível. Reveja os requisitos de dados e elimine quaisquer campos ou propriedades desnecessários. Otimize a utilização da memória ao selecionar tipos de dados adequados e empacotar dados de forma eficiente.

  • Utilize SDKs e bibliotecas otimizados para desempenho. Utilize SDKs nativos ou bibliotecas otimizadas para o desempenho. Os SDKs nativos foram concebidos para interagir com os serviços e recursos numa plataforma ou numa arquitetura. Por exemplo, os SDKs nativos da cloud funcionam melhor com planos de dados do serviço cloud do que com acesso personalizado à API. Os SDKs do Excel lidam com pedidos de rede e otimizam as interações. As bibliotecas otimizadas para o desempenho, como Math.NET, contêm funções otimizadas para o desempenho. Quando aplica as funções adequadamente, pode melhorar o desempenho da carga de trabalho.

  • Implementação cruzada: considere os efeitos de implementações transversais, como verificações de middleware ou token, e avalie se afetam negativamente o desempenho.

Reveja as recomendações de desempenho específicas da linguagem de programação com a qual está a trabalhar. Avalie o código em relação a estas recomendações para identificar áreas para melhorar.

Vantagens:

  • A otimização de códigos e caminhos frequentes requer conhecimentos do programador na identificação de ineficiências de código é subjetiva e pode ser um indivíduo altamente qualificado necessário para outras tarefas.
  • Os SDKs proporcionam conveniência e eliminam as complexidades da interação com as APIs. Contudo, os SDKs podem limitar as suas opções de controlo e personalização para código personalizado.

Otimizar a gestão de memória

Otimizar a gestão de memória envolve refinar a forma como uma carga de trabalho utiliza, aloca e liberta recursos de memória para melhorar a eficiência. A gestão de memória adequada melhora o desempenho do código porque reduz a sobrecarga das operações de memória. A utilização eficiente da memória reduz a latência, impede abrandamentos ou falhas do sistema e maximiza o débito das tarefas computacionais. Considere as seguintes estratégias para otimizar a gestão da memória.

Depurar problemas de memória. As capturas de memória são instantâneos de memória da aplicação. Capturam o estado de memória de uma aplicação num ponto específico no tempo. As capturas de memória permitem a análise retrospectiva de problemas relacionados com a memória. Selecione o tipo adequado de captura de memória com base na natureza do problema que está a tentar diagnosticar e nos recursos disponíveis. Deve utilizar capturas em miniatura para depuração de rotina e capturas completas para problemas complexos e críticos. Esta estratégia fornece um equilíbrio entre a utilização de recursos e as capacidades de diagnóstico. Muitos serviços de alojamento de código suportam a depuração de memória. Deve preferir serviços que suportem a análise de memória em vez dos serviços que não suportam. Eis os passos básicos para depurar problemas de memória:

  1. Capturar capturas de memória: comece por configurar um mecanismo para capturar capturas de memória durante o runtime da sua aplicação. A captura pode ser acionada manualmente, automaticamente ou quando são cumpridas condições específicas (como consumo excessivo de memória). Alguns serviços cloud podem já oferecer este processo.

  2. Analisar capturas de memória: depois de recolher as capturas de memória, analise-as. Várias ferramentas podem ajudá-lo a inspecionar estas informações de falha de sistema, como o WinDbg para aplicações Windows ou o GDB para sistemas baseados em Unix.

  3. Identificar fugas de memória: foco na identificação de fugas de memória durante a análise. As fugas de memória surgem quando a aplicação aloca memória, mas não a liberta quando a memória já não é necessária. Procure objetos ou estruturas de dados que permaneçam na memória mesmo quando devem ser desalocados.

  4. Corrigir e testar: após identificar o código problemático, concentre-se na resolução dos problemas de memória. As resoluções podem envolver libertar memória corretamente, otimizar estruturas de dados ou reavaliar as práticas de gestão de memória. Confirme que as suas soluções são submetidas a testes rigorosos para garantir a eficácia.

  5. Iterar e monitorizar: a gestão da memória é um processo contínuo. Monitorize rotineiramente a utilização da memória da sua aplicação e persista na recolha de capturas de memória em produção. Reveja regularmente as fases de análise e otimização para se certificar de que os problemas de memória não voltam a aparecer com modificações de código subsequentes.

Ao incorporar a análise de captura de memória no seu ciclo de vida de desenvolvimento de software, pode amplificar a fiabilidade e eficiência das suas aplicações. Ajuda a reduzir a probabilidade de problemas relacionados com a memória na produção.

Reduza as alocações de memória. Minimize as alocações de memória para reduzir a pegada de memória geral do código. A carga de trabalho pode utilizar a memória disponível de forma eficiente. Há menos necessidade de o recoletor de lixo recuperar memória não utilizada e reduz a frequência e duração dos ciclos de recolha de lixo. As alocações de memória podem ser dispendiosas, especialmente se as executar com frequência. Minimize as alocações de memória, para que o código possa ser executado de forma rápida e eficiente.

As caches armazenam dados acedidos frequentemente perto do processador, o que melhora o desempenho. Quando minimiza as alocações de memória, existe menos contenção para espaço em cache, para que possa utilizar eficazmente a cache. Um número elevado de alocações de memória pode degradar o desempenho da aplicação e gerar erros. Outras formas de minimizar as alocações de memória incluem:

  • Variáveis locais: utilize variáveis locais em vez de variáveis globais para minimizar o consumo de memória.

  • Inicialização preguiçosa: implemente a inicialização preguiçosa para adiar a criação de objetos ou recursos até que sejam necessários.

  • Memórias intermédias: faça a gestão eficaz das memórias intermédias para evitar alocar memória intermédias grandes.

  • Agrupamento de objetos: considere o agrupamento de objetos para reutilizar objetos grandes em vez de os alocar e desalocar.

Para obter mais informações, veja Reduzir as alocações de memória e A grande área de dados de objetos em sistemas Windows.

Utilizar simultaneidade e paralelismo

A utilização da simultaneidade e do paralelismo envolve a execução de múltiplas tarefas ou processos simultaneamente ou de forma sobreposta para fazer uma utilização eficiente dos recursos de computação. Estas técnicas aumentam o débito geral e o número de tarefas que uma carga de trabalho pode processar. Quando executa tarefas simultaneamente ou em paralelo, reduz o runtime da aplicação e diminui a latência e aumenta os tempos de resposta. A simultaneidade e o paralelismo permitem uma utilização eficiente dos recursos de computação, como núcleos de CPU ou sistemas distribuídos. A simultaneidade e o paralelismo distribuem eficazmente a carga de trabalho entre os recursos de computação.

Utilize paralelismo. O paralelismo é a capacidade de um sistema acionar simultaneamente várias tarefas ou processos em múltiplos recursos de computação. O paralelismo divide uma carga de trabalho em tarefas mais pequenas executadas em paralelo. Pode alcançar o paralelismo com técnicas como multiprocessamento ou computação distribuída. Distribuir tarefas por processadores multicore para otimizar a gestão de cargas de trabalho. Otimize o código para tirar partido da arquitetura da CPU, dos modelos de thread e dos processadores multicore. Quando executa código em paralelo, o desempenho melhora porque a carga de trabalho é distribuída por vários núcleos.

Utilize a simultaneidade. A simultaneidade é a capacidade de um sistema executar várias tarefas ou processos. A simultaneidade permite que diferentes partes de um programa progridam de forma independente, o que pode melhorar o desempenho geral. Pode implementar a simultaneidade através de técnicas como a multithreading, em que vários threads são executados simultaneamente num único processo. Também pode utilizar programação assíncrona, na qual as tarefas são acionadas em simultâneo.

  • Programação assíncrona: a programação assíncrona é uma abordagem para acionar tarefas sem bloquear o thread principal. A programação assíncrona permite que um programa acione tarefas enquanto aguarda que as operações de execução prolongada sejam concluídas. Com a programação assíncrona, o programa pode iniciar várias tarefas e aguardar que sejam concluídas de forma assíncrona. O programa não tem de esperar que cada tarefa seja concluída antes de avançar para a próxima.

    Existem muitas técnicas e padrões de programação assíncronos, consoante a linguagem e a plataforma de programação. Uma abordagem comum é utilizar palavras-chave e construções assíncronas, como async e await, em idiomas como C#. Com estas palavras-chave, pode definir métodos assíncronos. Para tráfego HTTP, considere utilizar o padrão de Request-Reply Assíncrono.

    Muitas arquiteturas e bibliotecas fornecem suporte incorporado para programação assíncrona. Por exemplo, na plataforma .NET, pode implementar operações assíncronas através de padrões como padrões Assíncronos Baseados em Tarefas e padrão Assíncrono Baseado em Eventos. A implementação específica da programação assíncrona varia consoante a linguagem de programação, a plataforma e os requisitos da aplicação.

  • Filas: uma fila é uma memória intermédia de armazenamento localizada entre um componente de pedido (produtor) e o componente de processamento (consumidor) da carga de trabalho. Pode haver vários consumidores para uma única fila. À medida que as tarefas aumentam, deve dimensionar os consumidores para satisfazer a procura. O produtor coloca tarefas numa fila. A fila armazena as tarefas até que um consumidor tenha capacidade. Uma fila é, muitas vezes, a melhor forma de entregar o trabalho a um serviço de processamento que tenha picos de procura. Para obter mais informações, veja Padrão de Nivelamento de Carga Baseado em Filas e Filas de armazenamento e filas do Service Bus.

Utilizar o conjunto de ligações

O conjunto de ligações é a prática de reutilizar conexões de banco de dados estabelecidos em vez de criar uma nova ligação para cada pedido. Pode ser dispendioso estabelecer uma ligação a uma base de dados. Tem de criar uma ligação de rede autenticada ao servidor de base de dados remoto. As ligações de base de dados são especialmente dispendiosas para aplicações que abrem frequentemente novas ligações. O conjunto de ligações reutiliza as ligações existentes e elimina as despesas de abertura de uma nova ligação para cada pedido. O agrupamento de ligações reduz a latência de ligação e permite um débito de base de dados elevado (transações por segundo) no servidor. Deve escolher um tamanho de conjunto que consiga processar mais ligações do que tem atualmente. O objetivo é que o conjunto de ligações processe rapidamente novos pedidos recebidos.

Compreender os limites do conjunto de ligações. Alguns serviços limitam o número de ligações de rede. Quando excede este limite, as ligações podem abrandar ou terminar. Pode utilizar o conjunto de ligações para estabelecer um conjunto fixo de ligações no momento do arranque e, em seguida, manter essas ligações. Em muitos casos, um tamanho de conjunto predefinido pode consistir apenas em algumas ligações que funcionam rapidamente em cenários de teste básicos. A sua aplicação pode esgotar o tamanho predefinido do conjunto em escala e criar um estrangulamento. Deve estabelecer um tamanho de conjunto que mapeie para o número de transações simultâneas suportadas em cada instância de aplicação.

Teste o conjunto de ligações. Cada base de dados e plataforma de aplicações tem requisitos ligeiramente diferentes para configurar e utilizar um conjunto. Teste o conjunto de ligações para garantir que funciona de forma eficiente sob carga.

Risco: o agrupamento de ligações pode criar fragmentação do conjunto e degradar o desempenho.

Otimizar tarefas em segundo plano

Muitas aplicações requerem tarefas em segundo plano que são executadas independentemente da IU. A aplicação pode iniciar a tarefa e continuar a processar pedidos interativos de utilizadores. Exemplos de tarefas em segundo plano incluem tarefas em lote, tarefas intensivas de processador e processos de execução prolongada, como fluxos de trabalho. As tarefas em segundo plano não devem bloquear a aplicação ou causar inconsistências devido a uma operação atrasada quando o sistema está sob carga. Para melhorar o desempenho, pode dimensionar as instâncias de computação que alojam tarefas em segundo plano. Para obter mais informações, veja Considerações sobre tarefas em segundo planoe dimensionamento e desempenho.

Otimizar o desempenho da infraestrutura

Otimizar o desempenho da infraestrutura significa melhorar e ajustar os elementos da infraestrutura para garantir a operação de pico e a melhor utilização dos recursos para uma carga de trabalho. Ao otimizar a infraestrutura, pode minimizar o desperdício, reduzir os atrasos e obter mais com os recursos disponíveis. Garante que as cargas de trabalho são executadas de forma fiável e rápida, o que leva a uma melhoria das experiências dos utilizadores e da poupança de custos. Para otimizar o desempenho da infraestrutura, considere as seguintes estratégias:

Adicionar limites de utilização. Pode implementar limites de utilização em alguns componentes da carga de trabalho. Por exemplo, para remover pods instáveis, pode definir limites de cpu e memória de pods no Azure Kubernetes Service (AKS). Para otimizar o desempenho, pode definir limites de memória em máquinas virtuais (VMs) Java.

Simplificar a infraestrutura. Simplifique a carga de trabalho para reduzir o potencial de problemas de interação, dependência e compatibilidade. Quando simplifica a carga de trabalho, otimiza a utilização de recursos da memória, do processamento e do armazenamento.

Reduza a carga. Para reduzir a carga de trabalho, minimize a procura efetuada numa aplicação e ative os recursos para realizarem as tarefas primárias. Por exemplo, é prática comum evitar a execução de soluções de segurança no seu código ou em instâncias de computação individuais. Em vez disso, os servidores Web devem servir pedidos HTTP. As firewalls de aplicações Web e os recursos de gateway podem processar verificações de segurança. As seguintes estratégias ajudam a reduzir a carga de trabalho:

  • Consistência eventual: adote um modelo de consistência eventual para melhorar o desempenho ao permitir que os dados sejam ligeiramente datados. A consistência eventual reduz a procura imediata em ciclos de CPU e largura de banda de rede para atualizações de dados constantes.

  • Delegar tarefas: delegar tarefas de servidor a clientes ou intermediários, como índices de pesquisa e caches. Delegar tarefas como ordenar dados, filtrar dados ou compor vistas. Quando descarrega estas tarefas, reduz a carga de trabalho nos servidores e melhora o desempenho.

Otimizar a rede. Para otimizar uma rede de cargas de trabalho para desempenho, configure e ajuste a infraestrutura de rede. Certifique-se de que a carga de trabalho pode funcionar ao nível mais elevado de eficiência.

  • Protocolos de rede: atualize para protocolos modernos, como HTTP/2, que permitem o envio de vários pedidos através de uma única ligação. Os protocolos modernos reduzem a sobrecarga do estabelecimento de novas ligações.

    Desvantagem: os protocolos modernos podem excluir clientes mais antigos.

  • Chatiness de rede: a rede do Batch pede em conjunto para reduzir o número de pedidos. Em vez de fazer vários pedidos pequenos, combine-os em pedidos maiores para reduzir a sobrecarga de rede.

  • Consultas de base de dados: certifique-se de que as consultas da base de dados obtêm apenas as informações necessárias. Evite obter grandes quantidades de dados desnecessários, o que pode levar a um aumento do tráfego de rede e a um desempenho lento.

  • Dados estáticos: utilize uma rede de entrega de conteúdos para colocar em cache conteúdos estáticos acedidos frequentemente próximos dos utilizadores. Quando coloca dados em cache, não tem de percorrer longas distâncias. A colocação em cache melhora os tempos de resposta e reduz o tráfego de rede.

  • Recolha de registos: recolha e retenha apenas os dados de registo necessários para suportar os seus requisitos. Configure regras de recolha de dados e implemente considerações de conceção para otimizar os custos do Log Analytics.

  • Compressão de dados: comprima e agrupe os conteúdos HTTP e os dados de ficheiros para permitir uma transmissão rápida entre clientes e servidores. A compressão reduz os dados que uma página ou API devolve e envia de volta para o browser ou aplicação cliente. A compressão otimiza o tráfego de rede, o que pode acelerar a comunicação da aplicação.

    Troca: a compressão adiciona o processamento do lado do servidor e do lado do cliente. A aplicação tem de comprimir, enviar e descomprimir dados. A comunicação multicast ou a comunicação com vários destinatários podem criar sobrecarga de descompressão. Tem de testar e medir as variações de desempenho antes e depois de implementar a compressão de dados para determinar se é uma boa opção para a carga de trabalho. Para obter mais informações, veja Compressão de resposta no ASP.NET Core.

Facilitação do Azure

Código de instrumentação: o Azure Monitor Application Insights suporta instrumentação automática (autoinstrumentação) e instrumentação manual do código da aplicação. A autoinstrumentação ativa a coleção de telemetria sem tocar no código da aplicação. A instrumentação manual requer alterações de código para implementar o Application Insights ou a API OpenTelemetry. Pode utilizar o Application Insights Profiler para ajudar a otimizar caminhos frequentes.

Otimizar a lógica de código: o Azure oferece SDKs e bibliotecas para várias linguagens de programação interagirem com os serviços do Azure. Utilize SDKs para simplificar as interações entre aplicações e recursos do Azure. Os SDKs proporcionam uma interação ideal com os serviços do Azure, o que reduz a latência e melhora a eficiência.

Otimizar a gestão de memória: utilize a funcionalidade de deteção inteligente do Application Insights para analisar o consumo de memória e ajudar a identificar e resolver fugas de memória.

Serviço de Aplicações do Azure tem uma funcionalidade de análise e recolha de memória e de criação de perfis. O Serviço de Aplicações funcionalidade dehealização automática pode utilizar automaticamente capturas de memória e rastreios de perfis de aplicações .NET e Java.

Utilizar simultaneidade e paralelismo: diferentes serviços do Azure fornecem suporte exclusivo para simultaneidade, como o Azure Cosmos DB, o Funções do Azure e o Armazenamento de Blobs. Para paralelismo, os serviços do AKS suportam a implementação de aplicações em contentores, o que melhora o processamento paralelo.

Azure Batch é um serviço de agendamento de tarefas baseado na cloud que pode utilizar para ativar a computação paralela e de alto desempenho sem a necessidade de configuração da infraestrutura. Para obter mais informações, veja Tarefas em segundo plano.

Otimizar o desempenho da infraestrutura: implemente modelos de Resource Manager do Azure para definir e implementar a infraestrutura com código. Utilize estes modelos para implementar implementações de recursos eficientes, repetíveis e consistentes. Azure Policy fornece capacidades de governação para garantir que as implementações de recursos cumprem as melhores práticas e normas organizacionais.

Para programação assíncrona, utilize serviços de fila dimensionáveis, como o Armazenamento de Filas do Azure e Azure Service Bus, para facilitar a programação assíncrona. Pode colocar tarefas em fila e processá-las de forma independente. Para suportar operações assíncronas, Azure Marketplace oferece filas e ferramentas de terceiros que pode integrar nos serviços do Azure.

Lista de verificação de Eficiência de Desempenho

Veja o conjunto completo de recomendações.