内容提纲

• ETW 介绍

• ETW 使用

• ETW 监控本机Demo

• ETW 监控远程机器的思路

• 底层类库:EventSource 介绍

• 底层类库:TraceEvent 介绍

ETW 是什么?

1.Event Tracing for Windows (ETW):是由操作系统提供的一种通用的,系统开销较低(与性能日志和警报相比)的事件追踪手段,用以监控具有负载的系统的性能。

2.ETW主要用于必须频繁记录事件、错误、警告或审核的服务器应用程序。ETW提供用户模式的应用程序和内核模式的设备驱动程序所触发的事件追踪机制。此外,ETW还能够动态地启用或者禁用日志记录,便于进行详细的追踪,而无需重新启动操作系统或者应用程序。

ETW 的历史

1.ETW最先在Windows 2000中被引入。自那时以后,各种Windows操作系统核心和服务组件都通过ETW记录其活动,它现在是Windows平台上的关键系统仪表技术之一。在Windows 7中,ETW得到了进一步的增强。

2.正是基于ETW的优秀性能和强大功能,越来越多的第三方应用程序开始放弃自己的日志系统,逐渐开始使用ETW来追踪和记录其状态和活动,从而进行性能调优或者是进行应用程序的日常维护。

为什么要用事件追踪日志?

目前的软件系统变得日益庞大和复杂,大量组合和工作负载特征的不断变化也增加了各种软件故障诊断的难度,软件的开发和管理随之成为一项艰巨的挑战。应用程序事件追踪日志在此方面尤为重要。

v针对某些关键的错误状态添加的智能检测手段可以极大地缩短故障的定位、调试、分析时间;

v对于不易重现的问题提供数据依据;

v有助于解决性能问题,发现开发阶段未预见到的瓶颈;

v可以使用各种管理工具从事件跟踪日志中得出统计数据,以用于容量规划和趋势分析。

ETW 的优势

v 提供程序与跟踪会话相分离,应用程序的故障(发生崩溃或挂起)不会对跟踪造成影响。

v 能够动态地启用和禁用日志记录,轻松地在实际生产环境下进行详细跟踪,而无需重新启动系统或重新启动应用程序。

v 在关闭事件跟踪时间几乎不消耗系统资源;对比其他事件追踪技术,其性能优势明显.

v 可自定义消息格式,便于扩展;而且自定义格式有助于日志数据的保密。

v 日志记录机制使用每处理器的缓冲区,由异步写线程将这些缓冲区写入磁盘。这样,大型服务器应用程序在写入事件时所受的干扰能够降至最小。

v ETW 使用内核中实现的缓冲和日志记录机制,提供对用户模式应用程序和内核模式设备驱动程序引发的事件的跟踪机制。

v 收集事件的时间戳的时钟分辨率可精确到100 ns;系统可提供 10 ms;100 ns;处理器时钟周期三种方式。

v ETW自Windows 2000引入操作系统, 在 Windows Vista™ 之后引入了统一的事件提供程序模型和 API。提供了一种一致的、简单易用的机制。

ETW系统构成

整个ETW系统由Provider,Customer和Controller三个部分构成:

• Provider

   所谓的Provider,就是事件的提供者,它可以是系统组件,驱动程序或者是我们开发的应用程序。首先,它需要向系统进行注册一个Event Trace,然后当这个Provider被Controller启动(Enable)后,它就可以开始向相应的Event Trace Session发送事件了。

• Controller

顾名思义,Controller就是一个控制器。它的主要任务有两个:一是Event Trace Session的控制管理。它利用StartTrace在内存中创建一个Event Trace session,这样Provider就知道该往哪里发生事件。而Controller也会负责将Session里记录的事件送到Consumer。Controller的第二个任务就是对Provider进行管理,启动或是停止Provider。为了避免额外的开销,Provider不会一直都在工作,只有当被Enable的时候,才开始工作。

• Consumer

   Consumer实时地从Event Trace Session或者是日志文件中订阅事件。Consumer主要的作用是提供Event Trace Callback。我们可以设计一个通用的callback来处理所有的事件,也可以为特定的我们感兴趣的事件设计callback。对于通用事件的callback,我们可以在OpenTrace的时候通过参数指定,而对于特定时间的callback,则可以通过SetTraceCallback指定。

解析ETW生成的文件

• ETW最后生成一个.etl文件(可以理解为一个压缩文件),然后再来分析这个文件,转换为普通人可以看明白的信息,来判断哪里出了问题。

• PerfView.exe,是专门分析ETW信息的性能分析工具,可以用来解析etl文件。

• 也可以自行编写程序解析etl文件,并生成相应格式的日志记录,例如:xml文件。

ETW 监控本机 Demo

此Demo至少要由三部分组成:

• 一个待监控的应用程序(数据提供者,可以是一个WinForm程序)

•  一个控制事件跟踪会话的控制程序(Controler,可以是一个WinForm程序)

• 用于解析生成的etl文件的程序(阅读器,可以是一个WinForm程序)

ETW 监控远程机器的思路

此方案由四部分组成:

• 远程机器上:待监控的的应用程序(Provider角色,例如:一个Web站点)

• 远程机器上:控制事件跟踪会话的控制程序(Controler角色,例如:一个Windows服务,WCF寄宿在内)

• 本地机器上:遥控Controler的程序(可以是任意程序,只要能用来调用WCF即可)。

• 用于解析生成的etl文件的程序(阅读器)

底层类库:EventSource 介绍

• 刚才的Demo中,是如何把数据写入etl文件中的?实际上是通过EventSource类库。

• 为什么要用它?因为不用它, 写起来就会很复杂。

Vance Morrison: When you log events to an ETW event stream, in ETW parlance, you are creating a ETW Event Provider.    Sadly, historically creating a ETW event provider has been a non-trivial task, which writing an XML 'Schema manifest' and  using a specialized tool (MC.exe) to generate source code to link into your application.   You also need to register the provider using another obscure tool (WEVTUTIL) when your application was deployed.    This discouraged most users from ever building their own ETW providers, which is a shame because it is a powerful feature of ETW.

底层类库:EventSource 进化史

• 最初1.0版本由Vance Morrison发布在msdn个人blog上
Introduction Tutorial: Logging ETW events in C#: system.Diagnostics.Tracing.EventSource  
http://blogs.msdn.com/b/vancem/archive/2012/07/09/logging-your-own-etw-events-in-c-system-diagnostics-tracing-eventsource.aspx

• 后来,EventSource被发布到Nuget.org上,之后Nuget版本就一直在更新,最新版本为: Microsoft EventSource Library 1.1.25
http://www.nuget.org/packages/Microsoft.Diagnostics.Tracing.EventSource/

• .Net 4.5中已将EventSource收入在类库System.Diagnostics.Tracing.EventSource中,但在.Net 3.5下,还是一个独立的类库。
To fix this, we have added the System.Diagnostics.Tracing.EventSource type to  Version V4.5 of the .NET Runtime (Now available for download, as a release candidate.  It will officially ship later in 2012).   It makes writing ETW provider as simple as writing just a few lines of code.    In this blog entry I will demonstrate just how easy it is to log your own events to the ETW data stream and thus make the OS ETW data EVEN MORE USEFUL by correlating it with what you are doing in your code.

EventSource 具体作用

• 待监控的系统,要创建一个类,作为EventSource的子类,并用这个类做为数据提供程序Provider注册到ETW中,并订阅ETW事件,与一个callback函数绑定。

• 当ETW Session启动,并启动或停止这个Provider时,ETW就会激发事件,这个Provider的callback函数就会被激发,用来更新当前是否可以写日志的bool状态,true可以写,false不可以写。系统判断为False时,立即离开,就不再浪费资源来记日志了。

底层类库:TraceEvent 介绍

• 刚才的Demo中,是如何启动或停止一个ETW Session的呢?是如何把Session与Provider绑定在一起的呢?实际上就是通过TraceEvent类库实现的。

底层类库:TraceEvent 进化史

• 首先,新版本由Vance Morrison发布在codeplex上: New version of TraceEvent / PerfMonitor Posted to bcl.codeplex.com
http://blogs.msdn.com/b/vancem/archive/2013/01/07/new-version-of-traceevent-perfmonitor-posted-to-bcl-codeplex-com.aspx

• 后来,TraceEvent被发布到Nuget.org上,之后codeplex就不再更新了,Nuget版本就一直在更新,最新版本为: Microsoft TraceEvent Library 1.0.32
https://www.nuget.org/packages/Microsoft.Diagnostics.Tracing.TraceEvent/

• TraceEvent并未收录在.Net 4.5的类库System.Diagnostics.Tracing中,仍是独立的组件。

SourceEvent和TraceEvent的底层

• SourceEvent和TraceEvent的底层类库是非托管的advapi32.dll,最终是由这个类库完成实际工作。

•  advapi32.dll 全称是:Advanced Windows 32 Base API DLL,它是一个高级API应用程序接口服务库的一部分,包含的函数与对象的安全性,注册表的操控以及事件日志有关。

• 一般位于C:\WINDOWS\system32\目录下,大小659KB。

资源链接

• http://bcl.codeplex.com/SourceControl/list/changesets

• https://www.nuget.org/packages/Microsoft.Diagnostics.Tracing.TraceEvent/

• http://www.nuget.org/packages/Microsoft.Diagnostics.Tracing.EventSource/

• http://blogs.msdn.com/b/vancem/archive/2012/07/09/logging-your-own-etw-events-in-c-system-diagnostics-tracing-eventsource.aspx

• http://blogs.msdn.com/b/vancem/archive/2012/08/13/windows-high-speed-logging-etw-in-c-net-using-system-diagnostics-tracing-eventsource.aspx

• http://blogs.msdn.com/b/vancem/archive/2012/12/20/and-end-to-end-etw-tracing-example-eventsource-and-traceevent.aspx

• http://blogs.msdn.com/b/vancem/archive/2013/01/07/new-version-of-traceevent-perfmonitor-posted-to-bcl-codeplex-com.aspx

• http://blogs.msdn.com/b/vancem/archive/2015/05/11/version-1-1-24-of-the-eventsource-nuget-package-marked-as-stable.aspx

• http://blogs.msdn.com/b/vancem/archive/2014/03/15/walk-through-getting-started-with-etw-traceevent-nuget-samples-package.aspx

• http://blogs.msdn.com/b/vancem/archive/2013/03/09/using-traceevent-to-mine-information-in-os-registered-etw-providers.aspx

• http://blogs.msdn.com/b/vancem/archive/2013/08/10/the-eventsource-nuget-package-and-support-for-the-windows-event-log-channel-support.aspx

• http://blogs.msdn.com/b/vancem/archive/2013/08/15/traceevent-etw-library-published-as-a-nuget-package.aspx

附件:点此下载pdf

05-02 15:56