event tracing for windows 1 introduction


发布于 2020-08-15


Event Tracing for Windows简称为ETW,是windows操作系统提供的一种内核级工具用来记录内核或者应用程序自定义的事件信息,可以把事件进行实时的处理或者记录到日志文件中。它是一个高性能、低开销,灵活的日志的系统,可动态的开启关闭事件的跟踪,从而在生产环境中执行详细的跟踪而无需重新启动计算机或应用程序。

ETW分为3个主要的组件:

  1. Controller,它定义log文件的大小和保存位置,控制开启或者关闭事件跟踪会话、启用providers、获取会话的执行统计信息。会话统计信息包括使用的缓冲区数,交付的缓冲区数以及事件和丢失的缓冲区数。
  2. Provider,提供事件。Provider注册后,Controller便可以启用或禁用Provider的事件跟踪。一个程序可以同时是Controller和Provider。
  3. Consumer,使用事件。Consumer选择一个或者多个跟踪会话作为事件数据的来源。它同时从多个跟踪会话中请求事件,系统将按照时序向它分发事件。Consumer既可以从log文件中收到事件,也可以从跟踪会话中实时获取到。处理事件时,使用者可以指定开始和结束时间,只有在指定时间范围内发生的事件才会被传递。

下图显示了ETW组件之间的关系。

event tracing model

事件跟踪会话

事件跟踪会话从Controller启用的一个或多个的provider中记录事件。会话还负责管理和刷新缓冲区。Controller定义会话,通常包括指定会话和日志文件名,要使用的日志文件的类型以及用于记录事件的时间戳的解析度。

事件跟踪最多支持64个事件跟踪会话同时执行。在这些会话中,有两个特殊目的的会话。其余会话可供一般使用。这两个特殊用途的会话是:

  • Global Logger 会话,记录了在操作系统引导过程的早期发生的事件,例如由设备驱动程序生成的事件。
  • NT Kernel Logger 会话,记录由操作系统生成的预定义系统事件,例如磁盘IO或页面错误事件。

Windows Performance Recorder

Windows系统中很多工具都用到了ETW,比如大名鼎鼎的Windows Performance Recorder、Process Explorer、Process Monitor。Chromium浏览器很多地方也用到ETW,比如netlog,tracing工具等等。我们可以先用WPR抓一些事件信息,看看这个ETW到底有多强大。

运行wprui.exe,在左侧勾上一些Resource Analysis选项,比如CPU usage、Disk I/O activity。wprui.exe则根据你勾选的选项,抓取对应分类的信息。然后右侧的Logging mode选择File,这样我们记录的跟踪事件信息就会保存到文件中。

wprui

点击Start按钮开始记录事件,几秒后再点击Save按钮,把信息保存到etl文件里。记录的短短的几秒钟,就生成几百MB的记录文件。

这样我们就可以用wpa(windows performance analyzer)来打开etl文件,分析里面记录的信息,如下图所示:

wprui

可以看到,系统里所有的进程、线程、磁盘活动,都记录到了。有了这些丰富的信息,我们可以做调试、性能优化等等事情。