【windows + ETW】采集线程切换日志,观察进程/线程在核上的调度分布情况实践

观察进程在不同核上运行分布

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

posted @ 2022-01-26 14:34  mooooonlight  阅读(815)  评论(0编辑  收藏  举报