Problema
O agente .NET armazena em cache as informações do método necessárias para chamar o agente a partir de métodos instrumentados. Desde a versão 10.54.0, o agente usa esse cache para aplicativos do framework .NET e .NET ou .NET Core. Antes da versão 10.54.0, o agente o usava apenas para aplicativos do framework .NET.
O cache pode causar estes sintomas:
- .NET framework: um aplicativo com altas taxas de transferência apresenta alta contenção de threads. Dumps de processo e stack trace mostram muitas threads bloqueadas em chamadas para
AppDomain.GetData(). - .NET ou .NET Core, versões do agente 10.54.0 a 10.56.0: O aplicativo usa mais memória nativa do que usava com a versão 10.53.x do agente. O aumento cresce com o número de assemblies que o aplicativo carrega.
Causa
O agente .NET precisa de informações de assinatura de método para instrumentar métodos. Para evitar uma chamada de reflexão toda vez que um método instrumentado é executado, o agente armazena essas informações em cache. O cache usa mais memória para economizar tempo de CPU. Em nossos testes, os aplicativos apresentaram maiores taxas de transferência máximas com o cache ativado.
No .NET framework, o agente armazena parte desse cache no armazenamento AppDomain. As chamadas para AppDomain.GetData() adquirem um bloqueio global, o que pode causar contenção de thread em alguns aplicativos de altas taxas de transferência.
No .NET e no .NET Core, as versões do agente 10.54.0 a 10.56.0 adicionam referências a métodos auxiliares do agente a cada módulo que o aplicativo carrega, incluindo módulos que não têm métodos instrumentados. O tempo de execução mantém uma cópia dos metadados de cada módulo alterado na memória nativa.
Antes de alterar as configurações do agente
Os sintomas acima podem ter muitas causas. Entre em contato com o suporte da New Relic com um dump de thread ou medições de memória antes de alterar as configurações do agente. O suporte pode confirmar se o cache de método do agente é a causa.
Solução
Caso utilize o agente .NET 10.54.0 a 10.56.0 no .NET ou .NET Core e observe o aumento de memória nativa descrito acima, atualize o agente para uma versão mais recente que a 10.56.0. Nessas versões, o agente adiciona essas referências apenas a System.Private.CoreLib e a módulos que têm métodos instrumentados.
Se o suporte confirmar que o cache de método do agente é a causa e não for possível atualizar o agente, é possível desativar o cache com esta variável de ambiente:
NEW_RELIC_DISABLE_APPDOMAIN_CACHING=trueEssa configuração está disponível na versão 9.7 e superior do agente .NET e se aplica a aplicativos do framework .NET, .NET e .NET Core. É possível deixá-la ativada a longo prazo.
Cuidado
Essa configuração não reduz o uso de heap gerenciado e não corrige requests lentos ou CPU alta. Com o cache desativado, o agente usa reflexão cada vez que um método instrumentado é executado, o que aumenta a sobrecarga do agente. Em nossos testes, os aplicativos tiveram taxas de transferência máximas menores com o cache desativado.