The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

使用超高效率的 NTrace 套件追蹤 .NET 程式執行效能與除錯

上週我親自跑去基隆處理一個程式問題,由於當場的環境缺乏檢測工具,且我們之前的程式 ( Windows 服務 ) 並沒有寫很多追蹤(Trace)的程式碼,只有將一些摘要資訊寫入 EventLog,導致在當場花了許多時間,而且最後還是沒有抓出問題,白白浪費了一個下午。

由於程式不是我寫的,回來之後開始狂 K 原始碼,試圖查出問題的所在,感覺已經查到問題,但我這邊因為缺乏客戶的執行環境,所以有還是有許多數據必須在客戶端當場才收集的到。

到時如果我將一大堆除錯資訊送進 EventLog 將會對系統造成一些效能上的負擔,因此我需要尋找另一個更完美的解決方案,沒錯,我找到了,就是 NTrace ( High Performance Tracing for .NET Applications )

NTrace 是一套 100% 用 C# 寫成的函示庫,且目前只能套用在 C# 的��案用,最大的特色在於 NTrace 使用 Event Tracing for Windows (ETW) 技術紀錄各種事件追蹤。

ETW 是一個在作業系統核心層級(Kernel-level)的服務,通常用於驅動程式開發的領域,因為大多數驅動程式會在 Kernel-level 執行,除了追蹤除錯不易之外,效能也是另一個考量,所以可想見 ETW 絕對是個超高效能的事件追蹤工具,我想唯一的缺點應該是他比較不容易上手吧,一般人看到「驅動程式開發」就會怕了。

NTrace / ETW 大致的運作原理如下:

  • 透過 NTrace 函示庫將欲紀錄的事件/除錯/追蹤資訊傳送到 ETW 服務
  • 當你有建立 ETW 的 Tracing Session ( Log Session ) 時,就可以從 ETW 服務收到追蹤紀錄資訊
  • 當你未建立 ETW 的 Tracing Session 時,這個傳送到 ETW 服務的資訊就會自動被忽略

由於透過 ETW 的 API 將紀錄資訊寫入 ETW 服務的效能極高,所以這些寫入 ETW Log 的指令碼「幾乎」不會對原有程式造成任何效能上的負擔,所以你可以將所有可提供除錯的資訊通通傳到 ETW 服務中,當需要偵測/追蹤錯誤時,只要透過 Windows Server 2003 DDK 提供的追蹤工具 ( traceview.exe / tracelog.exe ) 就可以隨時追蹤程式執行的相關資訊。

你在安裝 Windows Server 2003 DDK 時,只要需要選取 Software Tracing Tools 即可 ( 如下圖 ),安裝好的工具會擺在 D:\WINDDK\3790.1830\tools\tracing\i386 目錄下:

Microsoft Windows Driver Development Kit

雖然從 .Net Framework 3.5 開始在 System.Diagnostics.Eventing 命名空間中有新增一項 EventProviderTraceListener 類別,不過該類別只能在 Windows Vista 以上的機器使用,所以使用上還是會有些相容性的問題。

但事實上 ETW 服務從 Windows 2000 就已經有了,NTrace 是直接使用 ETW API 進行操作,所以使用上相容性非常高。

若要上手 NTrace 建議可以先從 下載區Using ETW Tracing in your Application.pdf  文件開始,這份文件有更詳細的說明與使用 NTrace 執行效能比較高的測試數據。

我今天測試在 ASP.NET Web Application 專案中還無法使用 NTrace,但我相信過不了多久就會釋出更新版,到時 NTrace 應該會提供 ASP.NET 的 Visual Studio 專案範本(Project Template)。

最後,透過 ETW 追蹤工具 ( traceview.exe / tracelog.exe ) 取得的紀錄檔 ( *.etl ),也可以透過 Log Parser 進行統計分析,所以使用上的彈性也挺高的。若要透過更加視覺化的介面進行查看紀錄,也有個ETViewer - An easy to use ETW / WPP trace viewer 工具可用。

相關連結