观察进程在不同核上运行分布
windows线程切换在内核的ETW跟踪中可以找到,provider名字为Windows Kernel Trace
,默认会有一个名为NT Kernel Logger
日志收集器采集这部分数据, 我们也可以重新创建一个日志收集器用于采集内核ETW事件。具体见下文。
本次实践目的主要为了探索ADL平台大小核线程调度情况,所以需要能够有一种简单的方法,抓取线程切换日志,然后方便地观察到进程、线程在不同核上的调度分布,甚至进一步地,可以观察线程的详细调度情况,用于深度定位。
最小化抓取日志
通过xperf -providers kg
可以看到,内置的日志抓取模式,都包含了除线程之外的其他信息,如磁盘、内存等等,这样抓不到一会就会出现一个巨大的etl文件,给使用带来不便。调研发现只抓取进程、线程在核上的调度轨迹,只需要PROC_THREAD
+ CSWITCH
即可满足,因此我们需要自定义抓取模式(具体脚本见附件):
xperf.exe -start "Circular Kernel Context Logger" -on PROC_THREAD+CSWITCH -buffersize 1024 -minbuffers 300 -maxbuffers 300 -buffering
实测本机100s产生300M的etl文件,相对可以观察较长时间的日志了。
观察调度轨迹
在WPA的现有视图中,Timeline by CPU
是比较符合我们要求的,只不过它展示的是CPU核上的进程切换情况。
而我们需要的单个进程在多个核上的调度情况,因此我们来自定义修改一下这个图,将New Process
放到第一列,CPU
放到第二列,把我们需要的CPU Usage
等设置为可见,过滤为我们想要观察的某个进程后,就得到了如下的图:
导出这个配置文件(以wpafile后缀结尾),后续分析可以用该自定义配置文件直接打开。
观察详细轨迹
通过调研xperf工具,它天然支持将etl文件导出为可读的、格式化的csv文件:
xperf -i .\UIForETWkernel3.etl -o out.csv
如图所示,每条线程的切换详细情况都在表中可以找到:
至此,我们可以最小化抓取线程切换日志,并且观察线程在不同核上的调度分布,还能看到详细日志,基本大功告成!
参考资料
MSDN官方资料
xperf命令行指导
CPU线程切换概念、问题分析方法和案例
randomascii的个人博客(google工程师,超多有价值ETW内容)
UiForETW工具介绍
CPU Usage(Prisice)参数释义
0CCh 的个人博客
XPerfHelper工具的介绍,可视化定制xperf采集脚本
Mozilla的个人博客
ETW相关providers、prifile的查询方法介绍,很详细
参考工具
xperf
导出详细数据到表格
xperf -i .\UIForETWkernel3.etl -o out.csv
打印内置的内核组
Xperf -providers kg
打印内核标记
Xperf -providers kf
UI for ETW
可以通过该工具源码看到xperf的使用实践,代码地址
perfview工具
对etl文件进行解析,参考这篇介绍
xperfhelper
Microsoft Message Analyzer
具体用法略
采集脚本:
https://files.cnblogs.com/files/mooooonlight/cswitch.zip?t=1653124202