Представление "Потоки" (параллельная производительность)

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

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

  • поток заблокирован примитивом синхронизации;

  • закончился такт потока;

  • поток совершает блокирующий запрос ввода-вывода.

Представление «Потоки» назначает определенную категорию каждому переключению контекста, когда выполнение потока приостанавливается.Эти категории отображаются среду условных обозначений в левой нижней части представления.Визуализатор параллелизма распределяет события переключения контекста по категориям, выполняя поиск известных блокировок API в стеке вызова потока.Если в стеке вызова ничего не найдено, то в качестве причины ожидания устанавливается значение, предоставляемое Windows. Тем не менее, категория Windows может зависеть от особенностей реализации и не отражать целей пользователя. Например, Windows выдаст собственную тонкую блокировку ввода-вывода вместо синхронизации. В большинстве случаев есть возможность определить истинную причину блокировки, анализируя стеки вызова, относящиеся к событиям переключения контекста.

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

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

Использование

Представление «Потоки» можно использовать для разных целей:

  • Определение причин, по которым интерфейс пользователя (UI) не отвечает на определенных этапах выполнения.

  • Определение количества времени, затраченного на блокировку при синхронизации, вводе-выводе, ошибках страниц и при других событиях.

  • Определение степени влияния других процессов, выполняемых в системе.

  • Определение проблем сбалансирования нагрузки для параллельного выполнения.

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

  • Определение степени параллелизма приложения для содействия в применении принципа параллелизма.

  • Определение зависимостей между рабочими потоками и критическими путями выполнения.

Определение характерных промежутков времени и потоков

Представление «Потоки» показывает временную шкалу.По данной шкале можно перемещаться и увеличивать ее масштаб, чтобы проанализировать определенные промежутки времени и потоки приложения.По оси X отмечается время, а по оси Y - а несколько каналов:

  • В системе предусмотрены два канала вывода для каждого жесткого диска, один канал для чтения и один для записи.

  • Канал для каждого потока процесса.

  • Каналы маркера, если в трассировке есть события маркера.Каналы маркера первоначально отображаются в списке каналов потока, которые инициировали эти события.

  • Каналы GPU

Здесь приведен пример представления «Потоки»:

Представление потоков

Представление потоков

Изначально потоки отсортированы в том порядке, в котором они созданы, так что поток главного приложения будет первым.Чтобы отсортировать потоки по другим критериям (например, по наиболее часто исполняемым), можно использовать параметр сортировки в левом верхнем углу представления.

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

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

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

Инструменты анализа

В этом разделе описаны отчеты и другие инструменты анализа.

Dd627193.collapse_all(ru-ru,VS.110).gifСведения о блокировании потока

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

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

Dd627193.collapse_all(ru-ru,VS.110).gifЗависимости между потоками

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

Dd627193.collapse_all(ru-ru,VS.110).gifСведения о выполнении потока

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

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

ПримечаниеПримечание

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

Чтобы получить профиль выполнения для всех выбранных(не скрытых) в данный момент потоков в заданный диапазон времени, нажмите кнопку Выполнение на активной ленте условных обозначений.

Dd627193.collapse_all(ru-ru,VS.110).gifВременная шкала

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

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

Если в определенный момент времени только один поток зеленый (выполняемый), то, возможно, приложение не использует все преимущества параллелизма в системе.Кроме того, графиком временной шкалы можно воспользоваться для анализа зависимостей между потоками и для анализа временных зависимостей между блокирующим и блокируемым потоком.Для изменения порядка потоков, выберите поток, а затем на панели инструментов нажмите кнопку «вверх» или «вниз».Чтобы скрыть потоки, выделите их и нажмите кнопку Скрыть потоки.

Dd627193.collapse_all(ru-ru,VS.110).gifОтчеты профилирования

Под временной шкалой располагается профиль временной шкалы и панель с вкладками для разных отчетов.Отчеты автоматически обновляются при изменении представления «Потоки».Для больших трассировок панель отчетов может быть недоступна, пока выполняется расчет.Для каждого отчета доступны две настройки фильтров: «Снижение шума» и «Только мой код».Снижение шума помогает отфильтровать записи дерева вызовов, на которые потрачено очень мало времени.Значение фильтра по умолчанию — 2 процента, но его можно изменить от 0 до 99 процентов.Чтобы просмотреть дерево вызовов своего кода, выберите флажок Только мой код.Чтобы просмотреть все деревья вызовов, снимите его.

Dd627193.collapse_all(ru-ru,VS.110).gifОтчет о профиле

На этой вкладке отображаются отчеты, соответствующие записи в активной ленте условных обозначений.Для отображения отчета выберите одну из записей.

Dd627193.collapse_all(ru-ru,VS.110).gifТекущий стек

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

Dd627193.collapse_all(ru-ru,VS.110).gifРазблокировка стека

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

Dd627193.collapse_all(ru-ru,VS.110).gifВыполнение

В отчете по выполнению отображаются интервалы времени, в которые приложение выполнялось.

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

Dd627193.collapse_all(ru-ru,VS.110).gifСинхронизация

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

Dd627193.collapse_all(ru-ru,VS.110).gifВвод-вывод

В отчете о вводе-выводе отображаются вызовы, отвечающие за блокировки ввода-вывода, с указанием совокупного времени блокировки каждого стека вызова.Дополнительные сведения см. в разделе Время ввода-вывода (представление "Потоки").

Dd627193.collapse_all(ru-ru,VS.110).gifSleep

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

Dd627193.collapse_all(ru-ru,VS.110).gifУправление памятью

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

Dd627193.collapse_all(ru-ru,VS.110).gifВне очереди

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

Dd627193.collapse_all(ru-ru,VS.110).gifОбработка пользовательского интерфейса

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

Dd627193.collapse_all(ru-ru,VS.110).gifСводный отчет по каждому потоку

На этой вкладке отображаются колонки с цветовыми обозначениями, содержащие общее время, затраченное каждым потоком на пребывание в состоянии выполнения, блокировки, ввода-вывода или в каком-либо другом состоянии.Метки столбцов расположены внизу.При изменении масштаба диаграммы временной шкалы эта вкладка автоматически обновляется.При определенном масштабе некоторые потоки могут не отображаться.Когда это происходит, справа отображаются овалы.Если нужный поток отсутствует, можно скрыть другие потоки.Дополнительные сведения см. в разделе Сводный отчет по каждому потоку.

Dd627193.collapse_all(ru-ru,VS.110).gifОперации с диском

Эта вкладка показывает, какие процессы и потоки использовались для дискового ввода-вывода от имени текущего процесса, какие файлы они затронули (например, библиотеки DLL, которые были загружены), сколько байт было считано, и другие сведения.Этот отчет может быть использован для оценки времени, затраченного на доступ к файлам во время выполнения приложения, особенно если процесс связан с операциями ввода-вывода.Дополнительные сведения см. в разделе Отчет операций диска (представление потоков).

См. также

Основные понятия

Визуализатор параллелизма