“线程”视图(并行性能)

线程视图是并发可视化工具中最详细、功能最丰富的视图。通过使用此视图,可以确定线程是在执行,还是因同步、I/O 或某些其他原因阻塞执行。

在配置分析中,并发可视化工具检查每个应用程序线程的所有操作系统的上下文切换事件。上下文切换可能由多种原因导致,例如这些:

  • 线程被同步基元阻塞。

  • 线程的量程过期。

  • 线程发出一个阻塞 I/O 请求。

在线程已停止执行时,线程视图向每个上下文切换分配一个类别。图例中的类别在视图的左下方部分中显示。并发可视化工具通过搜索已知的阻塞的 API 的线程调用堆栈实现上下文切换事件分类。如果没有调用堆栈匹配,则使用 Windows 提供的等待原因。但是,Windows 类别可能基于详细信息的实现,并可能无法反映用户的意图。例如,Windows 报告的等待原因为在本机的微小读写器锁为 I/O 而不是同步。在很多情况下,可以通过检查与上下文切换事件对应的调用堆栈来识别阻塞事件的根源。

线程视图还显示线程间的依赖关系。例如,在中,如果您找出了同步对象上被阻塞的线程,可以查找解除其阻塞的线程,同时可以检查调用堆栈上的活动当该线程解除了另一个元素。

当线程正在执行时,并发可视化工具将收集示例。在线程视图中,在执行时间段内,您可以分析被一个或多个线程所执行的代码。还可以检测阻塞报告以及配置文件调用堆栈树执行的报表。

用法

这里有一些方法您可以使用的线程视图:

  • 确定应用程序的用户界面 (UI) 在某些执行阶段无响应的原因。

  • 确定同步、I/O、页面错误等阻塞情况所用的时间。

  • 确定来自系统中正在执行的进程的干扰程度。

  • 确定并行执行的负载平衡问题。

  • 确定伸缩性欠佳或伸缩性不存在的原因(例如,当有更多逻辑内核时,并行应用程序的性能为何不提高)。

  • 了解应用程序中并发的程度,以便为并行化提供帮助。

  • 了解执行的辅助线程与关键路径之间的依赖关系。

检查特定时间间隔和线程

线程视图显示了一个时间线。可以在时间线中缩放或平移来检查应用程序中给定的间隔和线程。在 x 轴是时间,在 y 轴是通道:

  • 每个磁盘驱动器中有两个 I/O 通道,一个通道用于读和一个通道用于写。

  • 进程中每个线程的通道。

  • 标记通道,如果跟踪中有标记事件。标记通道最初显示在发生这些事件的线程通道的下方。

  • GPU Channels(信道)

这是一个线程视图的插图:

线程视图

线程视图

最初,线程按照其创建顺序进行排序,这样使得主应用程序线程成为第一个线程。可以使用视图左上角的排序选项按照其他条件(例如根据实施最多执行工作的线程)对线程排序。

您可以通过从左侧的列中选择其名称来隐藏未执行任何工作的线程,然后单击工具栏中的**“隐藏所选线程”**按钮。建议隐藏完全阻塞线程,因为这些线程的统计数据无关且可以堵塞报表。

若要标识额外的线程为隐藏,在活动图例中,选择 分析报告 选项卡上的 每线程摘要 报告。这显示了执行的分解图,其显示了当前选定的时间间隔的线程状态。在一些缩放级别,某些线程可能无法显示。发生这种情况时,会在右方显示省略号。

当您已选择了时间间隔并且期间有某些线程时,您可开始性能分析。

分析工具。

本节描述分析报表和其他分析工具。

线程阻塞详细信息

若要获取一个线程特定区域的阻塞事件的有关信息,请将指针指在该区域上以显示工具提示。如果有一个,它包含如类别、区域开始时间,阻塞时间和阻塞 API 的信息。如果选中阻塞区域,在底部窗格及时显示堆栈,同时在工具提示中显示相同的信息。通过检查调用堆栈,可以确定线程阻塞事件的基本原因。通过选择该线段和检查当前选项卡可以查看附加进程和线程信息。

执行路径可能存在多个阻塞事件。通过阻塞类别检查这些,以便您可以迅速找到问题区域。仅仅是选择图例左侧的某个阻塞类别。

线程间的依赖

并发可视化工具可以在进程中查看线程之间的依赖关系,以便可以确定被阻塞线程要尝试做什么并了解其他线程如何使其可以执行。若要确定哪个线程解除了另一个线程的阻塞,选择相关阻塞时间段。如果并发可视化工具可以确定解除阻塞的线程,它在阻塞线程和下面阻塞阶段的执行时间段画了一条线。此外,**“取消阻塞堆栈”**选项卡显示相关的调用栈。

线程执行详细信息

在线程的时间线图,在执行代码时显示绿色时间段。可以获取有关执行时间段的详细信息。

当您在执行时间段中选择一个点时,并发可视化工具在相关调用堆栈上及时查找此点然后在执行时间段内在选择的点上面显示一个黑色插入符号并在 当前堆栈 选项卡上显示调用堆栈自身。可以在执行时间段选择多点。

说明说明

并发可视化工具可能无法在显示时间段解析选择。通常,当持续时间段小于一毫秒,则会发生这种情况。

若要在当前选定的时间跨度获取任何启用 (非隐藏) 线程的执行流程,在活动图例中选择 执行 按钮。

时间线图

时间线图显示主机上正在进行的所有线程和所有物理磁盘设备的活动。它还演示 GPU 活动和标记事件。可以放大显示详细信息或缩小显示较长的时间间隔。还可以选择关系图上的点获取有关类别、启动时间和持续时间、调用堆栈状态的详细信息。

在时间线图中,颜色指示在任何给定时间线程的状态。例如,绿色时间段表示正在执行,红色时间段表示因同步被阻塞,黄色时间段表示被抢占,紫色时间段表示参与了设备 I/O。您还可以使用此视图非常检查并行环路或并发任务中涉及的一组线程的工作平衡情况。如果线程比其他线程消耗更长的时间完成的工作,可能不平衡。您可以通过在线程间平均分布工作来使用此信息改进提高程序的性能。

如果当时只有一个线程是绿色的(正在执行),则意味着应用程序可能没有充分利用系统中的并发优势。可以使用时间线图来检查线程间的依赖关系,以及正在阻塞和被阻塞线程间的临时关系。若要重新排列线程,请选择一线程,然后在工具栏上选择按起或按下按钮。若要隐藏线程,请选择它们新然后选择 隐藏线程 按钮。

配置文件报表

在时间线图下面是时间线配置文件和有多中报告的带有选项卡的窗格。当您更改线程视图时,报表将自动更新。对于大的追踪,当更新计算时,报表窗格可能不可用。每个报表包含两个筛选器调整:降噪和仅我的代码。使用降噪筛选耗时少的调用树项。默认筛选值为 2%,但您可以将其调整为 0% 到 99% 的任意值。若要仅查看您的代码中的调用树,选择 仅我的代码 复选框。若要查看所有调用,请将其清除。

配置文件报表

此选项卡显示对应于活动图例的报表项。若要显示报表,请选择其中一项。

当前堆栈

此选项卡显示时间线图中的线程片段所选中点的调用堆栈。调用堆栈经过调整,以便仅显示与您的程序相关的活动。

取消阻塞堆栈

若要查看哪个线程解除所选线程以及在哪行代码,请选择 取消阻塞堆栈 选项卡。

执行

执行报表显示了应用程序执行期间中断的时间。

若要找到代码行执行消耗的时间调用,展开调用树,然后在调用树项的快捷菜单上,选择 查看源查看调用站点查看源 定位已执行的一行代码。查看调用站点 定位已执行的代码行调用的代码行。如果只有一个调用站点存在,其代码行将突出显示。如果有多个调用站点存在,您可以选择出现在对话框中您想的一个然后选择 转到源 按钮突出显示的调用站点的代码。这对于定位具有最多实例,最多时间或两者的调用站点的源代码非常有用。有关详细信息,请参阅执行配置文件报表

同步

同步报表显示负责同步块的调用,以及每个调用堆栈的合计阻塞时间。有关详细信息,请参阅同步时间

I/O

I/O 报表显示负责 I/O 块的调用,以及每个调用堆栈的合计阻塞时间。有关详细信息,请参阅I/O 时间(“线程”视图)

Sleep

睡眠报表显示负责睡眠块的调用,以及每个调用堆栈的合计阻塞时间。有关详细信息,请参阅睡眠时间

内存管理

内存管理报表显示发生内存管理阻塞的调用,以及每个调用堆栈的合计阻塞时间。您可以使用此信息来确定有额外的分页或垃圾回收问题的区域。有关详细信息,请参阅内存管理时间

抢占

抢占报表显示系统中抢占当前进程的进程的实例,以及当前进程被替换的独立线程。您可以使用此信息来确定对于抢占最负责的进程和线程。有关详细信息,请参阅抢占时间

UI 处理

UI 处理报表显示负责 UI 处理块的调用,以及每个调用堆栈的合计阻塞时间。有关详细信息,请参阅UI 处理时间

每线程摘要

此选项卡显示一个彩色编码关于每个线程在每个状态中(如运行、阻塞和 I/O)花费的总时间的列视图。各列的底部加有标签。当您调整时间线图中的缩放级别时,此选项卡会自动更新。在一些缩放级别,某些线程可能无法显示。发生这种情况时,会在右方显示省略号。如果希望的线程不出现,则可以隐藏其他线程。有关详细信息,请参阅“每线程摘要”报告

磁盘操作

此选项卡显示在磁盘 I/O 中代表当前进程被涉及的那些进程和线程,以及文件所涉及 (例如,加载 DLLs) 的,如读取了多少字节以及其他信息。您可以使用此报表来计算在执行过程中访问文件所用的时间,尤其是当您的进程受到 I/O 限制。有关详细信息,请参阅磁盘操作报告(线程视图)

请参见

概念

并发可视化工具