Monitoraggio delle risorse del dominio applicazioneApplication Domain Resource Monitoring

Il monitoraggio delle risorse del dominio applicazione permette agli host di monitorare l'utilizzo di CPU e memoria da parte del dominio applicazione.Application domain resource monitoring (ARM) enables hosts to monitor CPU and memory usage by application domain. Ciò risulta utile per gli host, come ASP.NET, che usano molti domini applicazione in un processo a esecuzione prolungata.This is useful for hosts such as ASP.NET that use many application domains in a long-running process. L'host può scaricare il dominio applicazione di un'applicazione che influisce negativamente sulle prestazioni dell'intero processo, ma solo se è in grado di identificare l'applicazione problematica.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. Il monitoraggio delle risorse del dominio applicazione fornisce informazioni che possono essere usate per prendere questo tipo di decisioni.ARM provides information that can be used to assist in making such decisions.

Ad esempio, un servizio di hosting potrebbe avere molte applicazioni in esecuzione in un server ASP.NET.For example, a hosting service might have many applications running on an ASP.NET server. Se un'applicazione nel processo inizia a utilizzare troppa memoria o troppo tempo del processore, il servizio di hosting può usare il monitoraggio delle risorse del dominio applicazione per identificare il dominio applicazione che causa il 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.

Il monitoraggio delle risorse del dominio applicazione è sufficientemente leggero da essere usato nelle applicazioni attive.ARM is sufficiently lightweight to use in live applications. Le informazioni sono accessibili tramite Event Tracing for Windows (ETW) o direttamente tramite le API gestite o native.You can access the information by using event tracing for Windows (ETW) or directly through managed or native APIs.

Abilitazione del monitoraggio delle risorseEnabling Resource Monitoring

Il monitoraggio delle risorse del dominio applicazione può essere abilitato in quattro modi: fornendo un file di configurazione all'avvio di Common Language Runtime (CLR), usando un'API di hosting non gestita, tramite codice gestito o attivando l'ascolto di eventi ETW di monitoraggio delle risorse del dominio applicazione.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.

Non appena il monitoraggio viene abilitato, inizia a raccogliere dati su tutti i domini applicazione nel processo. Se un dominio applicazione è stato creato prima dell'abilitazione del monitoraggio, l'accumulo dei dati inizia quando viene abilitato il monitoraggio e non quando è stato creato il dominio dell'applicazione. Una volta attivato, il monitoraggio delle risorse del dominio applicazione non può essere disabilitato.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.

  • È possibile abilitare il monitoraggio all'avvio di CLR aggiungendo l'elemento <appDomainResourceMonitoring > nel file di configurazione e impostando l'attributo enabled su true.You can enable ARM at CLR startup by adding the <appDomainResourceMonitoring> element to the configuration file, and setting the enabled attribute to true. Il valore false (predefinito) indica solo che il monitoraggio non viene abilitato all'avvio. È possibile attivarlo in un secondo momento usando uno degli altri meccanismi di attivazione.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.

  • L'host può abilitare il monitoraggio richiedendo l'interfaccia di hosting ICLRAppDomainResourceMonitor.The host can enable ARM by requesting the ICLRAppDomainResourceMonitor hosting interface. Dopo aver ottenuto correttamente questa interfaccia, il monitoraggio viene abilitato.Once this interface is successfully obtained, ARM is enabled.

  • È possibile abilitare il monitoraggio delle risorse del dominio applicazione da codice gestito impostando la proprietà statica (Shared in Visual Basic) AppDomain.MonitoringIsEnabled su true.Managed code can enable ARM by setting the static (Shared in Visual Basic) AppDomain.MonitoringIsEnabled property to true. Il monitoraggio viene abilitato subito dopo aver impostato la proprietà.As soon as the property is set, ARM is enabled.

  • È possibile abilitare il monitoraggio all'avvio, attivando l'ascolto di eventi ETW.You can enable ARM after startup by listening to ETW events. Il monitoraggio viene abilitato e inizia a generare eventi per tutti i domini applicazione, quando si abilita il provider pubblico Microsoft-Windows-DotNETRuntime tramite la parola chiave 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. Per correlare i dati con domini applicazione e thread, è necessario abilitare anche il provider Microsoft-Windows-DotNETRuntimeRundown con la parola chiave ThreadingKeyword.To correlate data with application domains and threads, you must also enable the Microsoft-Windows-DotNETRuntimeRundown provider with the ThreadingKeyword keyword.

Uso del monitoraggio delle risorse del dominio applicazioneUsing ARM

Il monitoraggio delle risorse del dominio applicazione fornisce il tempo totale del processore usato da un dominio applicazione e tre tipi di informazioni sull'uso della memoria.ARM provides the total processor time that is used by an application domain and three kinds of information about memory use.

  • Tempo totale del processore per un dominio applicazione, in secondi: viene calcolato sommando la durata dei thread segnalata dal sistema operativo per tutti i thread che hanno dedicato tempo all'esecuzione nel dominio applicazione durante la relativa durata.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. I thread bloccati o sospeso non usano tempo del processore.Blocked or sleeping threads do not use processor time. Quando un thread esegue chiamate nel codice nativo, il tempo trascorso dal thread nel codice nativo viene incluso nel conteggio per il dominio applicazione in cui è stata effettuata la chiamata.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.

  • Totale delle allocazioni gestite effettuate da un dominio applicazione durante la sua durata, in byte: le allocazioni totali non riflettono sempre l'uso della memoria da parte di un dominio applicazione, perché gli oggetti allocati potrebbero avere breve durata.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. Tuttavia, se un'applicazione alloca e libera grandi quantità di oggetti, il costo delle allocazioni potrebbe essere significativo.However, if an application allocates and frees huge numbers of objects, the cost of the allocations could be significant.

  • Memoria gestita, in byte, a cui fa riferimento un dominio applicazione ed esclusa dalla Garbage Collection di blocco completa più recente: questo numero è preciso solo dopo una Garbage Collection di blocco completa.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. Questo si differenzia dalle raccolte simultanee, che si verificano in background e non bloccano l'applicazione. Ad esempio, l'overload del metodo GC.Collect() causa una raccolta di blocco completa.(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.

  • Totale di memoria gestita, in byte, a cui fa riferimento il processo ed esclusa dalla Garbage Collection di blocco completa più recente: la memoria esclusa per i singoli domini applicazione può essere confrontata con questo numero.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.

Determinare quando viene eseguita una Garbage Collection di blocco completaDetermining When a Full, Blocking Collection Occurs

Per determinare se i conteggi della memoria esclusa sono accurati, è necessario sapere quando è stata eseguita una Garbage Collection di blocco completa.To determine when counts of survived memory are accurate, you need to know when a full, blocking collection has just occurred. Il metodo per eseguire questa operazione dipende dall'API usata per esaminare le statistiche di monitoraggio delle risorse del dominio applicazione.The method for doing this depends on the API you use to examine ARM statistics.

API gestitaManaged API

Se si usano le proprietà della classe AppDomain, è possibile usare il metodo GC.RegisterForFullGCNotification per registrarsi per ricevere notifica dell'esecuzione di raccolte complete.If you use the properties of the AppDomain class, you can use the GC.RegisterForFullGCNotification method to register for notification of full collections. La soglia usata non è importante, perché si attende il completamento di un'operazione di Garbage Collection, anziché l'avvicinarsi di questa operazione.The threshold you use is not important, because you are waiting for the completion of a collection rather than the approach of a collection. È quindi possibile chiamare il metodo GC.WaitForFullGCComplete che attiva il blocco fino al completamento di una Garbage Collection completa.You can then call the GC.WaitForFullGCComplete method, which blocks until a full collection has completed. È possibile creare un thread che chiama il metodo in un ciclo ed esegue eventuali analisi necessarie ogni volta che il metodo restituisce il controllo.You can create a thread that calls the method in a loop and does any necessary analysis whenever the method returns.

In alternativa, è possibile chiamare il metodo GC.CollectionCount periodicamente per verificare se il conteggio delle raccolte di generazione 2 è aumentato.Alternatively, you can call the GC.CollectionCount method periodically to see if the count of generation 2 collections has increased. A seconda della frequenza di polling, questa tecnica potrebbe non fornire un'indicazione accurata dell'esecuzione di una Garbage Collection completa.Depending on the polling frequency, this technique might not provide as accurate an indication of the occurrence of a full collection.

API di hostingHosting API

Se si usa l'API di hosting non gestita, l'host deve passare a CLR un'implementazione dell'interfaccia IHostGCManager.If you use the unmanaged hosting API, your host must pass the CLR an implementation of the IHostGCManager interface. CLR chiama il metodo IHostGCManager::SuspensionEnding quando riprende l'esecuzione di thread sospesi durante l'esecuzione di una Garbage Collection.The CLR calls the IHostGCManager::SuspensionEnding method when it resumes execution of threads that have been suspended while a collection occurs. CLR passa la generazione della raccolta completata come parametro del metodo, in modo che l'host possa determinare se la raccolta è stata completa o parziale.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. L'implementazione personalizzata del metodo IHostGCManager::SuspensionEnding può eseguire una query per ottenere la memoria esclusa, per assicurarsi che i conteggi vengono recuperati non appena vengono aggiornati.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.

Vedere ancheSee also