/ Windows / 194浏览

Windows 上如何查看某进程中线程在 cpu 核心的分布

背景

最近,遇到一个应用卡顿的问题,最终是由于主要计算的线程被调度到了 E 核上去了,最终换到 P 核上就好了。

| 关于 Intel 混合架构中的 P 核和 E 核,可以看:https://www.intel.com/content/www/us/en/gaming/resources/how-hybrid-design-works.html

那我要怎么来观察自己的应用线程在 CPU 上的分布情况呢?

这就需要请出我们强大的 WPT(Windows Performance Toolkit)了。

PS:之前介绍过 如何通过 WPT 来分析 Windows 启动过程

收集信息

收集信息有两种方式,一种是通过 WPR 来收集,另外也可以通过 xperf 来收集。

通过 xperf 收集

管理员权限启动终端,启动 xperf

xperf -on base+dispatcher+profile -stackwalk profile
参数解释
-on base+dispatcher+profile
-on:启动事件跟踪。
base:启用基本事件收集,包含基本的进程和线程信息。
dispatcher:启用线程调度器事件收集,记录线程的创建、结束、上下文切换等事件。这是分析线程在不同 CPU 核心上调度情况的关键。
profile:启用 CPU 采样(Profile)事件,以固定频率采样 CPU 的使用情况。此事件会记录在特定时间点上,哪个线程在哪个 CPU 核心上运行,以及其调用堆栈。这对于查看线程在各核心上的分布和性能瓶颈非常有用。

-stackwalk profile
-stackwalk:启用堆栈跟踪,以便在采样事件中记录完整的调用堆栈。
profile:指定在 profile 事件上启用堆栈跟踪。这样可以捕获到每次 CPU 采样时,线程调用堆栈的信息,以便后续分析调用路径和性能瓶颈。

然后运行你的应用,运行关键操作后,停止采样并生成 output.etl 文件

xperf -d .\Desktop\output.etl

然后在桌面上就能看到对应的文件了。

xperf 命令参考:https://learn.microsoft.com/en-us/windows-hardware/test/wpt/xperf-command-line-reference

通过 WPR 收集

WPR 通常采取 UI 的方式来收集,相对比较简单。

打开 Windows Performance Recorder ,在 More options 中勾选上 CPU usage 即可。

如下图所示

然后点击 start 即可。

然后运行你的应用,运行关键操作后,点击 Stop 即可结束录制,并保存日志。

分析数据

分析我们采用 WPA(Windows Performance Analyzer)来进行分析。

  1. 通过 WPA 打开刚才采集到的文件
  2. 双击CPU Usage(Sampled) 就可以看到 cpu 使用情况了
  3. 然后在表格左上角,选择Utilization by CPU,按 cpu 来查看使用率
  4. 在表格头上打开右击菜单,在 More Columns 中勾选 Process NameThread Id
  5. CPU 列拉到 Process NameThread Id 列后面
  6. 再筛选到你需要观察的进程,一次展开线程和 cpu,就可以看到跑在哪些 cpu 核心上面啦。

总结

WPT 中可以看到很多信息,可以多用用~

如何通过 C++ 实时监听 ETW 事件
如何通过 C++ 实时监听 ETW 事件
【译】调查并确定 Windows 运行速度变慢问题
【译】调查并确定 Windows 运行速度变慢问题
【译】丢失的 WPA 文档 —— 磁盘使用
【译】丢失的 WPA 文档 —— 磁盘使用
【译】丢失的 WPA 文档 —— CPU 调度
【译】丢失的 WPA 文档 —— CPU 调度
【译】丢失的 WPA 文档 —— CPU 采样
【译】丢失的 WPA 文档 —— CPU 采样
如何通过 PDH(Performance Data Helper) 获取性能计数器的值

0

  1. This post has no comment yet

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注