• EnglishEspañol日本語한국어Português
  • EntrarComeçar agora

Esta tradução de máquina é fornecida para sua comodidade.

Caso haja alguma divergência entre a versão em inglês e a traduzida, a versão em inglês prevalece. Acesse esta página para mais informações.

Criar um problema

Alta contenção de bloqueio AppDomain.GetData() (.NET framework)

Problema

Quando o agente .NET é anexado ao aplicativo de altas taxas de transferência .NET Framework , alguns clientes relataram observar alta contenção de threads. Ao revisar os dumps do processo e o rastreamento de pilha, muitos threads podem ser bloqueados por chamadas para AppDomain.GetData().

Solução possível

Na versão 9.7 do agente .NET, foi introduzida uma nova variável de ambiente que desativa o uso do armazenamento AppDomain pelo agente .NET:

NEW_RELIC_DISABLE_APPDOMAIN_CACHING=true

Cuidado

Embora essa variável de ambiente elimine a contenção de bloqueio de chamadas de agente para AppDomain.GetData(), a sobrecarga total do agente .NET aumenta quando essa variável de ambiente é habilitada. Em nossos testes, isso resultou em menos bloqueios, mas em taxas máximas de transferência de aplicação mais baixas com o agente .NET anexado a uma aplicação de teste.

Estamos extremamente interessados em comentários de clientes que enfrentam esse problema e que tentam essa nova opção de configuração. Se você tentar esta opção de configuração, crie um problema em nosso repositório GitHub para .NET descrevendo sua experiência.

Causa

O agente .NET precisa de acesso às informações de assinatura de métodos para métodos do instrumento. Por padrão para o aplicativo .NET framework , o agente carrega essas informações de método por meio de reflexão e as armazena em cache no AppDomain para uso futuro. Pretende-se que esta seja uma otimização geral, mas vários clientes experimentaram uma alta contenção de bloqueio de thread em torno desse comportamento e acreditam que é a causa raiz da lentidão ou da não resposta dos serviços.

Depois de inspecionar o código-fonte da Microsoft, as chamadas para AppDomain.GetData() resultam de fato em um bloqueio global.

Como o agente .NET não usa nenhum esquema de cache de informações de método para o aplicativo .NET Core e nenhum cliente relatou problemas semelhantes de contenção de bloqueio de thread, decidimos expor uma variável de ambiente para fazer o agente funcionar da mesma maneira no .NET aplicativo framework .

Copyright © 2024 New Relic Inc.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.