内容提纲

• 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

(ETW) Event Tracing for Windows 入门 (含pdf下载)的更多相关文章

  1. (ETW) Event Trace for Windows 提高 (含pdf下载)

    内容提纲 • 托管代码与非托管代码介绍 • 不安全代码介绍 • 用户模式与内核模式 • ETW执行流程分析 • 日志分析工具介绍:PerfView.exe   ETW与非托管代码 • ETW依赖的So ...

  2. 如何利用ETW(Event Tracing for Windows)记录日志

    ETW是Event Tracing for Windows的简称,它是Windows提供的原生的事件跟踪日志系统.由于采用内核(Kernel)层面的缓冲和日志记录机制,所以ETW提供了一种非常高效的事 ...

  3. Event Tracing For Windows

    https://blogs.msdn.microsoft.com/oanapl/2009/08/04/etw-event-tracing-for-windows-what-it-is-and-usef ...

  4. Docker for windows 入门一(下载安装)

    预安装条件,可以查阅官方文档,本人是Win10 x64(必要条件)教育版+开启Hyper-V(Feature特性),具体可参考云栖社区的文章: https://yq.aliyun.com/articl ...

  5. 使用PerfView监测.NET程序性能(一):Event Trace for Windows

    前言: 在日常项目开发中,我们时不时会遇到程序占用了很高CPU的情况,可能是程序里某些未经优化的代码或者Bug,或者是程序运行压力太大.无论是什么原因,我们总希望能看到到底是哪个方法占用了如此高的CP ...

  6. Delphi:程序自己删除自己,适用于任何windows版本(含源码)

    Delphi:程序自己删除自己,适用于任何windows版本(含源码) function Suicide: Boolean; var   sei: TSHELLEXECUTEINFO;   szMod ...

  7. Windows 入门杂乱无章版

    windows入门 /users/username/appdata/roaming/microsoft/windows/start menu/startup目录中的应用程序是在该用户登录时启动的 /w ...

  8. Boost(1.69.0) windows入门(译)

    目录 Boost windows入门 1. 获得Boost源代码 2. Boost源代码组织 The Boost Distribution 3. 仅用头文件的库 Header-Only Librari ...

  9. HTML5从入门到精通(千锋教育)免费电子版+PDF下载

    本书是HTML5初学者极好的入门教材之一,内容通俗易懂.由浅入深.循序渐进.本书内容覆盖全面.讲解详细,其中包括标签语义化.标签使用规范.选择器类型.盒模型.标签分类.样式重置.CSS优化.Photo ...

随机推荐

  1. (Python )模块、包

    本节开始学习模块的相关知识,主要包括模块的编译,模块的搜索路径.包等知识 1.模块 如果我们直接在解释器中编写python,当我们关掉解释器后,再进去.我们之前编写的代码都丢失了.因此,我们需要将我们 ...

  2. 用js识别是否360浏览器

    360浏览器说实话比较恶,以前可以通过内核返回的字符串判定是否包含"360"字样的方法来判定 如以下代码 window.navigator.userAgent.indexOf('3 ...

  3. public <T> void show(T t),void前面的泛型T是什么作用

    public <T>这个T是个修饰符的功能,表示是个泛型方法,就像有static修饰的方法是个静态方法一样. <T> 不是返回值,表示传入参数有泛型 public static ...

  4. JS学习之DOM节点的关系属性封装、克隆节点、Dom中Style常用的一些属性等小结

    JS DOM节点: 在JS DOM中节点的关系被定义为节点的属性: 通常有以下几种节点之间的关系: (这里的关系是所有浏览器都支持的) parentNode    父节点 childNodes     ...

  5. 跟服务器交互的Web表单(form)

    使用HTML来构建可以跟服务器交互的Web表单(form),通过给你的form元素添加一个action属性来达到此目的. action属性的值指定了表单提交到服务器的地址. 例如: <form ...

  6. 拉格朗日乘子法和KKT条件

    拉格朗日乘子法(Lagrange Multiplier)和KKT(Karush-Kuhn-Tucker)条件是求解约束优化问题的重要方法,在有等式约束时使用拉格朗日乘子法,在有不等约束时使用KKT条件 ...

  7. Yaf零基础学习总结2-Yaf框架的安装

    接着上一篇文章<Yaf零基础学习总结1-Yaf框架简介>我们对Yaf框架有那么一个大概的了解了,但是对于程序员来说,那些文字都是表面的,他们最想的就是开始敲代码了.当然这也是学习Yaf框架 ...

  8. line-height,vertical-align及图片居中对齐问题根源解析

    关于图片居中对齐的问题,进入前端行业虽然有一段时间了,以为自己懂了,可是实际上还是一知半解,找了一些博客来看了一下,但是感觉讲的有点碎,看完还是一知半解. 查阅了一下<css权威指南>,结 ...

  9. vimium: 浏览器神器

    chrome firefox 都有 vimium (firefox 中为vimfx), 快捷键也差不多 下边是chrome中快捷键示意图: G = shift + g (其他同理) c+e = ctr ...

  10. EasyCriteria 3.0 发布

    EasyCriteria 3.0 发布了,这是一个全新的版本,进行了大量的重构.官方发行说明请看:http://uaihebert.com/?p=1898 EasyCriteria 是一个轻量级的框架 ...