Share via


檢視 Application Insights Profiler 資料

假設您正在執行 Web 效能測試。 您將需要利用追蹤來了解 Web 應用程式在負載下的執行情形。 在本文中,您將:

  • 啟動 Web 效能測試或啟動 Profiler 隨選工作階段,以產生 Web 應用程式的流量。
  • 在負載測試或 Profiler 工作階段之後檢視 Profiler 追蹤。
  • 了解如何讀取 Profiler 效能資料和呼叫堆疊。

為您的 Azure 服務產生流量

若要讓 Profiler 上傳追蹤,服務必須主動處理要求。

如果您剛啟用 Profiler,請使用 Azure 負載測試執行簡短的負載測試

如果您的 Azure 服務已經有傳入流量,或您只想要手動產生流量,則請略過負載測試,並啟動隨選 Profiler 工作階段

  1. 從 Azure 服務的 Application Insights 概觀頁面中,從左側功能表中選取 [效能]

  2. 在 [效能] 窗格上,從 Profiler 設定的頂端功能表中選取 [Profiler]

    Screenshot of the Profiler button from the Performance pane.

  3. 載入 Profiler 設定頁面之後,請選取 [立即分析]

    Screenshot of Profiler page features and settings.

檢視追蹤

  1. Profiler 工作階段完成執行之後,請返回 [效能] 窗格。

  2. 在 [鑽研至...] 下,選取 [Profiler 追蹤] 以檢視追蹤。

    Screenshot of trace explorer page.

追蹤總管會顯示下列資訊:

篩選 描述
設定檔樹狀結構與 Flame Graph 以樹狀結構或圖形形式檢視追蹤。
最忙碌路徑 選取以開啟最大的分葉節點。 在大部分情況下,這個節點會接近效能瓶頸。
架構相依性 選取以檢視與追蹤相關聯的每個已追蹤架構相依性。
隱藏事件 輸入字串,以從追蹤檢視中隱藏。 選取 [建議的事件] 以取得建議。
Event 事件或函數名稱。 樹狀結構會混合顯示程式碼和發生的事件,例如 SQL 和 HTTP 事件。 最上層事件代表要求整體的持續時間。
模組 發生已追蹤事件或函式的模組。
執行緒時間 作業開始和作業結束之間的時間間隔。
時間軸 顯示函式或事件相對於其他函式的執行時間。

如何讀取效能資料

Profiler 會合併使用取樣方法和檢測功能,來分析應用程式的效能。 執行詳細集合時,Profiler:

  • 取樣每一部機器 CPU 每毫秒的指令指標。
    • 每次取樣都會擷取執行緒的完整呼叫堆疊,以便獲得高低兩個抽象層的詳細資訊。
  • 收集事件以追蹤活動相互關聯和因果關係,包括:
    • 內容切換事件
    • 工作平行程式庫 (TPL) 事件
    • 執行緒集區事件

時間表檢視中所顯示的呼叫堆疊是取樣和檢測的結果。 因為每次取樣時都會擷取執行緒的完整呼叫堆疊,所以其中會包括來自 Microsoft .NET Framework 和您參考的其他其他架構之中的程式碼。

物件配置 (clr!JIT_New 或 clr!JIT_Newarr1)

clr!JIT_Newclr!JIT_Newarr1 是 .NET Framework 內的 Helper 函式,可從受控堆積配置記憶體。

  • 配置物件時,系統會叫用 clr!JIT_New
  • 配置物件陣列時,系統會叫用 clr!JIT_Newarr1

這兩個函式通常會快速運作。 如果 clr!JIT_Newclr!JIT_Newarr1 在您的時間軸中耗費一些時間,則程式碼可能配置許多物件,而且耗用大量的記憶體。

載入程式碼 (clr!ThePreStub)

clr!ThePreStub 是 .NET Framework 中可準備程式碼以進行初始執行的協助程式函式,而這通常包括 Just-In-Time (JIT) 編譯。 針對每個 C# 方法,在流程期間,最多只應該叫用 clr!ThePreStub 一次。

如果 clr!ThePreStub 針對某個要求耗用額外時間,則其為第一個執行該方法的要求。 .NET Framework 執行階段需要大量時間來載入第一種方法。 考量:

  • 先使用熱身流程來執行該部分的程式碼,再讓使用者存取該程式碼。
  • 在組件上執行原生映像產生器 (ngen.exe)。

鎖定爭用 (clr!JITutil_MonContention 或 clr!JITutil_MonEnterWorker)

clr!JITutil_MonContentionclr!JITutil_MonEnterWorker 指出目前的執行緒正在等候鎖定被釋放。 當您執行下列動作時,通常會顯示此文字:

  • 執行 C# LOCK 陳述式、
  • 叫用 Monitor.Enter 方法,或
  • 使用 MethodImplOptions.Synchronized 屬性來叫用方法。

鎖定爭用常發生在執行緒 A 已取得鎖定,但執行緒 B 在執行緒 A 釋放鎖定之前就嘗試取得同一鎖定的情況下。

載入程式碼 ([COLD])

如果 .NET Framework 執行階段第一次執行未最佳化的程式碼,則方法名稱將會包含 [COLD]

mscorlib.ni![COLD]System.Reflection.CustomAttribute.IsDefined

針對每種方法,在流程期間,最多只應該顯示此名稱一次。

如果某個要求在載入程式碼時花費相當長的時間,則該要求是起始執行方法中未最佳化部分的要求。 請考慮先使用熱身程序來執行該部分的程式碼,再讓使用者存取該程式碼。

傳送 HTTP 要求

HttpClient.Send 之類的方法表示程式碼正在等候 HTTP 要求完成。

資料庫作業

SqlCommand.Execute 之類的方法表示程式碼正在等候資料庫作業完成。

等候 (AWAIT_TIME)

AWAIT_TIME 表示程式碼正在等候另一個工作完成。 此延遲發生在 C# 的 AWAIT 陳述式。 程式碼執行 C# AWAIT 時:

  • 執行緒會回溯,並將控制權返還給執行緒集區。
  • 沒有已封鎖的執行緒等候 AWAIT 完成。

不過,就邏輯上來說,會「封鎖」執行 AWAIT 的執行緒,以等候作業完成。 AWAIT_TIME 陳述式指出等候工作完成的封鎖時間。

如果 AWAIT_TIME 出現在架構程式碼中,而不是您的程式碼中,Profiler 可能會顯示:

  • 用來執行 AWAIT 的架構程式碼
  • 用來記錄 AWAIT 相關遙測的程式碼

您可以取消核取頁面頂端的 [架構相依性] 核取方塊來只顯示您的程式碼,讓您更輕鬆地查看 AWAIT 的來源。

封鎖時間

BLOCKED_TIME 表示程式碼正在等候另一個資源可供使用。 例如,其可能正在等候:

  • 同步物件
  • 可用的執行緒
  • 要完成的要求

非受控的非同步

為了跨執行緒追蹤非同步呼叫,.NET Framework 會發出 ETW 事件,然後在執行緒之間傳遞活動識別碼。 因為非受控 (原生) 程式碼和某些較舊的非同步程式碼樣式缺少這些事件和活動識別碼,所以 Profiler 無法追蹤執行緒以及執行緒上執行的函式。 這個項目在呼叫堆疊中標示「非受控的非同步」。 下載 ETW 檔案,以使用 PerfView 來取得更多深入解析。

CPU 時間

CPU 正忙於執行指令。

磁碟時間

應用程式正在執行磁碟作業。

網路時間

應用程式正在執行網路作業。

何時資料行

[何時] 資料行以視覺方式呈現一段時間針對節點所收集的各種 inclusive 樣本。 要求的整個範圍會分成 32 個時間貯體,其中會累積節點的內含樣本。 每個貯體都以一個長條表示。 長條的高度代表換算值。 針對下列節點,長條代表貯體期間其中一個資源的耗用量:

  • 標示 CPU_TIMEBLOCKED_TIME 的節點。
  • 與取用資源具有明顯關聯性的節點 (例如 CPU、磁碟或執行緒)。

針對這些計量,耗用多項資源,可能會取得大於 100% 的值。 例如,如果您在某個間隔期間平均使用兩個 CPU,則值會是 200%。

下一步

了解如何...