Анализ использования ЦП без использования отладки в Профилировщике производительности (C#, Visual Basic, C++, F#)

Хороший способ начать исследование проблем производительности в приложении — определить загрузку ЦП. Средство оценки производительности Загрузка ЦП показывает время и процент ресурсов ЦП, затраченные на выполнение кода в приложениях C++ и C#/Visual Basic.

Средство Загрузки ЦП поможет вам:

  • Выполнять диагностику замедления или зависания процесса в базе кода вашей команды. Средство может помочь вам диагностировать проблему с производственным кодом вашей команды. Оно выдает автоматизированную аналитику и различные представления данных для изучения проблем с производительностью.

  • Определять проблемы с производительностью в сценариях DevOps, например когда клиент сообщает, что на веб-сайте розничной торговли не срабатывают какие-то запросы или заказы в разгар сезона. Часто проблемы возникают в рабочей среде и выполнить отладку в текущий момент непросто, однако наш инструмент поможет вам собрать о проблеме достаточно свидетельств и данных. Получив файл трассировки, он поможет быстро проанализировать потенциальные причины проблем и даст рекомендации в контексте кода, чтобы вы могли внести исправления.

  • Если проблема с задержкой отсутствует в запросе API, вы можете проверка для высокой загрузки ЦП и других связанных проблем с средством использования ЦП. Средство использования ЦП поможет определить узкие места, чтобы можно было сузить место оптимизации.

Средство Загрузка ЦП подходит как для локальных сеансов трассировки, так и для рабочей среды. Средство Загрузки ЦП также можно вызвать, нажав клавиши ALT+F2 и выбрав Загрузка ЦП или открыв уже собранную трассировку в таких средствах, как dotnet-trace или dotnet-monitor. (Это наиболее вероятный способ сбора трассировок для производственного кода .NET.)

Средство Загрузка ЦП может выполняться для открытого проекта Visual Studio, для установленного приложения Microsoft Store либо подключаться к запущенному приложению или процессу. Средство Загрузка ЦП можно запустить с отладкой или без нее. Дополнительные сведения см. в разделе Запуск средств профилирования с отладчиком или без него.

Ниже показано, как использовать средство Загрузка ЦП без отладчика, используя Профилировщик производительности Visual Studio. В примерах используется сборка выпуска на локальном компьютере. Сборки выпуска дают наилучшее представление о фактической производительности приложения. Сведения об анализе загрузки ЦП с использованием сборок отладки (с подключенным отладчиком) см. в разделе Руководство по профилированию производительности для начинающих.

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

Примечание.

Для использования Профилировщика производительности требуется Windows 7 или более поздней версии.

Сбор данных об использовании ЦП

  1. В проекте Visual Studio установите для решения конфигурацию Выпуск и выберите цель развертывания Локальный отладчик Windows (или Локальный компьютер).

    Screenshot that shows Select Release and Local Machine.

    Screenshot that shows Select Release and Local Machine.

  2. Выберите Отладка>Профилировщик производительности.

  3. В разделе Доступные инструменты выберите Загрузка ЦП и затем Запустить.

    Screenshot that shows Select CPU Usage.

    Screenshot that shows Select CPU Usage.

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

    Примечание.

    Дополнительные сведения о том, как сделать средство более эффективным, см. в статье Оптимизация параметров профилировщика.

  4. После запуска приложения начинается диагностический сеанс, который отображает данные о загрузке ЦП. Когда вы закончите сбор данных, выберите Остановить сбор данных.

    Screenshot that shows Stop CPU Usage data collection.

    Screenshot that shows Stop CPU Usage data collection.

    Инструмент "Использование ЦП" анализирует данные и отображает отчет. Если у вас возникли проблемы с сбором или отображением данных, см . статью "Устранение ошибок профилирования" и устранение проблем.

    Screenshot that shows CPU Usage report.

    Screenshot that shows CPU Usage report.

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

Столбцы данных об использовании ЦП

Имя Описание
Общая активность ЦП [единица измерения, %] Total % data equation

Миллисекунды и процент ресурсов ЦП, потраченные на вызовы функции и функций, которые вызывала данная функция, в выбранный период времени. Это отличается от графика временной шкалы Использование ЦП, который сравнивает общую активность ЦП за период времени с общими доступными ресурсами ЦП.
Собственная активность ЦП [единица измерения, %] Self % equation

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

Анализ аналитики ЦП

Чтобы проанализировать основные аналитические сведения, основные функции и горячий путь, ознакомьтесь с аналитическими сведениями о ЦП.

Анализ отчета об использовании ЦП

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

В отчете представлены различные представления диагностических данных:

  • Вызывающий или вызывающий
  • Дерево вызовов
  • Модули
  • Функции
  • Flame Graph

Чтобы проанализировать отчет, нажмите кнопку "Создать подробный отчет".

В отчете представлены различные представления диагностических данных:

  • Вызывающий или вызывающий
  • Дерево вызовов

Во всех представлениях, кроме вызывающего или вызываемого абонента, отчет диагностики сортируется по общей ЦП, от самого высокого до самого низкого. Измените порядок сортировки или столбец сортировки, выбирая заголовки столбцов. Вы можете дважды щелкнуть интересующую вас функцию, и вы увидите источник для функции, а также выделение, показывающее, где время тратится в этой функции. В таблице отображаются столбцы с данными, такими как время, затраченное на выполнение функции, включая вызываемые функции (ЦП (всего)), и второй столбец, показывающий время, затраченное на выполнение функции, за исключением вызываемых функций (Собственная активность ЦП).

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

Дополнительные сведения об использовании диаграммы "Пламя" см. в разделе "Определение горячих путей" с помощью "Граф пламени".

Дерево вызовов средства "Использование ЦП"

Чтобы просмотреть дерево вызовов, выберите родительский узел в отчете. По умолчанию страница "Использование ЦП" открывается в представлении вызывающего или вызываемого абонента . В раскрывающемся списке Текущее представление выберите Дерево вызовов.

Нажмите кнопку "Развернуть горячий путь" и "Показать горячий путь", чтобы увидеть вызовы функций, использующие самый высокий процент ЦП в представлении дерева вызовов.

Структура дерева вызовов

Screenshot that shows Call tree structure.

Screenshot that shows Call tree structure.

Изображения Description
Step 1 Узел верхнего уровня в деревьях вызовов для использования ЦП представляет собой псевдоузел.
Step 2 В большинстве приложений при отключенном параметре Показать внешний код узлом второго уровня является узел [Внешний код]. Он содержит код системы и инфраструктуры, запускающий и останавливающий приложение, отрисовывающий пользовательский интерфейс, управляющий планированием потоков и предоставляющий приложению другие низкоуровневые службы.
Step 3 Дочерними элементами узла второго уровня являются методы пользовательского кода и асинхронные подпрограммы, которые вызываются или создаются кодом системы и инфраструктуры на втором уровне.
Step 4 Дочерние узлы метода содержат данные только для вызова родительского метода. Если параметр Показать внешний код отключен, методы приложения также могут содержать узел [Внешний код] .

Внешний код

Функции системы и платформы, исполняемые вашим кодом, называются внешним кодом. Функции внешнего кода запускают и останавливают приложение, отрисовывают пользовательский интерфейс, управляют потоками и предоставляют приложению другие низкоуровневые службы. В большинстве случаев внешний код вас интересовать не будет, поэтому дерево вызовов средства "Использование ЦП" собирает внешние функции пользовательского метода в один узел [Внешний код].

Для просмотра путей вызова внешнего кода переключите текущее представление на Дерево вызовов или щелкните правой кнопкой мыши и выберите Просмотреть в дереве вызовов.

Screenshot that shows Show in Call Tree.

Чтобы посмотреть пути вызовов внешнего кода, на главной странице диагностического отчета (область справа) выберите Показать внешний код в раскрывающемся списке Фильтр и выберите Применить. Представление Дерево вызовов на странице Загрузка ЦП развертывает вызовы внешнего кода. (Раскрывающийся список Фильтр можно найти на главной странице диагностики, а не в представлениях с подробными сведениями.)

Screenshot that shows Show External Code.

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

Screenshot that shows nested external code in the call tree.

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

Screenshot that shows nested external code in the call tree.

Чтобы найти имя нужной функции, используйте поле поиска. Наведите указатель мыши на выбранную строку или используйте горизонтальную полосу прокрутки для просмотра данных.

Screenshot that shows Search for nested external code.

Screenshot that shows Search for nested external code.

Асинхронные функции в дереве вызовов использования ЦП

Если компилятор обнаруживает асинхронный метод, он создает скрытый класс для контроля выполнения этого метода. По сути, этот класс представляет собой конечный автомат. Класс содержит созданные компилятором функции, которые асинхронно вызывают исходные методы, а также обратные вызовы, планировщик и итераторы, необходимые для их выполнения. При вызове исходного метода родительским методом компилятор удаляет метод из контекста выполнения родительского метода и выполняет методы скрытого класса в контексте кода системы и платформы, который управляет выполнением приложения. Асинхронные методы часто, но не всегда выполняются в отдельном потоке (или в нескольких потоках). Этот код отображается в дереве вызовов средства Загрузка ЦП в виде дочерних элементов узла [Внешний код] сразу под верхним узлом дерева.

В следующем примере два первых узла в узле [Внешний код] представляют собой созданные компилятором методы класса конечного автомата. Третий узел является вызовом исходного метода.

Screenshot that shows Asynchronous node.

Разверните созданные методы, чтобы узнать, как это работает:

Screenshot that shows expanded asynchronous node.

Screenshot that shows expanded asynchronous node.

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

  • MainPage+<GetMaxNumberAsyncButton_Click>d__3::MoveNext показывает время ЦП, затраченное на планирование и запуск 48 задач, которые являются оболочкой вызова GetNumberAsync.

  • MainPage::<GetNumberAsync>b__b показывает время ЦП, затраченное на выполнение задач, которые вызывают GetNumber.

Сбор счетчиков вызовов (.NET)

Если вы хотите просмотреть количество вызовов в представлении "Функции", можно включить параметр перед началом профилировщика. Этот параметр поддерживается для типов проектов .NET и требует запуска процесса в профилировщике. Сценарий подключения не поддерживается.

  1. Щелкните значок Параметры для использования ЦП в профилировщике производительности.

    Screenshot that shows the settings icon for CPU Usage.

  2. Включите параметр "Только счетчики вызовов сбора" (только для .NET).

    Screenshot that shows settings for CPU Usage.

  3. Сбор данных об использовании ЦП.

  4. Откройте представление "Функции", а затем убедитесь, что для столбца счетчика вызовов задано значение "Видимый".

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

    Screenshot that shows call count data.