背景
最近,遇到一个应用卡顿的问题,最终是由于主要计算的线程被调度到了 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 中可以看到很多信息,可以多用用~
0