Бөлісу құралы:


Просмотр профилировщика Application Insights для данных .NET

Предположим, вы выполняете веб-тест производительности. Чтобы понять, как работает веб-приложение под нагрузкой, вам потребуются трассировки для отслеживания. Работая с этой статьей, вы узнаете о следующем.

  • Создание трафика для веб-приложения путем запуска веб-теста производительности или сеанса Профилировщика по запросу.
  • Просмотр трассировок Профилировщика после нагрузочного теста или сеанса Профилировщика.
  • Чтение данных производительности Профилировщика и стека вызовов.

Создание трафика для службы Azure

Для отправки трассировок профилировщика .NET служба должна активно обрабатывать запросы.

Если вы недавно включили Профилировщик для .NET, выполните короткий нагрузочный тест с помощью Azure Load Testing.

Если служба Azure уже имеет входящий трафик или если вы хотите создать трафик вручную, пропустите нагрузочный тест и запустите сеанс Профилировщика по запросу.

  1. На странице обзора Application Insights для службы Azure выберите Производительность в меню слева.

  2. На панели Производительность выберите Профилировщик в верхнем меню для доступа к параметрам профилировщика.

    Снимок экрана: кнопка Профилировщика на панели

  3. После загрузки страницы параметров Profiler выберите Профилирование сейчас.

    Снимок экрана: функции и параметры на странице профилировщика.

Просмотр трассировок

  1. После завершения сеансов Profiler вернитесь на панель производительности.

  2. В разделе Детализация... выберите Трассировки профилировщика, чтобы просмотреть трассировки.

    Снимок экрана: страница обозревателя трассировки.

Обозреватель трассировки отображает следующие сведения:

Фильтр Description
Дерево профиля версии Flame Graph Просмотрите трассировки в виде дерева или графа.
Критический путь Выберите, чтобы открыть самый большой листовой узел. В большинстве случаев этот узел находится рядом с узким местом производительности.
Зависимости платформы Выберите, чтобы просмотреть каждую из отслеживаемых зависимостей платформы, связанных с трассировками.
Скрыть события Введите строки, которые необходимо скрыть в представлении трассировки. Выберите Рекомендуемые события для просмотра предложений.
Мероприятие Имя события или функции. В дереве отображается сочетание кода и возникающих событий (например, события SQL и HTTP). Основное событие предоставляет общую длительность запроса.
Модуль Модуль, в котором произошла трассировка события или функция.
Время потока интервал времени между началом и завершением операции.
Временная шкала время запуска функции или события по отношению к другим функциям.

Чтение данных о производительности

Профилировщик .NET использует сочетание методов выборки и инструментирования для анализа производительности приложения. При выполнении подробной коллекции профилировщик .NET:

  • Каждую миллисекунду проводит выборку указателя инструкций для всех ЦП компьютера.
    • Каждый пример записывает полный стек вызовов потока, предоставляя подробные сведения о нем на высоком и низком уровне абстракции.
  • Собирает события для отслеживания корреляции действий и причинности, включая:
    • события переключения контекста,
    • события библиотеки параллельных задач (TPL),
    • события пула потоков.

Стек вызовов, отображаемый в представлении временной шкалы, является результатом выборки и инструментирования. Так как каждый пример записывает полный стек вызовов потока, он содержит код из Microsoft .NET Framework, а также из других указанных вами платформ.

Выделение объектов (clr!JIT_New or clr!JIT_Newarr1)

clr!JIT_New и clr!JIT_Newarr1 — это вспомогательные функции в .NET Framework, выделяющие память из управляемой кучи.

  • clr!JIT_New вызывается при выделении объекта.
  • clr!JIT_Newarr1 вызывается при выделении массива объектов.

Эти две функции обычно работают быстро. Если функции clr!JIT_New или clr!JIT_Newarr1 занимают довольно много времени во временной шкале, код, возможно, выделяет много объектов и потребляет значительный объем памяти.

Код загрузки (clr!ThePreStub)

Clr! ThePreStub — это вспомогательная функция в .NET Framework, подготавливающая код для начального выполнения, которое обычно включает JIT-компиляцию. Для каждого метода C# функция clr!ThePreStub должна вызываться только один раз в течение процесса.

Если выполнение clr!ThePreStub при запросе занимает много времени, значит этот запрос выплоняет метод первым. Для загрузки первого метода среде выполнения платформа .NET Framework требуется значительное время. Необходимо учесть следующие моменты.

  • Вы можете использовать процесс прогрева, который выполняет эту часть кода до предоставления к нему доступа пользователям.
  • Можно запустить генератор образов машинного кода (ngen.exe) в сборках.

Конфликт блокировки (clr!JITutil_MonContention или clr!JITutil_MonEnterWorker)

clr!JITutil_MonContention или clr!JITutil_MonEnterWorker указывает, что текущий поток ожидает снятия блокировки. Этот текст часто отображается при:

  • выполнении инструкции C# LOCK,
  • вызове метода Monitor.Enter или
  • вызове метода с атрибутом MethodImplOptions.Synchronized.

Конфликт блокировки обычно происходит при получении блокировки потоком A, а также при попытке получить ту же блокировку потоком Б до ее снятия потоком A.

Код загрузки ([COLD])

Если среда выполнения .NET Framework выполняет неоптимизированный код в первый раз, имя метода будет содержать [COLD]:

mscorlib.ni![COLD]System.Reflection.CustomAttribute.IsDefined

Для каждого метода он должен отображаться только один раз в течение процесса.

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

Отправка HTTP-запроса

Методы, такие как HttpClient.Send, указывают на то, что код ожидает завершения HTTP-запроса.

Операция с базой данных

Методы, такие как SqlCommand.Execute, указывают на то, что код ожидает завершения операции с базой данных.

Ожидание (AWAIT_TIME)

AWAIT_TIME указывает на то, что код ожидает завершения другой задачи. Задержка выполняется с помощью инструкции AWAIT языка C#. Когда код выполняет инструкцию C# AWAIT:

  • Поток распакуется и возвращает управление пулу потоков.
  • Нет заблокированного потока, ожидающего завершения выполнения инструкции AWAIT.

Однако если рассуждать логически, поток, который запустил инструкцию AWAIT "заблокирован" и ожидает завершения операции. Инструкция AWAIT_TIME указывает время блокировки в ожидании завершения задачи.

Если AWAIT_TIME, как представляется, в коде платформы вместо кода может отображаться профилировщик .NET:

  • Код платформы, используемый для выполнения AWAIT
  • Код, используемый для записи телеметрии о AWAIT

Флажок зависимостей Платформы можно снять в верхней части страницы , чтобы отобразить только код и упростить просмотр места возникновения AWAIT .

Время блокировки

BLOCKED_TIME указывает на то, что код ожидает, пока другой ресурс станет доступным. Например, он может ожидать:

  • объекта синхронизации;
  • доступности потока;
  • завершения выполнения запроса.

Неуправляемый асинхронный

Чтобы асинхронные вызовы можно было отслеживать в потоках, платформа .NET Framework выдает события ETW и передает идентификаторы действий между потоками. Так как неуправляемый (машинный) код и некоторые старые стили асинхронного кода не имеют этих событий и идентификаторов действий, профилировщик .NET не может отслеживать поток и функции, выполняемые в потоке. В стеке вызовов этот элемент помечается как Unmanaged Async (неуправляемый асинхронный). Скачайте файл трассировки ETW, чтобы использовать PerfView для получения дополнительных сведений.

Время ЦП

ЦП занят выполнением инструкций.

Время работы диска

Приложение выполняет операции с диском.

Сетевое время

Приложение выполняет сетевые операции.

Столбец "Время"

Столбец Время — это визуальное представление различных выборок INCLUSIVE, собранных для узла. Весь диапазон запроса делится на 32 временные группы, где накапливаются выборки INCLUSIVE узла. Каждый период представляется в виде полосы. Высота полосы обозначает масштабированное значение. Для следующих узлов панель представляет потребление одного из ресурсов в группе:

  • Узлы, помеченные CPU_TIME или BLOCKED_TIME.
  • Узлы, имеющие очевидную связь с использованием ресурса (например, ЦП, диска или потока).

Для этих метрик можно получить показатель больше 100 %, если используется несколько ресурсов. Например, если в среднем за определенный интервал времени используется два процессора, то это значенеи будет равно 200 %.

Следующие шаги

Знакомство с выполнением следующих задач: