Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Представление потоков — это наиболее подробное и полнофункциональное представление в визуализаторе параллелизма. В представлении "Потоки " можно определить, какие потоки выполняют код во время сегмента выполнения, и проанализировать, выполняются ли потоки или блокируются из-за синхронизации, ввода-вывода или других причин. Потоки также просматривают отчеты профилирования выполнения функций в стеке вызовов и разблокировки потоков.
Хотя потоки выполняются, визуализатор параллелизма собирает примеры. При остановке выполнения потока визуализатор проверяет все события переключения контекста в операционной системе для потока. Переключения контекста могут происходить по следующим причинам:
- Поток заблокирован на примитиве синхронизации.
- Срок действия кванта времени нити истекает.
- Поток создает блокирующий запрос ввода-вывода.
Визуализатор параллелизма классифицирует события потоков и контекстных переключений, а также выполняет поиск по стекам вызовов потоков для известных блокирующих API. В представлении "Потоки" категории потоков отображаются в активной легенде в нижнем левом углу. В большинстве случаев можно определить первопричину блокирующего события, проверив стеки вызовов, соответствующие событиям переключения контекста.
Если совпадения стека вызовов нет, визуализатор параллелизма использует причину ожидания, предоставленную Windows. Однако категория Windows может основываться на деталях реализации и может не отражать намерения пользователя. Например, Windows сообщает причину ожидания блокировки на узком собственном замке чтения-записи как ввод/вывод вместо синхронизации.
Представление потоков также показывает зависимости между потоками. Например, если определить поток, заблокированный на объекте синхронизации, можно найти поток, который его разблокировал. Вы можете проверить стек вызовов для разблокирующего потока в момент разблокировки другого потока.
Представление потоков можно использовать для:
- Определите причины, по которым пользовательский интерфейс приложения не отвечает во время определенных этапов выполнения.
- Определите время, затраченное на блокировку синхронизации, ввода-вывода, сбоев страниц и других событий.
- Узнайте о степени вмешательства других процессов, выполняемых в системе.
- Определите проблемы балансировки нагрузки для параллельного выполнения.
- Найдите причины неоптимальной или несуществующей масштабируемости. Например, почему производительность параллельного приложения не улучшается при наличии более логических ядер.
- Изучите степень параллелизма в приложении, чтобы помочь в параллелизации.
- Определите зависимости между рабочими потоками и критическими путями выполнения.
Используйте представление «Потоки»
Чтобы запустить визуализатор параллелизма, выберите " Анализ>визуализатора параллелизма", а затем выберите параметр, например запуск нового процесса.
Визуализатор параллелизма запускает приложение и собирает трассировку, пока не выберите Остановить сбор данных. Затем визуализатор анализирует трассировку и отображает результаты на странице отчета трассировки.
Перейдите на вкладку "Потоки " в левом верхнем углу отчета, чтобы открыть представление "Потоки ".
Выберите интервалы времени и потоки, чтобы начать анализ производительности.
Анализ временной шкалы
Верхняя часть представления "Потоки" — это временная шкала. Временная шкала показывает действие всех потоков в процессе и всех физических дисковых устройств на хост-компьютере. В нем также отображаются события активности GPU и маркера.
На временной шкале ось x — это время, а на оси y — несколько каналов:
- Два канала ввода-вывода для каждого диска в системе, один канал для операций чтения и один для записи.
- Канал для каждого потока в процессе.
- Каналы маркеров, если в трассировке присутствуют события маркера. Изначально каналы маркеров отображаются под каналами потока, создающими эти события.
- Каналы GPU.
Изначально потоки сортируются в том порядке, в котором они создаются, поэтому основной поток приложения будет первым. Выберите другой вариант в раскрывающемся списке Сортировать по, чтобы сортировать потоки по другому критерию, например, выполнению.
Цвета временной шкалы указывают состояние потока в определенное время. Зеленые сегменты выполняются, красные сегменты блокируются для синхронизации, желтые сегменты прерываются, а фиолетовые сегменты выполняют операции ввода-вывода.
Вы можете увеличить масштаб, чтобы просмотреть дополнительные сведения, или уменьшить масштаб, чтобы просмотреть более длинный интервал времени. Выберите сегменты и точки на графе, чтобы получить сведения о категориях, времени начала, задержках и состояниях стека вызовов.
Используйте временную шкалу для проверки баланса работы между потоками, участвующими в параллельном цикле или в параллельных задачах. Если один поток занимает больше времени, чем остальные, работа может быть несбалансирована. Вы можете повысить производительность приложения, распределяя их равномерно между потоками.
Если только один поток выполняется в определенный момент времени, приложение может не воспользоваться полным преимуществом параллелизма в системе. График временной шкалы можно использовать для проверки зависимостей между потоками и темпоральных связей между блокирующими и заблокированными потоками. Чтобы изменить порядок потоков, выберите поток, а затем щелкните значок вверх или вниз на панели инструментов.
Вы можете скрыть потоки, которые не выполняют работу или полностью заблокированы, так как их статистика не имеет значения и может засорять отчеты. Скрыть потоки, выбрав их имена, а затем выберите выбранные потоки или скрыть все, кроме выбранных значков потоков на панели инструментов. Чтобы определить потоки для скрытия, выберите ссылку «Сводка по потокам» в нижнем левом углу. Вы можете скрыть потоки, которые не имеют действий в графе "Сводка по потокам ".
Подробности выполнения потока
Чтобы получить более подробные сведения о сегменте выполнения, выберите точку на зеленом сегменте временной шкалы. Визуализатор параллелизма отображает черный флажок над выбранной точкой и отображает стек вызовов на текущей вкладке нижней панели. Можно выбрать несколько точек в сегменте выполнения.
Замечание
Визуализатор параллелизма может не обработать выборку в сегменте выполнения, если длительность сегмента меньше одной миллисекунды.
Чтобы получить профиль выполнения для всех незахваченных потоков в выбранном диапазоне времени, выберите "Выполнение " в условных обозначениях слева.
Сведения о блокировке потока
Чтобы получить сведения о определенном регионе в потоке, наведите указатель мыши на этот регион на временной шкале, чтобы отобразить подсказку. Подсказка содержит такие сведения, как категория, время начала и задержка. Выберите регион, чтобы отобразить стек вызовов на данный момент времени на вкладке "Текущая " нижней панели. В области также отображается категория, задержка, блокировка API при наличии одного и разблокировка потока при наличии одного. Проверив стек вызовов, можно определить основные причины событий блокировки потоков.
Путь выполнения может содержать несколько блокирующих событий. Чтобы быстрее выявить проблемные области, блокируя их по категории, выберите категорию блокировки в легенде слева.
Зависимости между потоками
Визуализатор параллелизма показывает зависимости между потоками, поэтому вы можете определить, какой блокированный поток пытается выполнить, и какой другой поток включил его для выполнения.
Чтобы определить, какой поток разблокировал другой поток, выберите сегмент блокировки на временной шкале. Если визуализатор параллелизма может определить поток разблокировки, он рисует линию между потоком разблокировки и выполняемым сегментом, который следует сегменту блокировки. Выберите вкладку "Разблокировать стек" в нижней области, чтобы просмотреть соответствующий стек вызовов.
Профильные отчеты
Под графиком временной шкалы находится область с вкладками "Отчет профиля", Текущий и Разблокировка стека. Отчеты автоматически обновляются при изменении выбора временной шкалы и потоков. Для больших трассировок область отчетов может быть временно недоступной при вычислении обновлений.
Вкладка "Отчет профиля"
Отчет «Профиль» имеет два фильтра:
- Чтобы отфильтровать записи дерева вызовов, в которых было потрачено мало времени, введите значение фильтра в диапазоне от 0 до 99 процентов в поле фильтрации шума. Значение по умолчанию — 2 процента.
- Чтобы просмотреть деревья вызовов только для вашего кода, установите флажок Только мой код. Чтобы просмотреть все деревья вызовов, снимите флажок.
На вкладке "Отчет профиля " отображаются отчеты для категорий и ссылок в условных обозначениях. Чтобы отобразить отчет, выберите одну из записей слева:
Исполнение В отчете о выполнении показана разбивка времени, затраченного приложением на выполнение.
Чтобы найти строку кода, в которой тратится время выполнения, разверните дерево вызовов и в контекстном меню для записи дерева вызовов, выберите "Вид источника " или "Просмотреть сайты вызовов". Просмотр источника находит выполненную строку кода. Просмотр точек вызова находит строку кода, которая вызвала выполненную строку. Если существует только одна строка сайта вызова, выделен его код. Если существуют несколько сайтов вызовов, выберите нужный в диалоговом окне и нажмите кнопку "Перейти к источнику". Чаще всего рекомендуется найти место вызова, которое имеет наибольшее количество случаев, больше всего времени выполнения, или того и другого. Дополнительные сведения см. в отчете профиля выполнения.
Синхронизация В отчете синхронизации показаны вызовы, ответственные за блоки синхронизации , а также общее время блокировки каждого стека вызовов. Дополнительные сведения см. в разделе "Время синхронизации".
ВВОД-ВЫВОД В отчете ввода-вывода показаны вызовы, которые отвечают за блоки ввода-вывода , а также общее время блокировки каждого стека вызовов. Более подробную информацию см. в разделе Время ввода-вывода (представление потоков).
Спать В отчете "Спящий режим " показаны вызовы, отвечающие за блоки сна, а также общее время блокировки каждого стека вызовов. Дополнительные сведения см. в разделе "Время сна".
Управление памятью В отчете по управлению памятью показаны вызовы, в которых произошли блоки управления памятью, а также общее время блокировки каждого стека вызовов. Используйте эту информацию для выявления областей с чрезмерным использованием разбиения по страницам или сборки мусора. Дополнительные сведения см. в разделе "Время управления памятью".
Предварительное вытеснение Отчет о вытеснении показывает, где процессы на системе вытесняли текущий процесс, и отдельные потоки, которые заменяли потоки в текущем процессе. Эти сведения можно использовать для идентификации процессов и потоков, наиболее часто вызывающих приостановку. Дополнительные сведения см. в разделе "Время предварительного прерывания".
Обработка пользовательского интерфейса В отчете об обработке пользовательского интерфейса показаны вызовы, ответственные за блоки обработки пользовательского интерфейса, а также общее время блокировки каждого стека вызовов. Дополнительные сведения см. в разделе "Время обработки пользовательского интерфейса".
Сводка по потоку Выберите " Сводка по потокам ", чтобы отобразить граф, показывающий состояние потоков для выбранного в данный момент интервала времени. Цветовые столбцы показывают общее время, которое каждый поток провёл в состояниях выполнения, блокировки, ввода-вывода и других. Потоки обозначены в нижней части. При настройке уровня масштабирования на графике временной шкалы этот граф автоматически обновляется.
На некоторых уровнях масштабирования некоторые потоки могут не отображаться в графе. Когда это происходит, многоточие (...) отображается справа. Если нужный поток не отображается, можно скрыть другие потоки. Для получения дополнительной информации см. сводный отчет по потокам.
Операции с дисками Выберите операции с дисками , чтобы отобразить процессы и потоки, связанные с диском ввода-вывода для текущего процесса, файлы, которые они касались (например, библиотеки DLL, которые они загружали), сколько байтов они считывают и другие сведения. Этот отчет можно использовать для оценки времени, затраченного на доступ к файлам во время выполнения, особенно если процесс, кажется, привязан к ввода-выводам. Дополнительные сведения см. в отчете об операциях с дисками.
Текущая вкладка
На этой вкладке показан стек вызовов для выбранной точки в сегменте потока на графике временной шкалы. Стеки вызовов обрезаются, чтобы отобразить только действия, связанные с приложением.
Вкладка "Разблокировка стека"
На этой вкладке показано, какой поток разблокировал выбранный поток и стек вызовов разблокировки.
Каналы (представление потоков)
Визуализатор параллелизма показывает четыре типа каналов: каналы потоков, каналы дисков, каналы маркеров и каналы GPU.
Каналы потоков
Канал потоков показывает состояние потока по цвету для одного потока. При наведении курсора на имя канала отображается функция запуска для данного потока. Визуализатор параллелизма обнаруживает несколько типов потоков. Наиболее распространенные типы показаны в следующей таблице.
| Thread | Description |
|---|---|
| Основной поток | Поток, который запустил приложение. |
| Рабочий поток | Поток, созданный основным потоком приложения. |
| Рабочий поток CLR | Рабочий поток, созданный общей средой выполнения (CLR). |
| Вспомогательный помощник отладчика | Рабочий поток, созданный отладчиком Visual Studio. |
| Поток ConcRT | Поток, созданный средой выполнения параллельных вычислений от Майкрософт. |
| Поток GDI | Поток, созданный GDIPlus. |
| Поток OLE/RPC | Поток, который был создан как рабочий поток RPC. |
| Поток RPC | Поток, созданный как поток RPC. |
| Поток Winsock | Поток, созданный как поток Winsock. |
| Пул потоков | Поток, созданный пулом потоков CLR. |
Каналы дисков
Каналы дисков соответствуют физическим дискам на компьютере. Так как для каждого физического диска в системе существуют отдельные каналы для операций чтения и записи, каждый диск имеет два канала. Номера дисков соответствуют именам устройств ядра. Канал диска отображается только в том случае, если на диске имеется активность.
Каналы маркеров
Каналы маркеров соответствуют событиям, созданным приложением, и библиотекам, которые он использует. Например, библиотека параллельных задач, библиотека параллельных шаблонов и C++ AMP создают события, отображаемые как маркеры. Каждый канал маркера связан с идентификатором потока, который отображается рядом с описанием канала. Идентификатор определяет поток, создающий событие. Описание канала содержит имя поставщика трассировки событий для Windows (ETW), создающего события. Если канал отображает события из пакета SDK визуализатора параллелизма, то также отображается имя серии.
Каналы GPU
Каналы GPU отображают сведения о действиях DirectX 11 в системе. Каждый обработчик DirectX, связанный с графической картой, имеет отдельный канал. Отдельные сегменты представляют время, затраченное на обработку пакета DMA.
Выбор копирования
Чтобы скопировать весь стек вызовов на вкладке отчета, нажмите кнопку "Копировать". Затем можно вставить стек вызовов в любой программе, поддерживающей это действие.
Текущая вкладка
Щелкнув вкладку Current , вы можете увидеть стек вызовов (если он доступен), ближайший к текущей точке выбора на временной шкале, если выбран сегмент потока ЦП. В этом случае точка выбора представлена черной стрелкой или курсором над временной шкалой. При выборе сегмента блокировки курсор не отображается, так как не было выполнения. Однако сегмент по-прежнему выделен и отображается стек вызовов.
На вкладке Current также отображаются сведения о сегментах действий DirectX, маркерах и доступе к ввода-выводам. Для сегментов действий DirectX отображается информация о том, как пакеты DMA обрабатываются аппаратной очередью. Для маркеров отображаются сведения о описании и типе маркера. Для доступа к ввода-выводам отображаются сведения о файле и количестве байтов, считываемых или записанных.
Пустой сегмент временной шкалы
В визуализаторе параллелизма причина того, что раздел временной шкалы пуст (имеет белый фон) зависит от типа канала.
Для канала потока ЦП это означает, что поток не существовал во время этой части временной шкалы. Если вас интересует эта тема, вы можете найти её часть выполнения с помощью ползунка масштабирования или прокрутки по горизонтали.
Для канала ввода-вывода это означает, что доступ к диску не произошел от имени целевого процесса в тот момент времени.
Для канала DirectX это означает, что работа с GPU не выполнялась от имени целевого процесса во время этой части временной шкалы.
Для канала маркеров это означает, что маркеры не были созданы.
Кнопка экспорта (визуализатор параллелизма)
Кнопка "Экспорт" позволяет экспортировать стек вызовов в виде. CSV-файл для собственных записей или для использования с другим инструментом, таким как Microsoft Excel.
Просто мой код (отображение потоков)
Если выбрать этот параметр, отфильтруйте стек вызовов, чтобы отобразить только код, а также один уровень вызываемых функций.
Активировав этот параметр, можно значительно уменьшить сложность стека вызовов и, возможно, упростить диагностику конкретной проблемы.
В некоторых случаях выбор этого параметра может отфильтровать блокирующий вызов. Если вам требуется полный стек вызовов, чтобы сделать это определение, снимите этот параметр, чтобы предоставить полный стек вызовов.
Управление каналами
В представлении потоков в визуализаторе параллелизма можно упорядочить каналы для процесса, чтобы можно было изучить определенные шаблоны. Вы можете сортировать каналы, перемещать их вверх и вниз и скрывать или показывать их.
Сортировка по
Для сортировки потоков по разным критериям в зависимости от текущего уровня масштабирования можно использовать элемент управления "Сортировка". Это особенно полезно при поиске определенного шаблона. Вы можете отсортировать по следующим критериям:
| Критерии | Definition |
|---|---|
| Время начала | Сортирует потоки по времени начала. Это порядок сортировки по умолчанию. |
| Время окончания | Сортирует потоки по времени окончания. |
| Execution | Сортирует потоки по проценту времени, затраченного на выполнение. |
| Synchronization | Сортирует потоки по проценту времени, затраченного на синхронизацию. |
| I/O | Сортирует потоки по проценту времени, затраченного на операции ввода-вывода (чтение и запись данных). |
| Спать | Сортирует потоки по проценту времени, затраченного в спящий режим. |
| Paging | Сортирует потоки по проценту времени, затрачиваемому на пейджинг. |
| Прерывание | Сортирует потоки по проценту времени, проведенного в вытеснении. |
| Обработка пользовательского интерфейса | Сортирует потоки по проценту времени, затраченного на обработку пользовательского интерфейса. |
Перемещение выбранного канала вверх или вниз
Эти элементы управления можно использовать для перемещения канала вверх или вниз в списке. Например, можно разместить связанные каналы рядом друг с другом, чтобы помочь вам изучить определенный шаблон или связь между потоками.
Переместите выбранный канал вверх или вниз.
Вы можете переместить выбранные каналы в верхнюю или нижнюю часть списка, чтобы можно было изучить определенный шаблон или переместить некоторые каналы из пути при изучении других.
Скрытие выбранных каналов
Выберите этот элемент управления, когда вы хотите скрыть каналы. Например, если поток занимает 100 процентов времени на синхронизацию в течение всего времени существования управляемого процесса, его можно было бы скрыть при анализе других потоков.
Замечание
Скрытие потока также удаляет его из времени выполнения вычислений, которое отображается в активной легенде и в отчетах профилирования.
Показать все каналы
Этот элемент управления активен при скрытии одного или нескольких каналов. При выборе этой опции все скрытые элементы отображаются и снова включаются в расчеты времени.
Переместите маркеры наверх
Если трассировка содержит события маркеров, эту команду можно использовать для перемещения каналов маркеров в верхнюю часть временной шкалы. Их относительный порядок сохраняется.
Группирование маркеров по потоку
Если трассировка содержит события маркера, вы можете использовать эту команду для группировки каналов маркеров под потоком, который создал эти события. Каналы дисков перемещаются в верхнюю часть списка каналов, а каналы GPU перемещаются в нижней части.
Режим измерения включено и выключено
С помощью этого средства можно точно измерить продолжительность времени на временной шкале. Чтобы включить режим измерения, нажмите кнопку меры (значок линейки), а затем перетащите временную шкалу. При перетаскивании обратите внимание, что область под указателем выделена желтым цветом, а измеренное время отображается на панели инструментов справа от кнопки. Это значение вычисляется динамически по мере перетаскивания, чтобы сразу увидеть, сколько времени занимает определенное событие. При освобождении кнопки мыши значение времени остается видимым.
Вы можете повторить процесс измерения, но отображается только последнее измерение. Нажмите кнопку меры еще раз, чтобы отключить режим меры.
Процент уменьшения шума
По умолчанию значение параметра "Процент уменьшения шума" равно 2. В дереве вызовов отображаются только те записи, которые имеют процент инклюзивного времени, превышающий или равный этому значению. Изменив параметр, вы можете контролировать количество записей, отображаемых в дереве вызовов. Например, изменение значения на 10 будет отображать только записи дерева вызовов, имеющие инклюзивное время больше или равно 10%. Увеличив значение параметра, вы можете сосредоточиться на записях, которые оказывают наибольшее влияние на производительность вашего процесса.
Отчет с учетом отображаемого временного интервала
В представлении профиля отображаются отчеты, основанные на видимом диапазоне времени и каналах. Чтобы просмотреть сведения о различных подмножествах данных, щелкните элементы в условных обозначениях.
Дополнительные сведения о данных можно найти в отчетах "Просмотр потоков".
Соединитель, готовый к резьбе
При щелчке на блокирующем сегменте для просмотра стека вызовов и его разблокирующего стека может также появиться соединитель готовности потока. Если событие разблокировки произошло в другом потоке в текущем процессе, соединитель, готовый к потоку, визуально определяет поток и сегмент выполнения, который позволил заблокированному потоку возобновить выполнение.
Каретка временной шкалы
При выборе точки на временной шкале сегмента выполняемого потока, над ней появится указатель на шкале времени. Стек вызовов, отображаемый на текущей вкладке стека, является ближайшим по времени к месту, где вы щелкнули на сегмент. Каретка используется для связывания стека вызовов, отображаемого на текущей вкладке, с моментом, когда он был взят как образец. Курсор показывает точное расположение стека вызовов, который является ближайшим стеком вызовов к месту, выбранному пользователем.
Разблокировка стека
Если выбранный в данный момент элемент потока представляет блокированный сегмент, который позже начал выполняться после того, как он был разблокирован другим потоком в текущем процессе, стек вызовов для потока, который сделал разблокировку, отображается на этой вкладке.
Видимый профиль временной шкалы
Профиль видимой временной шкалы для представления блокировки потоков предоставляет статистические сведения и ссылки на отчеты. При увеличении, уменьшении масштаба, горизонтальной прокрутке, скрытии или отображении каналов, числа в активной легенде изменяются, чтобы отразить то, что в настоящее время отображается на экране. Чтобы просмотреть отчет об элементе в легенде, щелкните по элементу.
Элемент управления масштабированием (представление потоков)
Элемент управления масштабированием — это ползунок, который помогает увеличивать и выходить на временную шкалу, чтобы сосредоточиться на областях, интересующих вас. Так как этот элемент управления увеличивает масштаб с центра представления временной шкалы, разместите интересующую область в центре перед увеличением масштаба.
Увеличение масштаба путем перетаскивания в представлении временной шкалы
Масштабирование путем перетаскивания в представлении временной шкалы создает область, выделенную желтым цветом. После отпускания кнопки мыши временная шкала увеличивается на выбранный диапазон.
Увеличение и уменьшение масштаба с помощью колесика мыши
Щелкните любую точку на временной шкале (чтобы фокус был на шкале), затем нажмите клавишу Ctrl и переместите колесико мыши (вперед увеличивает масштаб, назад уменьшает масштаб).