Supervisión de recursos de dominio de aplicaciónApplication Domain Resource Monitoring

La supervisión de recursos de dominio de aplicación (ARM) permite a los hosts supervisar el uso de CPU y de memoria por parte del dominio de aplicación.Application domain resource monitoring (ARM) enables hosts to monitor CPU and memory usage by application domain. Esto es útil para los hosts como ASP.NET que utilizan varios dominios de aplicación en un proceso de ejecución prolongada.This is useful for hosts such as ASP.NET that use many application domains in a long-running process. El host puede descargar el dominio de aplicación de una aplicación que afecta negativamente al rendimiento de todo el proceso, pero solo si puede identificar la aplicación problemática.The host can unload the application domain of an application that is adversely affecting the performance of the entire process, but only if it can identify the problematic application. ARM proporciona información que puede usarse para ayudar a tomar estas decisiones.ARM provides information that can be used to assist in making such decisions.

Por ejemplo, un servicio de hospedaje podría tener muchas aplicaciones que se ejecutan en un servidor ASP.NET.For example, a hosting service might have many applications running on an ASP.NET server. Si una aplicación del proceso empieza a consumir demasiada memoria o demasiado tiempo de procesador, el servicio de hospedaje puede usar ARM para identificar el dominio de aplicación que causa el problema.If one application in the process begins consuming too much memory or too much processor time, the hosting service can use ARM to identify the application domain that is causing the problem.

ARM es lo bastante ligero para utilizarlo en aplicaciones dinámicas.ARM is sufficiently lightweight to use in live applications. Puede acceder a la información mediante el uso del Seguimiento de eventos para Windows (ETW) o directamente a través de API administradas o nativas.You can access the information by using event tracing for Windows (ETW) or directly through managed or native APIs.

Habilitación de la supervisión de recursosEnabling Resource Monitoring

ARM se puede habilitar de cuatro maneras: proporcionando un archivo de configuración cuando se inicia Common Language Runtime (CLR), mediante el uso de API de hospedaje no administradas, mediante código administrado o escuchando los eventos ETW de ARM.ARM can be enabled in four ways: by supplying a configuration file when the common language runtime (CLR) is started, by using an unmanaged hosting API, by using managed code, or by listening to ARM ETW events.

En cuanto se habilita ARM, comienza a recopilar datos en todos los dominios de aplicación del proceso. Si un dominio de aplicación se creó antes de habilitar ARM, los datos acumulativos se inician cuando se habilita ARM, no cuando se creó el dominio de aplicación. Una vez habilitado ARM, no se puede deshabilitar.As soon as ARM is enabled, it begins collecting data on all application domains in the process.If an application domain was created before ARM is enabled, cumulative data starts when ARM is enabled, not when the application domain was created.Once it is enabled, ARM cannot be disabled.

  • Puede habilitar ARM al iniciar el CLR agregando el elemento <appDomainResourceMonitoring> al archivo de configuración y estableciendo el atributo enabled en true.You can enable ARM at CLR startup by adding the <appDomainResourceMonitoring> element to the configuration file, and setting the enabled attribute to true. Un valor de false (el valor predeterminado) solo significa que no se habilita ARM durante el inicio; puede activarlo posteriormente mediante uno de los otros mecanismos de activación.A value of false (the default) means only that ARM is not enabled at startup; you can activate it later by using one of the other activation mechanisms.

  • El host puede habilitar ARM solicitando la interfaz de hospedaje ICLRAppDomainResourceMonitor.The host can enable ARM by requesting the ICLRAppDomainResourceMonitor hosting interface. Una vez que esta interfaz se obtiene correctamente, se habilita ARM.Once this interface is successfully obtained, ARM is enabled.

  • El código administrado puede habilitar ARM estableciendo la propiedad estática AppDomain.MonitoringIsEnabled (Shared en Visual Basic) en true.Managed code can enable ARM by setting the static (Shared in Visual Basic) AppDomain.MonitoringIsEnabled property to true. En cuanto se establece la propiedad, se habilita ARM.As soon as the property is set, ARM is enabled.

  • Puede habilitar ARM después del inicio escuchando los eventos ETW.You can enable ARM after startup by listening to ETW events. ARM se habilita y comienza a generar eventos para todos los dominios de aplicación cuando se habilita el proveedor público Microsoft-Windows-DotNETRuntime mediante el uso de la palabra clave AppDomainResourceManagementKeyword.ARM is enabled and begins raising events for all application domains when you enable the public provider Microsoft-Windows-DotNETRuntime by using the AppDomainResourceManagementKeyword keyword. Para correlacionar datos con dominios de aplicación y subprocesos, debe habilitar también el proveedor Microsoft-Windows-DotNETRuntimeRundown con la palabra clave ThreadingKeyword.To correlate data with application domains and threads, you must also enable the Microsoft-Windows-DotNETRuntimeRundown provider with the ThreadingKeyword keyword.

Uso de ARMUsing ARM

ARM proporciona el tiempo de procesador total que un dominio de aplicación usa y tres tipos de información sobre el uso de memoria.ARM provides the total processor time that is used by an application domain and three kinds of information about memory use.

  • Total de tiempo de procesador para un dominio de aplicación, en segundos: esto se calcula con la suma de los tiempos de los subprocesos notificados por el sistema operativo en todos los subprocesos que dedicaron tiempo a ejecutarse en el dominio de aplicación durante su vigencia.Total processor time for an application domain, in seconds: This is calculated by adding up the thread times reported by the operating system for all threads that spent time executing in the application domain during its lifetime. Los subprocesos bloqueados o inactivos no usan tiempo de procesador.Blocked or sleeping threads do not use processor time. Cuando un subproceso llama a código nativo, el tiempo que el subproceso emplea en el código nativo se incluye en el recuento del dominio de aplicación donde se realizó la llamada.When a thread calls into native code, the time that the thread spends in native code is included in the count for the application domain where the call was made.

  • Asignaciones administradas totales realizadas por un dominio de aplicación durante su vigencia, en bytes: el total de asignaciones no siempre refleja la memoria que usa un dominio de aplicación, porque los objetos asignados pueden ser de corta duración.Total managed allocations made by an application domain during its lifetime, in bytes: Total allocations do not always reflect memory use by an application domain, because the allocated objects might be short-lived. Sin embargo, si una aplicación asigna y libera grandes cantidades de objetos, el costo de las asignaciones podría ser significativo.However, if an application allocates and frees huge numbers of objects, the cost of the allocations could be significant.

  • Memoria administrada, en bytes, a la que hace referencia un dominio de aplicación y que ha sobrevivido a la colección con bloqueo completo más reciente: este número es preciso solo después de una colección con bloqueo completo.Managed memory, in bytes, that is referenced by an application domain and that survived the most recent full, blocking collection: This number is accurate only after a full, blocking collection. (Esto difiere de las colecciones simultáneas, que se producen en segundo plano y no bloquean la aplicación). Por ejemplo, la sobrecarga del método GC.Collect() genera una colección con bloqueo completo.(This is in contrast to concurrent collections, which occur in the background and do not block the application.) For example, the GC.Collect() method overload causes a full, blocking collection.

  • Total de memoria administrada, en bytes, a la que hace referencia el proceso cuya duración va más allá de la colección con bloqueo completo más reciente: la memoria de duración superior para los dominios de aplicación individuales se puede comparar con este número.Total managed memory, in bytes, that is referenced by the process and that survived the most recent full, blocking collection: The survived memory for individual application domains can be compared to this number.

Determinación de la ocurrencia de una colección con bloqueo completoDetermining When a Full, Blocking Collection Occurs

Para determinar cuándo son precisos los recuentos de memoria de mayor duración, es necesario saber cuándo se produce una colección con bloqueo completo.To determine when counts of survived memory are accurate, you need to know when a full, blocking collection has just occurred. El método para hacer esto depende de la API que se utiliza para examinar las estadísticas de ARM.The method for doing this depends on the API you use to examine ARM statistics.

API administradaManaged API

Si usa las propiedades de la clase AppDomain, puede usar el método GC.RegisterForFullGCNotification para registrar la notificación de las colecciones completas.If you use the properties of the AppDomain class, you can use the GC.RegisterForFullGCNotification method to register for notification of full collections. El umbral utilizado no es importante, ya que se espera a la finalización de una colección y no al enfoque de una colección.The threshold you use is not important, because you are waiting for the completion of a collection rather than the approach of a collection. A continuación, puede llamar al método GC.WaitForFullGCComplete, que se bloquea hasta que finaliza una colección completa.You can then call the GC.WaitForFullGCComplete method, which blocks until a full collection has completed. Puede crear un subproceso que llame al método en un bucle y que realice cualquier análisis necesario de lo que el método devuelve.You can create a thread that calls the method in a loop and does any necessary analysis whenever the method returns.

Como alternativa, puede llamar al método GC.CollectionCount periódicamente para ver si ha aumentado el número de colecciones de generación 2.Alternatively, you can call the GC.CollectionCount method periodically to see if the count of generation 2 collections has increased. Dependiendo de la frecuencia de sondeo, esta técnica podría no proporcionar una indicación lo suficientemente precisa de la ocurrencia de una colección completa.Depending on the polling frequency, this technique might not provide as accurate an indication of the occurrence of a full collection.

API de hospedajeHosting API

Si utiliza la API de hospedaje no administrada, el host debe pasar al CLR una implementación de la interfaz IHostGCManager.If you use the unmanaged hosting API, your host must pass the CLR an implementation of the IHostGCManager interface. El CLR llama al método IHostGCManager::SuspensionEnding cuando reanuda la ejecución de los subprocesos suspendidos durante la ocurrencia de una colección.The CLR calls the IHostGCManager::SuspensionEnding method when it resumes execution of threads that have been suspended while a collection occurs. El CLR pasa la generación de la colección completada como un parámetro del método, por lo que el host puede determinar si la colección se completó de forma total o parcial.The CLR passes the generation of the completed collection as a parameter of the method, so the host can determine whether the collection was full or partial. La implementación del método IHostGCManager::SuspensionEnding puede consultar la memoria de duración superior, a fin de garantizar la recuperación de los recuentos en cuando se actualizan.Your implementation of the IHostGCManager::SuspensionEnding method can query for survived memory, to ensure that the counts are retrieved as soon as they are updated.

Vea tambiénSee also