Мы продолжаем нашу серию заметок о мониторинге. В этой заметке команда разработчиков ALG даст рекомендации по мониторингу платформы .NET.
Введение
Большинство приложений, разработанных по технологии Microsoft, используют фреймворк .NET. Этот фреймворк предоставляет хорошую платформу как для разработки, так и для запуска приложений. И он тоже имеет счётчики для измерения и мониторинга производительности приложений.
Фреймворк .NET состоит из двух основных компонентов:
- общеязыковая исполняющая среда Common Language Runtime (CLR);
- библиотека классов.
CLR является основой фреймворка .NET. Можно сказать, что исполняющая среда – это некий агент, который управляет кодом во время выполнения, предоставляя основные сервисы, такие как управление памятью, потоками и удаленное взаимодействие, а также обеспечивая строгую безопасность типов и другие формы «правильности» кода, которые способствуют безопасности и надежности. Фактически, концепция управления кодом является фундаментальным принципом исполняющей среды. Код, который обращается к исполняющей среде, известен как управляемый код, в то время как код, который к ней не обращается, называется неуправляемым. Библиотека классов, второй основной компонент .NET, является всеобъемлющим, объектно-ориентированным набором типов, пригодных для многократного использования.
Исполняющая среда предназначена для повышения производительности. Хотя CLR предоставляет множество разных стандартных сервисов исполняющей среды, управляемый код никогда не интерпретируется. Это происходит благодаря технологии компиляции “на лету» (just-in-time [JIT]), которая позволяет выполнять весь управляемый код на исходном машинном языке системы, в которой происходит выполнение. Тем временем, менеджер памяти устраняет возможность фрагментации памяти и повышает локализацию ссылок памяти, для дальнейшего повышения производительности.
Счётчики производительности организованы и сгруппированы по категориям счётчиков. В целом, так же, как операционная система Windows обладает множеством счётчиков производительности, которые можно вызвать программным путём или используя Performance Monitor, CLR представляет свой собственный набор таких счётчиков в .NET. Они разбиты на 9 важных категорий, чтобы помочь тестеру мониторить и настраивать производительность приложения. Эти категории:
- Исключения. Предоставляет информацию об исключениях, возникающих в приложении.
- Память. Предоставляет информацию о сборщике мусора.
- Блокировки и потоки. Предоставляет информацию об управляемых блокировках и потоках, используемых приложением.
- Взаимодействие (Interop). Предоставляет информацию о взаимодействии приложения с компонентами COM, сервисами COM+ и библиотеками типов.
- JIT. Предоставляет информацию о коде, скомпилированном JIT компилятором.
- Загрузки. Предоставляет информацию о загруженных сборках, классах и AppDomain-ах.
- Сеть. Предоставляет информацию о данных, отправленных и полученных приложением по сети.
- Удалённый доступ. Предоставляет информацию об объектах, удаленно используемых приложением.
- Безопасность. Даёт описание проверок безопасности, производимых CLR по приложению.
Наиболее важные счётчики .NET
Приступая к мониторингу приложений .NET, рекомендуем начинать с мониторинга счётчиков операционной системы, которые измеряют утилизацию процессоров, памяти, сети, устройств ввода/вывода (подробно мы рассказывали в заметке о мониторинге Windows). Затем счётчики производительности .NET, включающую в себя все аспекты операций CLR, начиная с обработки исключений и заканчивая проверкой безопасности.
- Счетчики Исключения: # of Excep Thrown/sec (количество исключений за секунду) – Отражает количество исключений, вызванных управляемым кодом, за секунду.
Throw to Catch Depth/Sec (глубина от выдачи до захвата за секунду) – Показывает количество кадров стека. - Памяти: Large Object Heap Size (размер кучи больших объектов) – Отображает текущий размер кучи больших объектов в байтах.
# Bytes in all Heaps (количество байт во всех кучах) – Показывает текущий объём памяти, выделенной в кучах сборщика мусора, в байтах.
# of Pinned Objects (количество закреплённых объектов) – Отражает количество закреплённых объектов, встречающихся в последней сборке мусора.
% Time in GC (процент времени на сборку мусора) – Показывает процент времени, затраченного на выполнение сборки мусора, с момента проведения последнего цикла сборки. - Потоков: # of Current Logical Threads (текущее количество логических потоков) – Отображает текущее количество потоковых объектов .NET в приложении.
# of Current Physical Threads (текущее количество физических потоков) – Показывает количество потоков операционной системы, созданных CLR и принадлежащих этой среде.
# of Current Recognized Threads (текущее количество распознанных потоков) – Отражает текущее количество уникальных потоков, которые видит CLR.
# of Total Recognized Threads (общее количество распознанных потоков) – Отображает суммарное количество уникальных потоков, распознанных CLR с момента запуска приложения.
Contention Rate/Sec (количество конфликтов за секунду) – Отображение скорости, с которой потоки в исполняющей среде делают безуспешные попытки получения управляемой блокировки. - Загрузки: Current Assemblies (текущее количество сборок) – Содержит информацию о количестве сборок, загруженных в процесс.
Rate of Assemblies (скорость загрузки сборок) – Отражает количество сборок, загружаемых в память за секунду.
Bytes in Loader Heap (размер кучи загрузчика, байт) – Отображает количество байт, выделенных под загрузку классов. - Безопасности: Total Runtime Checks (общее количество проверок исполняющей среды) – Показывает процент времени, затраченный на проверки безопасности доступа для кода в исполняющей среде.
Stack Walk Depth (глубина стека) – Отображает глубину стека во время последней проверки безопасности доступа кода.