內容提綱
• 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