wpt

WPT 简介

Posted by sssa2000 on 2017-04-20

工作多年,有很大一部分时间是在和性能做斗争。比较幸运的是Windows操作系统中能用的手段还算是比较多,从开发环境自带的到硬件厂商提供的,或者是开源社区提供的,五花八门各显神通,最近比较深入的接触了一下Windows提供的 WPT 后,觉得用处还蛮大的。

概念

  • Event Tracing for Windows ,ETW 。ETW 是 windows 系统内置的 高速的事件记录机制,ETW 允许 Windows 和应用程序有效地生成事件。可以在任意时间启用和禁用事件,无需重新启动系统或进程。正是由于底层有完善的etw的支撑,才有了上层完善的工具链。
  • Windows Performance Toolkit ,WPT。是一组工具集,你可以在 Windows ADK 或者 Windows SDK 中找到它。后面提到的WPR、WPA、GPUView 都是这个工具集的一部分。

  • Windows Performance Recorder,简称 WPR 。带有GUI,这是用来记录性能数据的工具,会生成etl文件,供wpa打开。可以认为是带有GUI的xperf。

  • Windows Performance Analyzer,WPA 。是一个可视化的数据呈现工具。
  • xperf 。 WPT中包含的命令行工具,用来记录性能数据。但是犹豫命令行参数比较复杂,通常会用GUI工具替代。
  • UIforETW 。 google提供的开源的工具,可以认为是 WPR 的更强大的扩展。 UIforETW 提供了更有用的计数器,也提供了更友好的GUI 。https://github.com/google/UIforETW/releases
    • UIforETW 提供了 etw文件压缩的功能
    • 提供了 ring buffer的记录的方式
    • UIforETW 会记录所有的输入事件,这个对于排查游戏卡顿有极大的价值
    • UIforETW 会以更加友好的方式来组织用到的pdb,按照etw文件来组织pdb,更有利于多个版本的pdb共存
    • UIforETW 能监控某个进程的workingset、监测电脑电池的情况、cpu的频率变化、heap tracing……

能做什么

所有能做的事情都是托ETW的福,ETW 能够让我们获取到系统整体的性能状态,还能够自定义事件记录下来。 ETW 能让我们从系统全局的角度来审视,在某一时刻,系统中所有的进程都在干什么。 像一般的获取某个线程的函数调用栈什么的是很普通的功能,还有一些对游戏开发很有帮助的数据,例如:

  • 硬盘的磁头移动的距离。看到这个我想起了多年前为了加速VFS的访问效率做过的那些实验…
  • 任意时刻 UI线程是否处在被阻塞的状态。
  • 任意时刻 GPU的负载
  • 任意时刻 虚拟内存、物理内存、页面错误的情况
  • 任意时刻 CPU idle的情况,线程等待的情况

把这些数据用时间线统一组织起来,对于排查性能问题来说简直是太方便了,尤其是排查卡顿、延迟类的性能问题,这类问题的线索通常无法直接在本进程找到,需要从其他地方找到线索。例如,在没有ETW的时候,你发现某个线程卡住了,你只能去猜测一个原因,然后做实验去验证猜测。有了ETW以后,你可以清楚的看到某个线程的等待是在等待其他线程还是等待IO……