Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Мониторинг ресурсов домена приложения (ARM) позволяет узлам отслеживать использование ЦП и памяти по домену приложения. Это полезно для хостов, таких как ASP.NET, которые используют множество доменов приложений в длительном процессе. Хост может выгружать домен приложения, который негативно влияет на производительность всего процесса выполнения, но только если он может определить проблемное приложение. ARM предоставляет сведения, которые можно использовать для принятия таких решений.
Например, служба размещения может иметь множество приложений, работающих на сервере ASP.NET. Если одно приложение в процессе начинает потреблять слишком много памяти или слишком много времени процессора, служба размещения может использовать ARM для идентификации домена приложения, вызывающего проблему.
ARM достаточно легкий для использования в живых приложениях. Доступ к данным можно получить с помощью трассировки событий для Windows (ETW) или непосредственно с помощью управляемых или собственных API.
Включение мониторинга ресурсов
ARM можно включить четырьмя способами: предоставляя файл конфигурации при запуске среды CLR, используя неуправляемый API размещения, используя управляемый код или прослушивая события ARM ETW.
Как только ARM включен, он начинает собирать данные обо всех доменах приложений в процессе. Если домен приложения был создан до включения ARM, накопительные данные запускаются при включении ARM, а не при создании домена приложения. После включения arm нельзя отключить.
Вы можете включить ARM при запуске CLR, добавив элемент <appDomainResourceMonitoring> в файл конфигурации и задав атрибут
enabled
наtrue
. Значениеfalse
(по умолчанию) означает только то, что ARM не включен при запуске; его можно активировать позже с помощью одного из других механизмов активации.Узел может включить ARM, запросив хостинг-интерфейс ICLRAppDomainResourceMonitor. После успешного получения этого интерфейса ARM будет включен.
Управляемый код может включить ARM, задав для свойства static (
Shared
в Visual Basic) AppDomain.MonitoringIsEnabled значениеtrue
. Как только свойство задано, ARM включен.Вы можете включить ARM после запуска, прослушивая события ETW. ARM активируется и начинает генерировать события для всех доменов приложений, когда вы включаете общедоступного поставщика
Microsoft-Windows-DotNETRuntime
, используя ключевое словоAppDomainResourceManagementKeyword
. Чтобы сопоставить данные с доменами приложений и потоками, необходимо также включитьMicrosoft-Windows-DotNETRuntimeRundown
поставщика с ключевым словомThreadingKeyword
.
Использование ARM
ARM предоставляет общее время процессора, используемое доменом приложения и тремя типами сведений об использовании памяти.
Общее время процессора для домена приложения в секундах: это вычисляется путем добавления времени потока, сообщаемого операционной системой для всех потоков, затрачиваемых на выполнение в домене приложения во время его существования. Заблокированные или спящие потоки не используют время процессора. При вызове потока в нативный код время, которое поток тратит в нативном коде, включается в учёт времени для домена приложения, где был сделан вызов.
Управляемое свойство API: AppDomain.MonitoringTotalProcessorTime.
API размещения: метод ICLRAppDomainResourceMonitor::GetCurrentCpuTime .
События ETW:
ThreadCreated
,ThreadAppDomainEnter
иThreadTerminated
события. Сведения о поставщиках и ключевых словах см. в разделе "События мониторинга ресурсов AppDomain" в событиях трассировки СРЕДЫ CLR (ETW).
Общее количество управляемых выделений, сделанных доменом приложения во время его существования, в байтах: общее выделение не всегда отражает использование памяти доменом приложения, так как выделенные объекты могут быть кратковременными. Однако если приложение выделяет и освобождает огромное количество объектов, стоимость выделения может оказаться значительной.
Управляемое свойство API: AppDomain.MonitoringTotalAllocatedMemorySize.
API размещения: метод ICLRAppDomainResourceMonitor::GetCurrentAllocated.
События ETW:
AppDomainMemAllocated
событие,Allocated
поле.
Управляемая память в байтах, на которую ссылается домен приложения и которая пережила последнюю полную блокирующую сборку: это число является точным только после полной блокирующей сборки. (Это отличается от параллельных коллекций, которые происходят в фоновом режиме и не блокируют приложение.) Например, перегрузка GC.Collect() метода вызывает полную блокировку коллекции.
Управляемое свойство API: AppDomain.MonitoringSurvivedMemorySize.
API размещения: метод ICLRAppDomainResourceMonitor::GetCurrentSurvived ,
pAppDomainBytesSurvived
параметр.События ETW:
AppDomainMemSurvived
событие,Survived
поле.
Общая управляемая память в байтах, на которую ссылается процесс и которая пережила последний полный блокирующий сбор: выжившую память для отдельных доменов приложений можно сравнить с этим числом.
Управляемое свойство API: AppDomain.MonitoringSurvivedProcessMemorySize.
API размещения: метод ICLRAppDomainResourceMonitor::GetCurrentSurvived ,
pTotalBytesSurvived
параметр.События ETW:
AppDomainMemSurvived
событие,ProcessSurvived
поле.
Определение того, когда происходит полная блокировка коллекции
Чтобы определить, когда количество выживших памяти точно, необходимо знать, когда полная блокировка коллекции только что произошла. Этот метод зависит от API, используемого для изучения статистики ARM.
Управляемый API
Если вы используете свойства AppDomain класса, можно использовать GC.RegisterForFullGCNotification метод для регистрации для уведомления о полных коллекциях. Используемое пороговое значение действительно не важно, потому что вы ожидаете завершения коллекции, а не её приближения. Затем можно вызвать метод GC.WaitForFullGCComplete, который блокируется до завершения полного сбора. Вы можете создать поток, который вызывает метод в цикле и выполнять любой необходимый анализ всякий раз, когда метод возвращается.
Кроме того, можно периодически вызывать GC.CollectionCount метод, чтобы узнать, увеличилось ли количество коллекций поколения 2. В зависимости от частоты опроса этот метод может не обеспечить точное указание на наличие полной коллекции.
API хостинга
Если вы используете неуправляемый API размещения, ваш хост должен передать сюда реализацию интерфейса IHostGCManager для CLR. СРЕДА CLR вызывает метод IHostGCManager::SuspendEnding при возобновлении выполнения потоков, приостановленных во время сбора. Среда CLR передает поколение завершенной сборки в качестве параметра метода, чтобы хост мог определить, была ли сборка полной или частичной. Реализация метода IHostGCManager::SuspensionEnding может запрашивать сохраняемую память, чтобы убедиться, что счетчики извлекаются сразу после обновления.