Поделиться через


Мониторинг ресурсов домена приложения

Мониторинг ресурсов домена приложения (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 предоставляет общее время процессора, используемое доменом приложения и тремя типами сведений об использовании памяти.

  • Общее время процессора для домена приложения в секундах: это вычисляется путем добавления времени потока, сообщаемого операционной системой для всех потоков, затрачиваемых на выполнение в домене приложения во время его существования. Заблокированные или спящие потоки не используют время процессора. При вызове потока в нативный код время, которое поток тратит в нативном коде, включается в учёт времени для домена приложения, где был сделан вызов.

  • Общее количество управляемых выделений, сделанных доменом приложения во время его существования, в байтах: общее выделение не всегда отражает использование памяти доменом приложения, так как выделенные объекты могут быть кратковременными. Однако если приложение выделяет и освобождает огромное количество объектов, стоимость выделения может оказаться значительной.

  • Управляемая память в байтах, на которую ссылается домен приложения и которая пережила последнюю полную блокирующую сборку: это число является точным только после полной блокирующей сборки. (Это отличается от параллельных коллекций, которые происходят в фоновом режиме и не блокируют приложение.) Например, перегрузка GC.Collect() метода вызывает полную блокировку коллекции.

  • Общая управляемая память в байтах, на которую ссылается процесс и которая пережила последний полный блокирующий сбор: выжившую память для отдельных доменов приложений можно сравнить с этим числом.

Определение того, когда происходит полная блокировка коллекции

Чтобы определить, когда количество выживших памяти точно, необходимо знать, когда полная блокировка коллекции только что произошла. Этот метод зависит от API, используемого для изучения статистики ARM.

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

Если вы используете свойства AppDomain класса, можно использовать GC.RegisterForFullGCNotification метод для регистрации для уведомления о полных коллекциях. Используемое пороговое значение действительно не важно, потому что вы ожидаете завершения коллекции, а не её приближения. Затем можно вызвать метод GC.WaitForFullGCComplete, который блокируется до завершения полного сбора. Вы можете создать поток, который вызывает метод в цикле и выполнять любой необходимый анализ всякий раз, когда метод возвращается.

Кроме того, можно периодически вызывать GC.CollectionCount метод, чтобы узнать, увеличилось ли количество коллекций поколения 2. В зависимости от частоты опроса этот метод может не обеспечить точное указание на наличие полной коллекции.

API хостинга

Если вы используете неуправляемый API размещения, ваш хост должен передать сюда реализацию интерфейса IHostGCManager для CLR. СРЕДА CLR вызывает метод IHostGCManager::SuspendEnding при возобновлении выполнения потоков, приостановленных во время сбора. Среда CLR передает поколение завершенной сборки в качестве параметра метода, чтобы хост мог определить, была ли сборка полной или частичной. Реализация метода IHostGCManager::SuspensionEnding может запрашивать сохраняемую память, чтобы убедиться, что счетчики извлекаются сразу после обновления.

См. также