但是, 如果我們要開發自己的 ETW event provider, 並且有圖形化的介面可以幫助我們了解效能上的問題有現成的 tool 嗎? 有的, Microsoft Windows Performance Toolkit 中的 Event Trace 或是 xperfview 都可以幫助我們圖型化我們自製的 ETW event, 但是, 它只能提供一般性的呈現方式, 原因很簡單, 因為這些 tool 並沒有足夠的 domain knowledge 來解釋這些 event, 所以他只能以 Generic event 的方式呈現, 如此我們只能以時間分佈的單一維度來觀察我們的 event, 其實這並不方便
xperfview - Generic event 只能看到事件發生的時間點
之前曾在微軟的 Blog 看到人家發問 "xperfview 是否能夠支援擴充" 不過到目前為止的答案是否定的, 其次 xperf 因為效率的考量所以只有提供 offline 的方式來分析 ETW event, 但對於有些特定的 use case 下將會非常麻煩, 我們總想知道使用者互動下效能與操作行為的相關性, real-time 的方式分析有時候比較快速與直覺, 有鑑於此我們就自己開發了簡單的 ETW Viewer 來幫助我們做到這些事情.
首先, 我們要定義比 Generic event 在豐富那麼一點點的語意來表達更多的資訊, 並且在 Client 的整合上可以更方便快速, 所以我們選擇一個 MSDN Code Gallery 上 ETW 相關的 Project - Scenario 來做為整合的目標, Scenario 是個 ETW event provider 的實做體, 它提供了 Native 與 Managed code 的兩種實做版本, 在 event 的格式部分, 因為 Scenario ETW Format 有定義了兩個值 Category (Unicode string) 與 Size (int64) 來讓我們描述 Client 想要描述的 "量" (你可以用來描述 FPS, cache miss rate 等等自訂的語意), 使用 Scenario 可以說非常的簡單, 我們只要埋入幾個特定的 check points: Begin, Step, End 在我們想觀察的 case 中, 並且將我們自訂的數值傳遞給 Scenario 就夠了. 就像:
// C#: Generate an ETW event (when enabled by an ETW controller)
using Scenario;
...
Scenario timer = new Scenario();
timer.Begin(); // checkpoint 1
// ...
// Code that you want to time
// ..
timer.Step(size) // checkpoint 2
// ...
// Code that you want to time
// ..
timer.End(); // checkpoint 3
以上的程式為例, Scenario 就會幫我們把 3 個 checkpoint 的時間間隔量出來, 並且把我們自訂的 Size 值也跟著傳給 ETW consumer.
接下來我們的問題就是如何顯示這個收集到的 event , 我們使用了 C# 開發了一個簡單的 WinForm 程式, 這個程式包含了一個 ETW controller 跟 ETW consumer, ETW controller 有能力動態的 Enable 或 Disable 指定的 ETW event, 在配合 Scenario 的設計下當一個 ETW event 被 Disable 時我們所 monitor 的程式除了一些簡單的判斷式, 它將不會執行 ETW provider 相關的程式碼, 這樣能確保在 Disable 的狀況下只有很少的效能損失. 利用 ETW consumer 我們能即時且非同步的方式處理收到的 event, 並將其 Size 與 checkpoint 的時間顯示在 UI 的笛卡兒座標上, 這就是我們希望視覺化的部分. 此外, 這個程式也有能力將這些資訊寫進 SQLite 的 database 中, 這樣的好處是, 我們可以在將來更輕易的整合到 Auto testing 與 Build process 中. 以下就是 Real-time ETW Viewer 的 Snapshot!
ETW Realtime Scenario Viewer - timeline view
ETW Realtime Scenario Viewer - list view
Improve Debugging And Performance Tuning With ETW 是篇還蠻具體而微的文章, 對於這方面有興趣的人可以參考.