• EnglishEspañol日本語한국어Português
  • Inicia sesiónComenzar ahora

Te ofrecemos esta traducción automática para facilitar la lectura.

In the event of any inconsistency between the English version and the translated version, the English versionwill take priority. Please visit this page for more information.

Crea una propuesta

Alta contención de bloqueo AppDomain.GetData() (.NET framework)

Problema

Cuando el agente .NET está conectado a la aplicación .NET Framework de alto rendimiento, algunos clientes informaron haber observado una alta contención de subprocesos. Al revisar los volcados del proceso y el rastreo del stack, es posible que muchos hilos estén bloqueados por llamadas a AppDomain.GetData().

Solución posible

En la versión 9.7 del agente .NET, se introdujo una nueva variable de entorno que deshabilita el uso del almacenamiento AppDomain por parte del agente .NET:

NEW_RELIC_DISABLE_APPDOMAIN_CACHING=true

Advertencia

Si bien esta variable de entorno elimina la contención de bloqueo de las llamadas del agente a AppDomain.GetData(), la sobrecarga total del agente .NET aumenta cuando esta variable de entorno está habilitada. En nuestras pruebas, esto resultó en un menor bloqueo, pero un menor rendimiento máximo de la aplicación con el agente .NET conectado a una aplicación de prueba.

Estamos muy interesados en cualquier comentario de los clientes que experimenten este problema y prueben esta nueva opción de configuración. Si prueba esta opción de configuración, cree un problema en nuestro repositorio de GitHub para .NET que describa su experiencia.

Causa

El agente .NET necesita acceso a la información de firma del método para los métodos de instrumento. De forma predeterminada, para la aplicación .NET framework , el agente carga la información de este método mediante reflexión y la almacena en caché en AppDomain para uso futuro. Esto pretende ser una optimización general, pero varios clientes han experimentado un alto conflicto de bloqueo de subprocesos en torno a este comportamiento y creen que es la causa principal de que los servicios se vuelvan lentos o no respondan.

Después de inspeccionar el código fuente de Microsoft, las llamadas a AppDomain.GetData() de hecho dan como resultado un bloqueo global.

Dado que el agente .NET no utiliza ningún esquema de almacenamiento en caché de información de métodos para la aplicación .NET Core, y ningún cliente ha informado problemas similares de contención de bloqueo de subprocesos, decidimos exponer una variable de entorno para que el agente funcione de la misma manera en .NET. aplicación framework .

Copyright © 2024 New Relic Inc.

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