標籤:
內容提綱• 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下載)