线程在并发可视化工具中查看时间线报告

本文提供有关并发可视化工具“线程”视图中的时间线报告的信息。

执行时间(线程视图)

线程视图时间线中的这些段表示执行时间,当线程在系统中的逻辑核心上主动执行工作时。

通过内核上下文切换事件检测线程状态更改。 Windows 事件跟踪(ETW)每毫秒捕获一次示例堆栈。 在一个非常短的绿色区域中,可能不会采用任何样本。 因此,某些短执行段可能不会显示调用堆栈。

单击执行段时,并发可视化工具将显示离单击位置最近的示例堆栈。 该示例堆栈的位置由时间线上方的黑色箭头或脱字符指示,并显示在“当前”选项卡上。

若要查看当前视图中所有执行段的传统采样配置文件,请单击“可见时间线配置文件中的 执行 ”。

I/O 时间(线程视图)

时间线中的这些段与分类为 I/O 的阻塞时间相关联。 这意味着线程正在等待 I/O操作完成。 该线程可能在 API 中被阻塞,或者因为 I/O 相关的内核等待而被并发可视化工具(Concurrency Visualizer)计为 I/O。 API,例如 CreateFile()ReadFile()WSARecv() 属于此组。

内存管理时间

时间线中的这些段与分类为内存管理的阻塞时间相关联。 该场景意味着一个线程因与内存管理操作(如分页)相关的事件而被阻塞。 在此期间,线程被阻塞在一个并发可视化工具将其视作内存管理的 API 或内核状态中。 其中包括分页和内存分配等事件。

检查关联的调用堆栈和分析报告,以更好地了解被归类为内存管理的块的根本原因。

抢占时间

时间线中的这些段与分类为抢占的阻塞时间相关联。 此类别意味着由于以下原因之一,线程被切换出去:

  • 计划程序使用更高的优先级线程替换了它。

  • 线程的执行量子已过期,其他线程已准备好执行。

    在此期间,因内核等待原因导致线程被阻止,并且此情况在并发可视化工具中被计数为抢占。 抢占段在线程从逻辑核心推送出来时开始,并在该线程恢复执行时结束。

    抢占段的工具提示显示导致抢占的进程或线程的名称。 但是,这并不意味着接管的进程或线程实际上在整个抢占期运行。

睡眠时间

时间线中的这些段与归类为睡眠的阻塞时间相关联。 睡眠类别意味着线程已自愿放弃其逻辑核心,并且未执行任何工作。 在此期间,一个线程在并发可视化工具认为是“睡眠”的 API 中被阻塞。 例如 Sleep()SwitchToThread() 属于此组的 API。

同步时间

时间线中的这些段与分类为同步的阻塞时间相关联。 当线程在同步时标记为被阻止时,其中一项是隐含的:

  • 线程的执行可能导致调用已知的线程同步 API,例如 EnterCriticalSection()WaitForSingleObject()

  • API 匹配算法不能完全全面,因此某些可以映射到其他类别的 API 也可能显示为同步,因为调用堆栈中的帧最终达到了映射到此类别的基础内核阻塞基元。

    若要了解线程阻塞事件的根本原因,请仔细检查阻塞调用堆栈和配置文件报告。

UI 处理时间

时间线中的这些片段与被归类为 UI 处理的阻塞时间相关联。 这意味着线程正在泵送 Windows 消息或执行其他用户界面(UI)工作。 在此期间,一条线程在一个被并发可视化工具统计为UI处理的API中被阻塞。 例如 GetMessage()MsgWaitForMultipleObjects() 属于此组的 API。

如果未识别预定义的阻止 API,请查看调用堆栈和配置文件报告以确定延迟的根本原因。

UI 处理类别可帮助你了解 GUI 应用程序的响应能力,在依赖于 UI 响应能力的应用程序中是可取的。 例如,如果应用程序中的 UI 线程在 UI 处理的时间达到了 100%,则表明该应用程序可能具备较高的响应能力。 但是,如果 UI 线程在其他类别中花费了大量时间,请查找根本原因,并考虑用于减少该线程上的非 UI 类别的选项。