Отслеживание ресурсов домена приложенияApplication Domain Resource Monitoring

Функция наблюдения за ресурсами доменов приложений (ARM) позволяет узлам отслеживать загрузку ЦП и использование памяти доменом приложения.Application domain resource monitoring (ARM) enables hosts to monitor CPU and memory usage by application domain. Это полезно для некоторых узлов, таких как ASP.NET, которые используют несколько доменов приложений в длительных процессах.This is useful for hosts such as ASP.NET that use many application domains in a long-running process. Узел может выгрузить домен приложения, если его работа понижает производительность процесса в целом. Но для нужно определить проблемное приложение.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 предоставляет сведения, которые помогут решить эту задачу.ARM provides information that can be used to assist in making such decisions.

Например, на сервере ASP.NET службы размещения может выполняться несколько приложений.For example, a hosting service might have many applications running on an ASP.NET server. Если одно из приложений процесса потребляет слишком много памяти или процессорного времени, служба размещения с помощью ARM может определить проблемный домен приложения.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 достаточно нетребовательна к ресурсам, что позволяет применять ее в работающих приложениях.ARM is sufficiently lightweight to use in live applications. Нужную информацию можно получить с помощью трассировки событий для Windows (ETW), а также управляемых или собственных интерфейсов API.You can access the information by using event tracing for Windows (ETW) or directly through managed or native APIs.

Включение наблюдения за ресурсамиEnabling Resource Monitoring

ARM можно включить четырьмя способами: в файле конфигурации при запуске общеязыковой среды выполнения (CLR), через неуправляемый интерфейс API размещения, в управляемом коде или ожидая передачи событий трассировки событий Windows 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.

Сразу после включения ARM начинает сбор данных всех доменов приложений в процессе. Если домен приложения создан до включения ARM, данные накапливаются лишь с момента включения ARM, но не с момента создания домена приложения. После включения ARM отключить нельзя.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.

  • Вы можете включить ARM при запуске среды CLR. Для этого добавьте элемент <appDomainResourceMonitoring> в файл конфигурации и присвойте атрибуту enabled значение true.You can enable ARM at CLR startup by adding the <appDomainResourceMonitoring> element to the configuration file, and setting the enabled attribute to true. Значение false (по умолчанию) просто означает, что ARM не включается автоматически при запуске. ARM можно включить позже с помощью любого другого механизма активации.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.

  • Узел может включить ARM, подав запрос на интерфейс размещения ICLRAppDomainResourceMonitor.The host can enable ARM by requesting the ICLRAppDomainResourceMonitor hosting interface. ARM включается после успешного получения этого интерфейса.Once this interface is successfully obtained, ARM is enabled.

  • Чтобы включить ARM из управляемого кода, задайте для статического свойства AppDomain.MonitoringIsEnabled (Shared в Visual Basic) значение true.Managed code can enable ARM by setting the static (Shared in Visual Basic) AppDomain.MonitoringIsEnabled property to true. ARM включается сразу после изменения этого свойства.As soon as the property is set, ARM is enabled.

  • Чтобы включить ARM после запуска, используйте ожидание передачи данных от функции трассировки событий Windows.You can enable ARM after startup by listening to ETW events. ARM включается и начинает создавать события для всех доменов приложений при активации общего поставщика Microsoft-Windows-DotNETRuntime с помощью ключевого слова 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. Чтобы связать данные с потоками и доменами приложений, также нужно включить поставщик Microsoft-Windows-DotNETRuntimeRundown с помощью ключевого слова ThreadingKeyword.To correlate data with application domains and threads, you must also enable the Microsoft-Windows-DotNETRuntimeRundown provider with the ThreadingKeyword keyword.

Использование ARMUsing ARM

ARM передает данные общего процессорного времени, используемого доменом приложения, а также три параметра использования памяти.ARM provides the total processor time that is used by an application domain and three kinds of information about memory use.

  • Общее процессорное время для домена приложения, в секундах. Результат вычисляется путем сложения значений времени для всех потоков операционной системы, выполнявшихся в домене приложения за весь период его существования.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. Заблокированные потоки и потоки в спящем режиме не используют процессорное время.Blocked or sleeping threads do not use processor time. Если поток вызывает машинный код, время нового потока в машинном коде включается в статистику по домену приложения, из которого он был вызван.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.

  • Общий объем выделенной управляемой памяти для домена приложения за все время его существования (в байтах) . Общий объем выделенной памяти не всегда правильно отражает использование памяти доменом приложения, так как объекты могут выделяться на короткий промежуток времени.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. Но накладные расходы могут оказаться существенными, если приложение часто выделяет и освобождает большое количество объектов.However, if an application allocates and frees huge numbers of objects, the cost of the allocations could be significant.

  • Управляемая память (в байтах), которая используется доменом приложения и осталась выделенной после последней полной блокирующей сборки мусора. Этот параметр имеет смысл, только если выполнялась полная блокирующая сборка.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. (в отличие от параллельных операций сборки, которые выполняются в фоновом режиме и не блокируют работу приложения). Например, перегрузка метода GC.Collect() вызывает полную блокирующую сборку мусора.(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 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.

Как определить время полной блокирующей сборки мусораDetermining When a Full, Blocking Collection Occurs

Чтобы определить точность сведений об оставшемся объеме памяти, нужно узнать время последней полной блокирующей сборки.To determine when counts of survived memory are accurate, you need to know when a full, blocking collection has just occurred. Метод определения времени зависит от того, какой API-интерфейс вы используете для изучения статистики ARM.The method for doing this depends on the API you use to examine ARM statistics.

Управляемый APIManaged API

Если вы используете свойства класса AppDomain, метод GC.RegisterForFullGCNotification позволяет зарегистрироваться для получения уведомлений о полных сборках.If you use the properties of the AppDomain class, you can use the GC.RegisterForFullGCNotification method to register for notification of full collections. Указываемое здесь пороговое значение не играет роли, так как вас интересует только завершение сборки, а не ее приближение.The threshold you use is not important, because you are waiting for the completion of a collection rather than the approach of a collection. После этого вызовите метод GC.WaitForFullGCComplete, который блокируется до завершения полной сборки.You can then call the GC.WaitForFullGCComplete method, which blocks until a full collection has completed. Вы можете создать отдельный поток, который вызывает этот метод в цикле и проводит анализ данных при каждом завершении метода.You can create a thread that calls the method in a loop and does any necessary analysis whenever the method returns.

Кроме того, вы можете периодически вызвать метод GC.CollectionCount, чтобы отслеживать увеличение количества сборок для поколения 2.Alternatively, you can call the GC.CollectionCount method periodically to see if the count of generation 2 collections has increased. В зависимости от частоты опроса такой подход не всегда будет давать точные сведения о времени выполнения полной сборки мусора.Depending on the polling frequency, this technique might not provide as accurate an indication of the occurrence of a full collection.

Интерфейс API размещенияHosting API

Если вы используете API размещения, а не управляемый API, узел должен передать в среду CLR реализацию интерфейса IHostGCManager.If you use the unmanaged hosting API, your host must pass the CLR an implementation of the IHostGCManager interface. Среда CLR вызывает метод IHostGCManager::SuspensionEnding из этого интерфейса, когда возобновляет выполнение потоков, приостановленных на время сбора мусора.The CLR calls the IHostGCManager::SuspensionEnding method when it resumes execution of threads that have been suspended while a collection occurs. Среда CLR передает в параметре этого метода номер поколения выполненной сборки. Это позволяет узлу определить тип сборки (полная или частичная).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. Вы можете поместить запросы данных оставшейся памяти в реализацию метода IHostGCManager::SuspensionEnding, чтобы получать их сразу же по мере обновления.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.

См. такжеSee also