内容提纲

• 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. 【JAVA】通过HttpClient发送HTTP请求的方法

    HttpClient介绍 HttpClient 不是一个浏览器.它是一个客户端的 HTTP 通信实现库.HttpClient的目标是发 送和接收HTTP 报文.HttpClient不会去缓存内容,执行 ...

  2. 简单DP(51nod 1092)

    题目:回文字符串 思路:找准状态以及决策,就可以了: 形如:E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最长公共子序列) 变形即可: dp ...

  3. 中国排名前100的IT公司 (转)

    排序 单位名称 软件收入 1 华为技术有限公司 622360  2 中兴通讯股份有限公司 601331  3 海信集团有限公司 448641  4 UT斯达康通讯有限公司 386763  5 海尔集团 ...

  4. Mysql --分区表(1)

    检查是否支持分区 通过如下命令检查的Mysql是否支持partition mysql> SHOW PLUGINS; ... | ARCHIVE | ACTIVE | STORAGE ENGINE ...

  5. 如何使用grunt工具

    本文来源于同事的笔记,也是在网上查找的资料,记录分析的特别详细,对初学者来说简直不能再通俗易懂了,感谢原作者! 1.前言 选择Grunt原因 管理我们的文件依赖 随心所欲的批处理任务 整合常用的前端工 ...

  6. emum类(2)

    emum定义如下: public abstract class Enum<E extends Enum<E>>extends Objectimplements Comparab ...

  7. Dynamic CRM 2013学习笔记(十一)利用Javascript实现子表合计(汇总,求和)功能

    我们经常有这样一种需求,子表里新加或修改一数值后,要马上在主表里把它们的和显示在主表上.如果用插件来实现,可以实现求和,但页面上还要刷新一下才能显示正确.这时就考虑到用JS来实现这一功能,并自动刷新页 ...

  8. 创建 kylin Module/Cube

    1. 首先要创建 Project 2. 再把Hive 表加载进来: 3. 创建model 3.1. 首先选择或者创建一个project   3.2.创建一个新modle   3.3. 选择数据库   ...

  9. C#设计模式(10)——组合模式(Composite Pattern)

    一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象 ...

  10. python os&shutil 文件操作

    python os&shutil 文件操作 # os 模块 os.sep 可以取代操作系统特定的路径分隔符.windows下为 '\\' os.name 字符串指示你正在使用的平台.比如对于W ...