让我们考虑一个简单的案例——我在 Windows 上运行一个 .net5 控制台应用程序。如果我通过PerfView /threadTime collect像这里描述的那样获取跟踪,那么我可以在Thread Time Stacks选项卡中看到BLOCKED_TIME指标。我应该如何运行dotnet-trace命令以在Perfview中获得相同的指标?我尝试过使用详细程度,但到目前为止还没有运气。
问问题
50 次
1 回答
0
简而言之,你不能:(
Dotnet-trace使用在 .NET 运行时中实现的采样分析器。分析器在应用程序的单独线程中运行,并每隔几毫秒收集托管线程的调用堆栈帧。与大多数 CPU 分析器相反,它甚至为正在等待的线程收集调用堆栈。因此,通过查看调用堆栈,您可以估计托管线程的等待时间。例如,在下图中,我们可能会看到托管线程在 ManualResetEvent 上等待大约 686 毫秒。
当然,这只是一个估计值,取决于采样间隔。您还可以启用CLR ThreadPool 事件和/或TplEventSource提供程序来获取描述线程池和 TPL 内部工作的事件。
现在,对于PerfViewBLOCKED_TIME
中的指标。它基于上下文切换 ETW 事件。您可以使用 PerfView 集合对话框中的“线程时间”复选框启用它们:
当新线程开始在 CPU 上运行时,系统调度程序/调度程序会发出这些事件。它们使我们能够准确地测量线程的等待/运行时间,但它们也非常庞大。
于 2021-10-29T14:10:24.123 回答