Представление "Потоки" (параллельная производительность)
Это наиболее подробное и функционально богатое представление в визуализаторе параллелизма. Это представление позволяет понять, какие из потоков выполняются, а какие заблокированы вследствие синхронизации, операции ввода-вывода или по иным причинам.
Во время анализа профилирования визуализатор параллелизма рассматривает все события переключения контекста операционной системы в каждом потоке приложения. Переключение контекстов может происходить по многим причинам, например:
поток заблокирован примитивом синхронизации;
закончился такт потока;
поток совершает блокирующий запрос ввода-вывода.
Представление потоков присваивает категорию каждому переключению контекста, при котором останавливается выполнение потока. Категории отображаются в легенде в левой нижней части представления, а их описание приведено в соответствующих разделах справки. Категоризация событий переключения контекста достигается поиском известных блокирующих интерфейсов API в стеке вызовов потока. Если для события не найдено совпадение в стеке вызовов, используется причина ожидания, предоставленная Windows. Технически, категоризация Windows может быть основана на деталях реализации, а не на ожиданиях или целях пользователя. К примеру, Windows выдаст собственную тонкую блокировку ввода-вывода вместо синхронизации. Однако в таком случае следует найти истинную причину любого блокирующего события, проверяя стек вызовов, соответствующий событиям переключения контекста.
Представление потоков также показывает зависимости между потоками. Например, при обнаружении потока, блокируемого объектом синхронизации, он часто может отобразить поток, который его разблокировал, а также показать, что происходило с заблокированным потоком в это время, отобразив стек вызовов при его разблокировке.
Наконец, при выполнении потоков инструмент собирает образцы, с помощью которых можно определить, какой код выполняется одним или несколькими потоками в течение сегмента выполнения. Кроме того, что это представление предоставляет основанную на образцах визуализацию выполнения потока, представление предоставляет также отчеты профилирования выполнения дерева стека вызовов и отчеты о блокировках.
Использование
Представление "Потоки" можно использовать для разных целей. Ниже перечислены наиболее распространенные применения.
Определение причин, по которым интерфейс пользователя (UI) не отвечает на определенных этапах выполнения.
Определение количества времени, затраченного на блокирование при синхронизации, вводе-выводе, ошибках страниц и т. д.
Определение степени взаимного влияния с другими процессами, выполняемыми в системе.
Определение проблем балансировки нагрузки для параллельного выполнения.
Определение причин неоптимальной масштабируемости или ее полного отсутствия (например, причин, по которым производительность параллельно выполняемого приложения не повышается при наличии в системе большего количества логических ядер).
Определение степени параллелизма приложения для содействия в применении принципа параллелизма.
Определение зависимостей между рабочими потоками и критическими путями выполнения.
В оставшейся части этого раздела будет рассмотрена рекомендуемая схема использования, которая позволит добиться максимальной эффективности при работе с этим представлением. Прежде всего, рекомендуется воспользоваться представлением Представление использования ЦП, чтобы сосредоточиться на определенном этапе выполнения рассматриваемого процесса. Использование Поддержка маркеров класса Scenario в приложении может существенно помочь в этом. После подробного рассмотрения интересующего промежутка времени выполнения можно выбрать представление "Потоки".
Определение и сужение интересующей области
В представлении "Потоки" отображается представление временной шкалы с временем по оси X. По оси Y указываются два канала ввода-вывода, один для чтения, а другой для записи, для каждого физического дискового устройства в системе, на котором выполнялись действия во время сбора профиля. Под каналами диска отображается канал для каждого потока в процессе. Изначально потоки сортируются в порядке их создания, в результате чего основной поток приложения оказывается первым. Для сортировки потоков по другому критерию (например, по загруженности потока во время выполнения), можно воспользоваться параметром сортировки в левом верхнем углу представления.
Кроме того, можно скрыть потоки, которые не выполняют никакой работы в интересующем сценарии, выделив их имена в левом столбце и щелкнув значок Скрыть выделенные потоки на панели инструментов. Такие потоки могу возникать по многим причинам. Например, это могу быть потоки бездействующего пула потоков. Подобные потоки обычно полностью блокированы (как правило вследствие синхронизации). Необходимо удалить их из представления, поскольку данные по ним могут исказить статистику.
Для выявления потоков, которые можно скрыть, можно использовать вкладку "Сбой выполнения". Для просмотра графика "Сбой выполнения" щелкните Сводка по потоку в активной легенде. На этом графике отображается подразделение состояний каждого потока приложения для отображаемого в данный момент промежутка времени. Чтобы обеспечить масштабируемость графика, число отображаемых потоков было ограничено, поэтому в некоторых случаях на гистограмме невозможно отобразить данные для всех потоков приложения. Если такое происходит, справа отображаются многоточия.
После сужения границ анализа до интересующей области и выбора необходимых потоков можно приступить к анализу производительности. В следующих разделах описаны различные инструменты, используемые для этого.
Сведения о блокировании потока
Чтобы понять первопричину блокирования потока, можно подвести указатель к одной из областей или выбрать ее (щелкнув левой кнопкой мыши). Когда указатель мыши задерживается на области блокировки, на экране отображается подсказка с общими сведениями о событии блокировки, например его категория, блокирующий интерфейс API, если таковой имеется, начальное время области и длительность блокировки. Для категории "Вытеснение" отображается также идентификатор процесса и идентификатор потока в этом процессе, запланированном в ЦП в момент остановки потока ядром. Также можно выбрать область блокировки в интересующем канале, результаты которого отображаются на мониторе текущего стека в нижнем окне. Кроме сведений в подсказке, вкладка Текущий стек отображает стек вызовов, ставший причиной блокировки потока. Проанализировав стек вызова, можно определить первопричину возникновения события блокировки потока. По умолчанию в представлении отображаются все стеки вызова, включая стеки пользователя и ядра. Если инструмент способен определить, что определенный интерфейс API является причиной блокировки, стек вызова обрезается за пределами кадра. Если инструменту не удается определить вызов корневой функции, ставший причиной блокировки, отображается весь стек, чтобы пользователь мог проверить его и определить вызов самостоятельно.
Зачастую оказывается, что путь выполнения приводит к нескольким событиям блокировки. Поэтому важно также определить совокупные задержки вследствие блокировки, инициированные стеками вызова. Для этого программа предоставляет отчет о профилировании на основе дерева вызовов для каждой категории блокировок. Чтобы просмотреть профиль, нужно выбрать одну из записей в расположенной слева легенде категорий блокировки. Эти отчеты позволяют быстро расставить приоритеты для повышения производительности по времени при настройке приложения.
Зависимости между потоками
Визуализатор параллелизма показывает зависимости между блокирующими потоками в процессе. Чтобы определить поток, действия которого разблокировали интересующий поток, щелкните соответствующий блокирующий сегмент. Если инструмент может определить разблокирующий поток, отображается линия, соединяющая выполняющийся сегмент, который следует за интересующим блокирующим сегментом в другом потоке. Эта линия показывает, как различные потоки разблокируют выбранный поток. Кроме того, на вкладке Разблокировка стека выводится соответствующий стек вызовов. Таким образом, можно быстро определить блокированный поток, выяснить, какую задачу он пытался выполнить, и увидеть, что в итоге позволило ему выполниться.
Сведения о выполнении потока
Зачастую имеет смысл определить код, который выполняется потоком при выполнении приложения. Эти области отображаются на временной шкале в виде зеленых сегментов. Для этого предусмотрено две функции.
Во-первых, при щелчке сегмента выполнения на временной шкале предпринимается попытка поиска ближайшего стека вызова профиля выборки. Если попытка удалась, над местом в блоке выполнения, где взята выборка, отображается черная "крышка", а на вкладке Текущий стек — сам стек вызова. Щелкая в любых других местах сегментов выполнения можно выбрать другие образцы. Иногда возможны случаи, когда образец найти не удается. Обычно это является следствием того, что профили выборки собираются в течение 1 мс. Например, если сегмент выполнения короче одной миллисекунды, стек вызова может не быть найден. Частота выборки не может быть изменена, но одна миллисекунда — хороший компромисс между точностью и избыточными накладными расходами на выполнение.
Во-вторых, отчет профиля выборки выполнения совместно с представлением дерева вызовов — это важная функция, которая помогает понять, на что именно тратится время выполнения. Для доступа к этой функции нужно выбрать в активной легенде элемент Выполнение. В профиле выполнения содержится образец отчета по всем включенным (не скрытым) потокам в текущем представлении, отфильтрованным в окне по временному диапазону.
Временная шкала
На временной шкале отображаются действия для всех потоков процесса и всех физических дисковых устройств на локальном компьютере. Для увеличения масштаба временной шкалы нужно перетащить указатель мыши, воспользоваться ползунком масштаба на панели инструментов окна или, удерживая нажатой клавишу CTRL, прокрутить колесико мыши. Задержите указатель на одной из горизонтальных полос, или сегментов, чтобы просмотреть категорию, время начала и длительность соответствующей точки потока. Щелкните один из сегментов, чтобы просмотреть стек вызова в нижней части экрана на вкладке Текущий стек.
На графике временной шкалы состояние потока в любой заданный момент времени обозначается цветом. Например, зеленые сегменты выполняются, красные — заблокированы для синхронизации, желтые сегменты вытеснены, а пурпурные заняты устройством ввода-вывода. Такое представление позволяет проанализировать соотношение загрузки по группам потоков, задействованных в параллельном цикле или параллельных задачах. Если для завершения одного или нескольких потоков нужно значительно больше времени, чем для других, это может свидетельствовать о несбалансированности рабочей нагрузки и возможности повысить производительность программы за счет более равномерного распределения нагрузки между потоками.
Кроме того, можно воспользоваться графиком временной шкалы для анализа зависимостей между потоками и временных зависимостей между блокирующим и блокируемым потоком. По положению вертикального ползунка в соответствующей точке временной шкалы можно определить количество потоков, запущенных в определенный момент времени. Если в данный момент времени зеленым (выполняется) обозначен только один поток, это свидетельствует о том, что приложение не полностью использует преимущества доступного параллелизма. Нажимая на панели инструментов кнопки со стрелками вверх и вниз, можно сортировать и перемещать отдельные потоки, а также скрывать ненужные потоки с помощью кнопки Скрыть потоки.
Отчеты профилирования
Под графиком временной шкалы расположена активная легенда и окно со вкладками с несколькими отчетами. Отчеты о профилях автоматически обновляются при изменении представления потоков — при масштабировании, прокрутке, сокрытии или показе потоков. При больших трассировках окно отчетов затемняется на время составления обновляемых отчетов. Для каждого отчета доступны две настройки фильтров: "Снижение шума" и "Только мой код". Снижение шума помогает отфильтровать незначительные записи дерева вызовов, на которые потрачено очень мало времени. Значение по умолчанию 2 процента; оно может быть изменено в диапазоне от 0 до 99 процентов. Флажок Только мой код позволяет скрыть все записи дерева вызовов, кроме ваших собственных. Доступные отчеты приведены в следующем разделе.
Отчет о профиле
С помощью этой вкладки можно получить доступ к текущему отчету профилирования. Выбрав запись в активной легенде, можно задать отчет о профиле для отображения. Доступные отчеты о профиле перечислены в следующем разделе, начиная с отчета Выполнение.
Текущий стек
На этой вкладке отображаются стеки вызова для выбранного сегмента потока на графе подробностей. Стеки вызовов отсекаются, позволяя сосредоточиться на действиях, непосредственно связанных с программой. В окне выбора сразу же отображается информация о выполняемых в данный момент потоках.
Разблокировка стека
Щелкните вкладку Разблокировка стека, чтобы узнать, какой поток разблокировал данный поток на какой строке кода.
Выполнение
В отчете профиля выполнения отображается подробная таблица с указанием процента времени, затраченного каждым потоком в различных состояниях, например в процессе выполнения, ввода-вывода и управления памятью.
Щелкните элемент управления "дерево" рядом с любой интересующей записью стека вызова, чтобы найти и развернуть строку кода, для которой было затрачено время на выполнение. После определения интересующей записи дерева вызовов щелкните этот элемент правой кнопкой мыши для вызова контекстного меню, содержащего команды Источник и Просмотреть места вызова. При выборе пункта меню Источник будет выполнен переход к строке исходного кода, а при выборе пункта Просмотреть места вызова будет выполнен переход к строке кода, из которой вызывается эта строка. Если доступно только одно место вызова, по щелчку мыши выполняется переход к выделенной строке кода, являющейся местом вызова. Если обнаружено несколько мест вызова, отображается диалоговое окно, в котором может быть выбран один элемент. При нажатии кнопки Перейти к источнику будет выполнен переход к выделенному месту вызова. Часто полезнее всего выбрать и просмотреть источники для мест вызовов, которые выполняются во многих экземплярах и/или в течение значительного времени. Дополнительные сведения см. в разделе Выполнение отчета профилирования.
Синхронизация
В отчете о синхронизации отображаются вызовы, отвечающие за блокировки синхронизации, с указанием совокупного времени блокировки каждого стека вызова. Эти сведения можно использовать для определения интересующих областей и их анализа.
Щелкните элемент управления "дерево" рядом с любой интересующей записью дерева вызовов, чтобы развернуть дерево и найти строку кода, для которой было затрачено время на синхронизацию. После определения интересующей записи дерева вызовов щелкните этот элемент правой кнопкой мыши для вызова контекстного меню, содержащего команды Источник и Просмотреть места вызова. При выборе пункта меню Источник будет выполнен переход к строке исходного кода, а при выборе пункта Просмотреть места вызова будет выполнен переход к строке кода, из которой вызывается эта строка. Если доступно только одно место вызова, по щелчку мыши выполняется переход к выделенной строке кода, являющейся местом вызова. Если обнаружено несколько мест вызова, отображается диалоговое окно, в котором может быть выбран один элемент. При нажатии кнопки Перейти к источнику будет выполнен переход к выделенному месту вызова. Часто полезнее всего выбрать и просмотреть источники для мест вызовов, которые выполняются во многих экземплярах и/или в течение значительного времени. Дополнительные сведения см. в разделе Время синхронизации.
Ввод-вывод
В отчете о вводе-выводе отображаются вызовы, отвечающие за блокировки ввода-вывода, с указанием совокупного времени блокировки каждого стека вызова. Эти сведения можно использовать для определения интересующих областей и их анализа.
Щелкните элемент управления "дерево" рядом с любым интересующим стеком вызова, чтобы найти и развернуть строку кода, для которой было затрачено время на ввод-вывод. После определения интересующей записи дерева вызовов щелкните этот элемент правой кнопкой мыши для вызова контекстного меню, содержащего команды Источник и Просмотреть места вызова. При выборе пункта меню Источник будет выполнен переход к строке исходного кода, а при выборе пункта Просмотреть место вызова будет выполнен переход к строке кода, из которой вызывается эта строка. Если доступно только одно место вызова, по щелчку мыши выполняется переход к выделенной строке кода, являющейся местом вызова. Если обнаружено несколько мест вызова, отображается диалоговое окно, в котором может быть выбран один элемент. При нажатии кнопки Перейти к источнику будет выполнен переход к выделенному месту вызова. Часто полезнее всего выбрать и просмотреть источники для мест вызовов, которые выполняются во многих экземплярах и/или в течение значительного времени. Дополнительные сведения см. в разделе Время ввода-вывода (представление "Потоки").
Sleep
В отчете о спящем режиме отображаются вызовы, отвечающие за блокировки спящего режима, с указанием совокупного времени блокировки каждого стека вызова. Эти сведения можно использовать для определения интересующих областей и их анализа.
Щелкните элемент управления "дерево" рядом с любым интересующим стеком вызова, чтобы найти и развернуть строку кода, для которой было затрачено время на спящий режим. После определения интересующей записи дерева вызовов щелкните этот элемент правой кнопкой мыши для вызова контекстного меню, содержащего команды Источник и Просмотреть места вызова. При выборе пункта меню Источник будет выполнен переход к строке исходного кода, а при выборе пункта Просмотреть место вызова будет выполнен переход к строке кода, из которой вызывается эта строка. Если доступно только одно место вызова, по щелчку мыши выполняется переход к выделенной строке кода, являющейся местом вызова. Если доступно несколько мест вызова, отображается диалоговое окно, в котором выбрана одна запись. При нажатии кнопки Перейти к источнику будет выполнен переход к выделенному месту вызова. Часто полезнее всего выбрать и просмотреть источники для мест вызовов, которые выполняются во многих экземплярах и/или в течение значительного времени. Дополнительные сведения см. в разделе Время ожидания.
Разбиение по страницам
В отчете о разбиении по страницам отображаются вызовы, отвечающие за блокировки вытеснения, с указанием совокупного времени блокировки каждого стека вызова. Эти сведения можно использовать для определения интересующих областей и их анализа. Этот отчет о блокировках имеет меньшее практическое значение, чем другие, поскольку вытеснение чаще задается для процесса операционной системой, чем вызывается кодом пользователя. Он показывает, какие виды вытеснения созданы, где они произошли, и как долго процесс находился в определенном состоянии вытеснения.
Щелкните элемент управления "дерево" рядом с любой интересующей записью дерева вызовов, чтобы найти и развернуть строку кода, для которой было затрачено время на выполнение вне очереди. После определения интересующей записи дерева вызовов щелкните этот элемент правой кнопкой мыши для вызова контекстного меню, содержащего команды Источник и Просмотреть места вызова. При выборе пункта меню Источник будет выполнен переход к строке исходного кода, а при выборе пункта Просмотреть места вызова будет выполнен переход к строке кода, из которой вызывается эта строка. Если обнаружено только одно место вызова, по щелчку мыши выполняется переход к выделенной строке кода, являющейся местом вызова. Если доступно несколько мест вызова, отображается диалоговое окно, в котором выбрана одна запись. При нажатии кнопки Перейти к источнику будет выполнен переход к выделенному месту вызова. Часто полезнее всего выбрать и просмотреть источники для мест вызовов, которые выполняются во многих экземплярах и/или в течение значительного времени. Дополнительные сведения см. в разделе Время управления памятью.
Вне очереди
В отчете о разбиении по страницам отображаются вызовы, отвечающие за блокировки вытеснения, с указанием совокупного времени блокировки каждого стека вызова. Эти сведения можно использовать для определения интересующих областей и их анализа. Этот отчет о блокировках имеет меньшее практическое значение, чем другие, поскольку вытеснение чаще задается для процесса операционной системой, чем вызывается кодом пользователя. Он показывает, какие виды вытеснения созданы, где они произошли, и как долго процесс находился в определенном состоянии вытеснения.
Щелкните элемент управления "дерево" рядом с любым интересующим стеком вызова, чтобы найти и развернуть строку кода, для которой было затрачено время на выполнение вне очереди. После определения интересующей записи дерева вызовов щелкните этот элемент правой кнопкой мыши для вызова контекстного меню, содержащего команды Источник и Просмотреть места вызова. При выборе пункта меню Источник будет выполнен переход к строке исходного кода, а при выборе пункта Просмотреть место вызова будет выполнен переход к строке кода, из которой вызывается эта строка. Если обнаружено только одно место вызова, по щелчку мыши выполняется переход к выделенной строке кода, являющейся местом вызова. Если доступно несколько мест вызова, отображается диалоговое окно, в котором выбрана одна запись. При нажатии кнопки Перейти к источнику будет выполнен переход к выделенному месту вызова. Часто полезнее всего выбрать и просмотреть источники для мест вызовов, которые выполняются во многих экземплярах и/или в течение значительного времени. Дополнительные сведения см. в разделе Время вытеснения.
Обработка пользовательского интерфейса
В отчете об обработке пользовательского интерфейса отображаются вызовы, отвечающие за блокировки обработки пользовательского интерфейса, с указанием совокупного времени блокировки каждого стека вызова. Эти сведения можно использовать для определения интересующих областей и их анализа.
Щелкните элемент управления "дерево" рядом с любой интересующей записью стека вызова, чтобы найти и развернуть строку кода, для которой было затрачено время на обработку пользовательского интерфейса. После определения интересующей записи дерева вызовов щелкните этот элемент правой кнопкой мыши для вызова контекстного меню, содержащего команды Источник и Просмотреть места вызова. При выборе пункта меню Источник будет выполнен переход к строке исходного кода, а при выборе пункта Просмотреть места вызова будет выполнен переход к строке кода, из которой вызывается эта строка. Если доступно только одно место вызова, по щелчку мыши выполняется переход к выделенной строке кода, являющейся местом вызова. Если доступно несколько мест вызова, отображается диалоговое окно, в котором выбрана одна запись. При нажатии кнопки Перейти к источнику будет выполнен переход к выделенному месту вызова. Часто полезнее всего выбрать и просмотреть источники для мест вызовов, которые выполняются во многих экземплярах и/или в течение значительного времени. Дополнительные сведения см. в разделе Время обработки пользовательского интерфейса.
Сводный отчет по каждому потоку
На этой вкладке отображается представление столбцов с цветовым кодированием для общего времени, затраченного каждым потоков в каждом состоянии, например при выполнении, блокировке и вводе-выводе. Метки столбцов расположены внизу. На уровне масштабирования по умолчанию данные о главном потоке указываются в крайнем левом столбце. При изменении уровня масштабирования на графе подробностей отчеты на вкладках автоматически обновятся, чтобы отразить изменившийся временной масштаб. Для поддержки масштабирования этого графика количество отображаемых потоков ограничено. Поэтому в определенных случаях на графике могут отображаться данные не для всех потоков приложения, но на это ограничение будут указывать многоточия, отображаемые в крайней правой позиции. Если нужный поток не представлен в графе, можно скрывать ненужные потоки до тех пор, пока нужный поток не появится в графе. Дополнительные сведения см. в разделе Сводный отчет по каждому потоку.
Файловые операции
На этой вкладке отображаются потоки, участвующие в операциях дискового ввода-вывода, и файлы, затрагиваемые этими операциями. Сюда входят загруженные библиотеки DLL, количество считанных байтов и прочие сведения. Этот отчет может быть полезен при оценке времени, затраченного на доступ к файлам во время выполнения приложения, особенно если процесс связан с операциями ввода-вывода. Дополнительные сведения см. в разделе Отчет "Операции с файлами" (представление "Потоки").