Pequenas mudanças no código, impacto gigantesco em produção

As vezes, pequenas mudanças no código podem ter impacto gigantesco na performance de um sistema em produção. Constatamos isso, recentemente, trabalhando na otimização de uma API externa para cálculo de fretes.

Sempre que aparecem dificuldades para suportar a escala, é comum considerar aumentar o poder computacional melhorando a configuração do hardware utilizado ou investindo em mais nós no cluster. Entretanto, economicamente, essa saída nem sempre é a mais viável. Muitas vezes, alterações no código tem potencial de melhorar muito a capacidade de suportar a demanda sem necessidade de aprovisionamentos.

O cenário

O código que alteramos calcula o peso dos itens de um carrinho de compras para, na sequência, considerando o CEP do endereço de entrega, localizar a faixa de custo apropriada em um banco de dados de alta performance.

Em nosso teste de carga, executado em uma máquina padrão de mercado, adotamos a seguinte configuração:

  • 240vus,
  • Um ramp-up por segundo
  • 600 iterações a cada ramp-up
  • duração de 120s.

Os tempos de resposta de boa parte das requisições excediam 150ms (tempo limite estabelecido em conjunto com o parceiro de negócios). Em alguns casos, o tempo de resposta ultrapassava 200ms.

Importante destacar que a faixa de erros apresentada (7,53%) é esperada, em função de requisições para CEPs não encontrados na base de dados.

O que mudamos

Sabemos que o Garbage Collector pode impactar consideravelmente a performance das aplicações em .NET. Por isso, resolvemos analisar de forma mais detalhada seu comportamento na execução da API.

Em nossos testes de carga, confirmamos acionamentos frequentes do GC.

Ao analisar o código, verificamos, imediatamente, oportunidades de otimização. Primeiro, convertemos algumas pequenas classes imutáveis, com instâncias criadas no hotpath, para struct. Além disso, experimentalmente, substituímos a criação de novas instâncias de List , permeadas no código, por arrays reaproveitáveis com ArrayPool.

O resultado dessas modificações foi a redução significativa de acionamentos no GC.

Estas modificações simples aumentaram a capacidade de atendimento do serviço em 30%. Além disso, o response time ficou 5 vezes melhor. Ou seja, a API passou a processar muito mais requisições, consumindo recursos de forma muito mais eficaz.

Suporte para mais carga!

Resolvemos estressar ainda mais nossa API e dobramos a caga em nosso teste. Passamos a adotar a seguinte configuração:

  • 480vus
  • um ramp-up a cada segundo
  • 800 iterações
  • duração de 120s.

O resultado foi que ao final da execução a média do response time ficou em 59ms, ainda abaixo do tempo que estávamos obtendo inicialmente.

Na prática, conseguimos atender muito mais requisições com o mesmo hardware. Melhoramos em muito a produtividade da aplicação.

Confirmamos, mais uma vez, que o GC pode ter impacto determinante na performance de uma aplicação em .NET. É importante, principalmente em sistemas com utilização de larga escala, ao revisar o código buscando mais performance, verificar se a memória está sendo utilizada de forma razoável.

Compartilhe este insight:

Comentários

Participe deixando seu comentário sobre este artigo a seguir:

Subscribe
Notify of
guest
5 Comentários
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Antonio Lopes
Antonio Lopes
4 anos atrás

Olá, primeiramente parabéns pelo trabalho.

Gostaria de entender mais sobre Load Tests, qual ferramenta utilizar, como utilizar, se há ferramentas gratuitas que são boas, diferença entre Load Test e Stress Test enfim…

Obrigado e, parabéns novamente.

Tiago Tartari
Tiago Tartari
4 anos atrás

Antonio, tudo bem?

Obrigado por contribuir fazendo perguntas.
Usamos o jmeter é free.

Vamos pegar sua sugestão e escrever um post sobre as diferenças entre teste de carga e teste de performance, também vamos mostrar um pouco mais das ferramentas.

Ok?

Daniel
Daniel
4 anos atrás

Essa ferramenta mostrada nas imagens deste tópico é o jmeter mesmo ?

Tiago Tartari
Tiago Tartari
4 anos atrás

Tudo bem Daniel?

Não. Os gráficos foram feitos no Grafana, utilizando Prometheus e AppMetrics.

O JMeter foi utilizado para realizar o stress test.

Vinícius Mamoré Caldeira de Oliveira
Vinícius Mamoré Caldeira de Oliveira
4 anos atrás

Ótimo conteudo pessoal, obrigado!

AUTOR

Elemar Júnior
Fundador e CEO da EximiaCo atua como tech trusted advisor ajudando empresas e profissionais a gerar mais resultados através da tecnologia.

NOVOS HORIZONTES PARA O SEU NEGÓCIO

Nosso time está preparado para superar junto com você grandes desafios tecnológicos.

Entre em contato e vamos juntos utilizar a tecnologia do jeito certo para gerar mais resultados.

Insights EximiaCo

Confira os conteúdos de negócios e tecnologia desenvolvidos pelos nossos consultores:

Arquivo

Pós-pandemia, trabalho remoto e a retenção dos profissionais de TI

CTO Consulting e Especialista em Execução em TI
5
0
Queremos saber a sua opinião, deixe seu comentáriox
Masterclass

O Poder do Metamodelo para Profissionais Técnicos Avançarem

Nesta masterclass aberta ao público, vamos explorar como o Metamodelo para a Criação, desenvolvido por Elemar Júnior, pode ser uma ferramenta poderosa para alavancar sua carreira técnica em TI.

A sua inscrição foi realizada com sucesso!

O link de acesso à live foi enviado para o seu e-mail. Nos vemos no dia da live.

Muito obrigado!

Deu tudo certo com seu envio!
Logo entraremos em contato

Pequenas mudanças no código, impacto gigantesco em produção

Para se candidatar nesta turma aberta, preencha o formulário a seguir:

Pequenas mudanças no código, impacto gigantesco em produção

Para se candidatar nesta turma aberta, preencha o formulário a seguir:

Condição especial de pré-venda: R$ 14.000,00 - contratando a mentoria até até 31/01/2023 e R$ 15.000,00 - contratando a mentoria a partir de 01/02/2023, em até 12x com taxas.

Tenho interesse nessa capacitação

Para solicitar mais informações sobre essa capacitação para a sua empresa, preencha o formulário a seguir:

Tenho interesse em conversar

Se você está querendo gerar resultados através da tecnologia, preencha este formulário que um de nossos consultores entrará em contato com você:

O seu insight foi excluído com sucesso!

O seu insight foi excluído e não está mais disponível.

O seu insight foi salvo com sucesso!

Ele está na fila de espera, aguardando ser revisado para ter sua publicação programada.

Tenho interesse em conversar

Se você está querendo gerar resultados através da tecnologia, preencha este formulário que um de nossos consultores entrará em contato com você:

Tenho interesse nessa solução

Se você está procurando este tipo de solução para o seu negócio, preencha este formulário que um de nossos consultores entrará em contato com você:

Tenho interesse neste serviço

Se você está procurando este tipo de solução para o seu negócio, preencha este formulário que um de nossos consultores entrará em contato com você:

× Precisa de ajuda?