並行視覺化檢視中的執行緒檢視
[執行緒] 檢視是並行視覺化檢視中最詳細且功能豐富的檢視。 在 [執行緒] 檢視中,您可以識別哪些執行緒正在執行區段期間執行程式碼,並分析執行緒是在執行中,還是因為同步處理、I/O 或其他原因而封鎖。 [執行緒] 檢視報表也會分析呼叫堆疊樹狀結構執行和解除封鎖執行緒。
當執行緒正在執行時,並行視覺化檢視會收集範例。 當執行緒停止執行時,視覺化檢視會檢查該執行緒的所有作業系統環境切換事件。 發生環境切換可能是因為:
- 同步處理原始物件封鎖執行緒。
- 執行緒配量期間已過。
- 執行緒產生封鎖 I/O 要求。
並行視覺化檢視會分類執行緒與環境切換事件,並搜尋已知封鎖 API 的執行緒呼叫堆疊。 它會在 [執行緒] 檢視左下方的作用中圖例中顯示執行緒分類。 在大部分情況下,您可以檢查對應到內容切換事件的呼叫堆疊,來識別封鎖事件的根本原因。
如果沒有任何呼叫堆疊符合,並行視覺化檢視會使用 Windows 所提供的等候原因。 不過,Windows 分類可能依據實作詳細資料而定,並不一定能反映使用者意圖。 例如,Windows 會將原生輕型 Reader-Writer 鎖定的封鎖等候原因報告為 I/O,而不是同步處理。
[執行緒] 檢視也會顯示執行緒之間的相依性。 例如,如果您識別在同步處理物件上封鎖的執行緒,則可以找到將其解除封鎖的執行緒。 當解除封鎖執行緒解除封鎖另一個執行緒時,您可以檢查解除封鎖執行緒的呼叫堆疊。
您可以使用 [執行緒] 檢視來:
- 識別應用程式的使用者介面 (UI) 在某些執行階段沒有回應的原因。
- 判斷花費在封鎖同步處理、I/O、分頁錯誤和其他事件的時間量。
- 探索受到系統上其他執行中處理序的干擾程度。
- 識別平行執行的負載平衡問題。
- 尋找延展性較差或不存在的原因。 比方說,為什麼當多個邏輯核心可供使用時,平行應用程式的效能無法改善。
- 了解應用程式中的並行程度以協助平行處理。
- 識別在背景工作執行緒與執行的關鍵路徑之間的相依性。
使用 [執行緒] 檢視
若要啟動並行視覺化檢視,請選取 [分析]>[並行視覺化檢視],然後選取一個選項,例如 [啟動新處理序]。
並行視覺化檢視會啟動應用程式並收集追蹤資料,直到您選取 [停止收集] 為止。 然後,視覺化檢視就會分析追蹤資料,並在追蹤報表頁面上顯示結果。
選取報表左上方的 [執行緒] 索引標籤來開啟 [執行緒] 檢視。
選取時間間隔和要啟動效能分析的執行緒。
時間軸分析
[執行緒] 檢視的上半部是時間軸。 時間軸顯示處理序中所有執行緒和主機電腦上所有實體磁碟裝置的活動。 其也顯示 GPU 活動和標記事件。
在時間軸上,X 軸是時間,而 Y 軸上有幾個通道:
- 系統上的每個磁碟機各有兩個 I/O 通道,一個通道用來讀取,而另一個用來寫入。
- 處理序中的每個執行緒各有一個通道。
- 標記通道,如果在追蹤中有標記事件。 標記通道一開始會出現在產生這些事件的執行緒通道下。
- GPU 通道。
一開始會依照執行緒建立的順序排列,因此第一個是主要的應用程式執行緒。 在 [排序依據] 下拉式清單中選取另一個選項,依照另一個準則來排序執行緒,例如 [執行]。
時間軸色彩表示指定時間的執行緒狀態。 綠色區段表示執行中,紅色區段表示遭封鎖進行同步處理、黃色區段表示遭到先佔,而紫色區段表示忙於裝置 I/O。
您可以放大以檢視更多詳細資料,或縮小以檢視更長的時間間隔。 請選取圖形上的區段和點,取得有關分類、開始時間、延遟及呼叫堆疊狀態的詳細資料。
請使用此時間軸,檢查平行迴圈或並行工作中相關執行緒之間的工作平衡。 如果完成某個執行緒所花的時間比其他執行緒更長,可能會造成工作分配不均。 您可以在執行緒之間更平均地分配工作,來改善應用程式的效能。
如果在某個時間點只有一個執行緒正在執行,則應用程式可能未充分利用系統上的並行處理能力。 您可以使用時間軸圖形,檢查執行緒之間的相依性,以及封鎖和遭封鎖執行緒之間的暫時關聯性。 若要重新排列執行緒,請選取執行緒,然後在工具列上選取向上或向下圖示。
您可以隱藏未正常運作或完全遭到封鎖的執行緒,因為其統計資料無關緊要,而且可能會塞滿報表。 請透過選取執行緒名稱,然後選取工具列上的隱藏選取的執行緒或隱藏所選執行緒以外的所有項目圖示來隱藏執行緒。 若要識別要隱藏的執行緒,請選取左下方的 [個別執行緒摘要] 連結。 您可以隱藏在 [個別執行緒摘要] 圖形中沒有活動的執行緒。
執行緒執行詳細資料
若要取得執行區段的詳細資訊,請選取時間軸中綠色區段上的點。 並行視覺化檢視會在選取點上方顯示黑色插入號,並在下方窗格的 [目前] 索引標籤上顯示其呼叫堆疊。 您可以在執行區段上選取多個點。
注意
如果區段的持續時間少於一毫秒,並行視覺化檢視可能無法解析執行區段上的選取範圍。
若要取得目前所選取時間範圍內所有未隱藏執行緒的執行分析,請選取圖例左下方的 [執行]。
執行緒封鎖詳細資料
若要取得執行緒上特定區域的相關資訊,請將滑鼠指標移至時間軸的該區域上方,以顯示工具提示。 工具提示包含分類、開始時間和延遲等資訊。 選取區域,在下方窗格的 [目前] 索引標籤中顯示該時間點的呼叫堆疊。 該窗格也會顯示分類、延遲、封鎖 API (如果有的話) 與解除封鎖執行緒 (如果有的話)。 您可以藉由檢查呼叫堆疊來判斷執行緒封鎖事件的根本原因。
執行路徑可能有多個封鎖事件。 若要更快速地封鎖分類並找到問題區域來進行檢查,請選取圖例左側的封鎖分類。
執行緒之間的相依性
並行視覺化檢視會顯示執行緒之間的相依性,以便您判斷遭封鎖執行緒嘗試執行的作業,以及將其啟用來執行的其他執行緒。
若要判斷將另一個執行緒解除封鎖的是哪一個執行緒,請選取時間軸上的封鎖區段。 如果並行視覺化檢視可以判斷解除封鎖執行緒,會在解除封鎖執行緒和封鎖區段後面的執行區段之間繪製一條線。 選取下方窗格中的 [解除封鎖堆疊] 索引標籤,查看相關的呼叫堆疊。
設定檔報告
時間軸圖形下方是一個窗格,其中包含 [分析報表]、[目前] 和 [解除封鎖堆疊] 報表索引標籤。 當您變更時間軸和執行緒選取範圍時,會自動更新報表。 進行大規模追蹤時,可能無法在計算更新時暫時使用報表窗格。
[分析報表] 索引標籤
[分析報表] 有兩個篩選條件:
- 若要篩選出花費時間較少的呼叫樹狀結構項目,請在 [減少雜訊] 欄位中鍵入介於 0 到 99% 之間的篩選值。 預設值為 2%。
- 若只要檢視您程式碼的呼叫樹狀結構,請選取 [Just My Code] 核取方塊。 若要檢視所有的呼叫樹狀結構,請清除核取方塊。
[分析報表] 索引標籤會以圖例顯示分類和連結的報表。 若要顯示報表,請選取左側的其中一個項目:
執行:[執行] 報表會顯示應用程式花費的執行時間解析。
若要找出執行時間花費在哪一行程式碼,請展開呼叫樹狀結構,並在呼叫樹狀結構項目的捷徑功能表上,選取 [檢視原始檔] 或 [檢視呼叫位置]。 [檢視原始檔] 會找到執行的那一行程式碼。 [檢視呼叫位置] 會找到呼叫所執行那一行的程式碼行。 如果呼叫位置只有一行,則會醒目提示其程式碼。 如果有多個呼叫位置,請在對話方塊中選取所需的呼叫位置,然後選取 [移至原始檔]。 找到有最多執行個體、花費最多時間 (或兩者) 的呼叫位置通常最有用。 如需詳細資訊,請參閱設定檔報告。
同步處理:[同步處理] 報表顯示負責同步處理區塊的呼叫,以及每個呼叫堆疊的總封鎖時間。 如需詳細資訊,請參閱同步處理時間
I/O:[I/O] 報表顯示負責 I/O 區塊的呼叫,以及每個呼叫堆疊的總封鎖時間。 如需詳細資訊,請參閱 I/O 時間 (執行緒檢視)。
睡眠:[睡眠] 報表顯示負責睡眠區塊的呼叫,以及每個呼叫堆疊的總封鎖時間。 如需詳細資訊,請參閱睡眠時間。
記憶體管理:[記憶體管理] 報表會顯示出現記憶體管理區塊的呼叫,以及每個呼叫堆疊的總封鎖時間。 請使用這項資訊來識別有過多分頁或記憶體回收問題的區域。 如需詳細資訊,請參閱記憶體管理時間。
先佔:[先佔] 報表會顯示系統上的處理序先佔目前處理序的位置,以及取代目前處理序中執行緒的個別執行緒。 您可以使用這項資訊來識別要對先佔負最大責任的處理序和執行緒。 如需詳細資訊,請參閱先佔時間。
UI 處理:[UI 處理] 報表顯示負責 UI 處理區塊的呼叫,以及每個呼叫堆疊的總封鎖時間。 如需詳細資訊,請參閱 UI 處理時間。
個別執行緒摘要:選取 [個別執行緒摘要] 可顯示一個圖表,該圖表會顯示目前所選取時間間隔的執行緒狀態。 以色彩編碼的資料行顯示每個執行緒花費在執行、遭封鎖、I/O 及其他狀態的總時間。 執行緒標示在底部。 當您在時間軸圖形中調整縮放層級時,會自動更新此圖形。
在一些縮放層級中,此圖形可能不會顯示某些執行緒。 發生這種情況時,在右側會出現省略符號 (...)。 如果您想要的執行緒並未出現,您可以隱藏其他執行緒。 如需詳細資訊,請參閱個別執行緒摘要。
磁碟作業:選取 [磁碟作業] 可顯示與目前處理序的磁碟 I/O 相關的處理序和執行緒,其所接觸的檔案 (例如,載入的 DLL)、一共讀取多少個位元組以及其他資訊。 您可以使用此報表來評估執行期間花費在存取檔案的時間,尤其是當處理序似乎為 I/O 繫結時。 如需詳細資訊,請參閱磁碟作業報告。
目前索引標籤
此索引標籤會顯示在時間軸圖形的執行緒區段上所選取時間點的呼叫堆疊。 顯示的呼叫堆疊會經過修剪,只顯示與您的應用程式相關的活動。
[解除封鎖堆疊] 索引標籤
此索引標籤會顯示哪一個執行緒解除封鎖了選取的執行緒,以及解除封鎖呼叫堆疊。
通道 (執行緒檢視)
並行視覺化檢視會顯示四種通道︰執行緒通道、磁碟通道、標記通道和 GPU 通道。
執行緒通道
執行緒通道以不同色彩為每種執行緒顯示執行緒的狀態。 當您暫停在通道名稱時,會顯示指定執行緒的開始函式。 並行視覺化檢視會偵測幾種執行緒。 下表顯示最常見的種類。
對話 | 描述 |
---|---|
主執行緒 | 啟動應用程式的執行緒。 |
背景工作執行緒 | 應用程式主執行緒所建立的執行緒。 |
CLR 背景工作執行緒 | 背景工作執行緒是由通用語言執行平台 (CLR) 建立。 |
偵錯工具協助程式 | Visual Studio 偵錯工具所建立的背景工作執行緒。 |
ConcRT 執行緒 | Microsoft 並行執行階段所建立的執行緒。 |
GDI 執行緒 | GDIPlus 所建立的執行緒。 |
OLE/RPC 執行緒 | 以 RPC 背景工作執行緒方式建立的執行緒。 |
RPC 執行緒 | 以 RPC 執行緒方式建立的執行緒。 |
Winsock 執行緒 | 以 Winsock 執行緒方式建立的執行緒。 |
執行緒集區 | CLR 執行緒集區所建立的執行緒。 |
磁碟通道
磁碟通道對應至電腦中的實體磁碟機。 因為系統上的每個實體磁碟機都有不同的通道進行讀取和寫入作業,所以每個磁碟機都有兩個通道。 磁碟編號對應置核心裝置名稱。 只有當磁碟有活動時,才會顯示磁碟通道。
標記通道
標記通道對應至由應用程式以及所使用的程式庫所產生的事件。 例如,工作平行程式庫、平行模式程式庫和 C++ AMP 會產生顯示為標記的事件。 每個標記通道都與一個執行緒識別碼相關聯,執行緒識別碼顯示在通道的描述旁邊。 識別碼會識別產生事件的執行緒。 通道的描述包含產生事件之 Windows 事件追蹤 (ETW) 提供者的名稱。 如果通道顯示來自並行視覺化檢視 SDK 的事件,也會顯示系列名稱。
GPU 通道
GPU 通道顯示系統上 DirectX 11 活動的相關資訊。 與圖形卡相關聯的每個 DirectX 引擎都有不同的通道。 個別區段代表處理 DMA 封包所花費的時間。
複製選取項目
若要從 [報表] 索引標籤中複製整個呼叫堆疊,請按一下 [複製]。 然後,您就可以在任何支援該動作的程式中貼上呼叫堆疊。
目前索引標籤
按一下 [目前] 索引標籤,如果選取 CPU 執行緒區段,您可以查看時間軸中最接近目前選取點的呼叫堆疊 (如果有)。 此時,選取點會以黑色箭號或插入號顯示在時間軸上方。 選取封鎖的區段之後,因為沒有任何執行,所以不會顯示插入號。 不過,仍然會反白顯示區段,而且會顯示呼叫堆疊。
[目前] 索引標籤也會顯示 DirectX 活動區段、標記和 I/O 存取的相關資訊。 對於 DirectX 活動區段,會顯示硬體佇列處理 DMA 封包方式的相關資訊。 對於標記,會顯示描述和標記類型的相關資訊。 對於 I/O 存取,會顯示讀取或寫入的檔案和位元組數目的相關資訊。
空白時間表區段
在並行視覺化檢視中,時間表區段空白 (具有白色背景) 的原因取決於通道的類型。
如為 CPU 執行緒通道,表示執行緒在時間表的這個部分不存在。 如果您對執行緒感興趣,您可以使用縮放控制項或水平捲動來尋找其執行區段。
如為 I/O 通道,表示該時間點沒有代表目標處理序的磁碟存取發生。
如為 DirectX 通道,表示在時間表的這個部分沒有代表目標處理序執行的 GPU 工作。
如為標記通道,表示未產生任何標記。
匯出按鈕 (並行視覺化檢視)
[匯出] 按鈕可讓您將專屬記錄的呼叫堆疊匯出為 .csv 檔案或與 Microsoft Excel 這類其他工具搭配使用。
Just My Code (執行緒檢視)
如果選取此選項,即會篩選呼叫堆疊只顯示您的程式碼,加上一個層級的已呼叫函式。
只要啟用此選項,您就可以大幅降低呼叫堆疊的複雜性,還可能更容易診斷特定問題。
在某些情況下,選取此選項可能會篩選掉封鎖的呼叫。 如果您需要完整的呼叫堆疊詳細資料進行判斷,請清除此選項以公開完整的呼叫堆疊。
管理通道
在並行視覺化檢視的 [執行緒檢視] 中,您可以針對處理序組織通道,以檢查特定模式。 您可以排序、上下移動及隱藏或顯示通道。
排序依據
您可以就目前的縮放層級,使用 [排序依據] 控制項來依據不同準則排序執行緒。 此方法對於尋找特定模式非常有幫助。 您可以根據這些準則來排序:
準則 | 定義 |
---|---|
開始時間 | 依據開始時間來排序執行緒。 這是預設的排序順序。 |
結束時間 | 依據結束時間來排序執行緒。 |
執行 | 依據執行時間花費百分比來排序執行緒。 |
同步處理 | 依據同步時間花費百分比來排序執行緒。 |
I/O | 依據 I/O 時間花費百分比來排序執行緒。 |
Sleep | 依據睡眠時間花費百分比來排序執行緒。 |
分頁 | 依據分頁時間花費百分比來排序執行緒。 |
先佔 | 依據先佔時間花費百分比來排序執行緒。 |
UI 處理 | 依據使用者介面處理時間花費百分比來排序執行緒。 |
向上或向下移動選取的通道
您可以使用這些控制項在清單中向上或向下移動通道。 例如,您可以將相關的通道放置在一起,以便檢查特定模式或跨執行緒的關係。
將選取的通道移至頂端或底部
您可以將選取的通道移動到清單的頂端或底部,以便檢查特定模式,或是在檢查的時候排除不相關的通道。
隱藏選取的通道
當您想要隱藏通道時,請選取此控制項。 例如,如果某個執行緒百分之百與您的受管理處理序同步,則您可以在分析其他執行緒的時候隱藏它。
注意
隱藏的執行緒不會顯示在作用中圖例和分析報表中的計算時間。
顯示所有通道
此控制項會在有一個以上的隱藏通道時顯示。 若選取它,所有隱藏的元素就都會顯示,並且再次回到計算時間。
將標記移至頂端
如果追蹤包含標記事件,則您可以使用此命令將標記通道移動到時間軸的頂端。 系統會保留他們的相對順序。
依據執行緒來分組標記
如果追蹤包含標記事件,您就可以使用此命令將標記通道分組在產生標記事件的執行緒下方。 磁碟通道會移動到通道清單的最上方,而 GPU 通道會移動到最下方。
開啟/關閉測量模式
您可以使用此工具精確地測量時間軸中的時間長度。 若要啟用測量模式,請按一下 [量值] 按鈕 (有尺規圖示),然後拖曳到時間軸中。 拖曳時請注意,指標下方的區域會以黃色反白顯示,而測量的時間會出現在工具列按鈕的右邊。 您拖曳時會動態計算此值,讓您立即看到特定事件所花的時間長短。 當您放開滑鼠按鈕時,時間值仍保持可見狀態。
您可以重複測量程序,但只會顯示最新的量值。 再按一下 [量值] 按鈕,關閉測量模式。
雜訊減少百分比
根據預設,[雜訊減少百分比] 設定的值為 2。 呼叫樹狀結構只會顯示內含時間百分比大於或等於這項設定的項目。 只要變更此設定,您就可以控制呼叫樹狀結構顯示的項目數。 例如,值變更為 10 只會顯示內含時間大於或等於 10% 的呼叫樹狀結構項目。 增加設定的值,您就可以專注於對程序效能有較大影響的項目。
以可見時間範圍為基礎的報表
[設定檔] 檢視顯示的報表是以目前可見的時間範圍和通道為基礎。 若要查看資料不同子集的詳細資訊,請按一下圖例中的項目。
執行緒就緒連接器
當您按一下封鎖區段查看呼叫堆疊及其解除封鎖堆疊時,可能也會顯示執行緒就緒連接器。 如果解除封鎖事件發生在目前處理序中的另一個執行緒上,則執行緒就緒連接器會以視覺化方式識別讓封鎖的執行緒繼續執行的執行緒及執行區段。
時間軸插入號
當您在執行執行緒區段的時間軸上選取一點,時間軸插入號會出現在那點上方。 顯示在目前堆疊索引標籤上的呼叫堆疊,在時間上最接近您所按的區段。 插入號是用來和呼叫堆疊相關聯,其會在取樣的瞬間,顯示在 [目前] 索引標籤下方。 插入號顯示呼叫堆疊的確切位置,其是最接近使用者所選取位置的呼叫堆疊。
解除封鎖堆疊
如果目前選取的執行緒元素代表封鎖的區段,稍後會在目前處理序中的另一個執行緒將其解除封鎖之後執行,此索引標籤上會顯示執行解除封鎖的執行緒呼叫堆疊。
可見時間表分析
執行緒封鎖檢視的可見時間表分析提供統計資訊和報表連結。 當您放大、縮小、水平捲動、隱藏通道或顯示通道時,作用中圖例中的數字會隨之變更,反映目前在檢視中的項目。 若要檢視有關圖例中項目的報表,按一下該項目。
縮放控制 (執行緒檢視)
縮放控制是可以放大和縮小時間軸的滑桿,讓您能專注在特別感興趣的區域。 此控制項會從時間軸檢視的中央放大,因此請先將感興趣的區域置中再放大。
在時間軸檢視中拖曳以放大
在時間軸檢視中拖曳,建立黃色醒目提示的區域以放大。 放開滑鼠按鈕之後,選取的範圍就會在時間軸檢視中放大。
使用滑鼠滾輪來縮放
按一下時間軸上的任一點 (確定滑鼠焦點在該點上),然後按下 Ctrl 並移動滑鼠滾輪 (向前放大、向後縮小)。