如何使用 dotnet-trace 获取 BLOCKED_TIME 指标

How to get BLOCKED_TIME metric with dotnet-trace

让我们考虑一个简单的案例 - 我正在 运行在 Windows 上安装一个 .net5 控制台应用程序。如果我像 here 中描述的那样通过 PerfView /threadTime collect 获取跟踪,那么我会在 BLOCKED_TIME 中看到指标=14=]线程时间堆栈 选项卡。我应该如何 运行 dotnet-trace 命令在 Perfview 中获得相同的指标?我试过使用冗长级别,但到目前为止运气不好。

简而言之,你不能:(

Dotnet-trace 使用在 .NET 运行时中实现的采样分析器。探查器在应用程序的单独线程中运行,每隔几毫秒收集一次托管线程的调用堆栈帧。与大多数 CPU 分析器相反,它甚至为正在等待的线程收集调用堆栈。因此,通过查看调用堆栈,您可以估计托管线程的等待时间。例如,在下图中,我们可能会看到一个托管线程在 ManualResetEvent 上等待大约 686 毫秒。

当然,这只是一个估计值,取决于采样间隔。您还可以启用 CLR ThreadPool events and/or the TplEventSource 提供程序来获取描述线程池和 TPL 内部工作的事件。

现在,对于 PerfView 中的 BLOCKED_TIME 指标。它基于 Context Switch ETW events。您可以使用 PerfView 集合对话框中的 'Thread Time' 复选框启用它们:

当新线程在 CPU 上启动 运行 时,系统 scheduler/dispatcher 会发出这些事件。它们使我们能够准确地测量线程的 waiting/running 时间,但它们也非常庞大。