Windows 上如何查看某进程中线程在 cpu 核心的分布
背景 最近,遇到一个应用卡顿的问题,最终是由于主要计算的线程被调度到了 E 核上去了,最终换到 P 核上就好了。 关于 Intel 混合架构中的 P 核和 E 核,可以看:https://www.intel.com/content/www/us/en/gaming/resources/how hybrid design
背景#
最近,遇到一个应用卡顿的问题,最终是由于主要计算的线程被调度到了 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)来进行分析。
-
通过 WPA 打开刚才采集到的文件

-
双击
CPU Usage(Sampled)就可以看到 cpu 使用情况了 -
然后在表格左上角,选择
Utilization by CPU,按 cpu 来查看使用率
-
在表格头上打开右击菜单,在
More Columns中勾选Process Name和Thread Id
-
将
CPU列拉到Process Name和Thread Id列后面
-
再筛选到你需要观察的进程,一次展开线程和 cpu,就可以看到跑在哪些 cpu 核心上面啦。

总结#
WPT 中可以看到很多信息,可以多用用~
还没有评论。下面留下第一条吧。