執行緒 檢視是並行視覺化工具中最詳細且功能最豐富的檢視。 在 「執行緒」 檢視中,您可以識別哪些執行緒在執行區段期間執行程式碼,並分析執行緒是否因為同步處理、I/O 或其他原因而執行或阻塞。 執行緒 檢視報告中還會分析呼叫堆疊樹的執行和解除封鎖的執行緒。
執行緒執行時,並行視覺化工具會收集範例。 當執行緒停止執行時,視覺化檢視會檢查執行緒的所有作業系統內容切換事件。 內容切換可能會發生,因為:
- 執行緒會在同步處理基本類型上封鎖。
- 執行緒的量程到期。
- 執行緒發出阻塞 I/O 請求。
並行視覺化工具會分類執行緒和內容切換事件,並在執行程的呼叫堆疊中搜尋已知的封鎖 API。 它會在 「執行緒」 視圖左下角的作用中圖例中顯示執行緒類別。 在大部分情況下,您可以檢查對應至內容切換事件的呼叫堆疊,以識別封鎖事件的根本原因。
如果沒有匹配的呼叫堆疊,並行可視化工具將使用 Windows 所提供的等候原因。 不過,Windows 類別可能是以實作詳細數據為基礎,而且可能不會反映使用者意圖。 例如,Windows 會將封鎖原生精簡讀寫器鎖定的等候原因報告為 I/O,而不是同步處理。
執行緒 檢視也會顯示執行緒之間的相依性。 例如,如果您識別在同步處理物件上封鎖的執行緒,您可以找到解除封鎖它的執行線。 在解除封鎖執行緒解鎖另一個執行緒的時刻,您可以檢查呼叫堆疊。
您可以使用 執行緒 檢視來:
- 識別應用程式的使用者介面 (UI) 在特定執行階段沒有回應的原因。
- 判斷封鎖同步處理、I/O、頁面錯誤和其他事件所花費的時間量。
- 發現系統上執行的其他進程的干擾程度。
- 識別平行執行的負載平衡問題。
- 找出延展性欠佳或不存在的原因。 例如,為什麼當有更多邏輯核心可用時,平行應用程式的效能沒有改善。
- 了解應用程式中的並行程度,以協助並行化。
- 識別工作執行緒之間的相依性和執行的關鍵路徑。
使用線程檢視
若要啟動並行視覺化工具,請選取分析並行視覺化工具>然後選取一個選項,例如啟動新程序。
並行視覺化工具會啟動應用程式並收集追蹤,直到您選取 [停止收集]。 然後,視覺化工具會分析追蹤,並在追蹤報告頁面上顯示結果。
選取報告左上角的 [ 執行緒 ] 索引標籤,以開啟 [ 執行緒 ] 檢視。
選取時間間隔和執行緒以啟動效能分析。
時間軸分析
「執行緒」檢視的上半部分是時間軸。 時間表會顯示進程中所有執行緒的活動,以及主機上所有實體磁碟裝置的活動。 它也會顯示 GPU 活動和標記事件。
在時間軸上,x 軸是時間,y 軸上是幾個通道:
- 系統上的每一個磁碟機都有兩個 I/O 通道,一個用於讀取的通道,一個用於寫入的通道。
- 進程中每個執行緒的通道。
- 標記通道,若追蹤中存在標記事件。 標記通道一開始會顯示在產生這些事件的執行緒通道下。
- GPU 通道。
一開始,執行緒會依其建立順序排序,因此主要應用程式執行緒在前。 選取 排序依據 下拉式清單中的另一個選項,以依另一個條件排序執行緒,例如執行。
時間軸顏色表示線程在指定時間的狀態。 綠色區段正在執行,紅色區段同步受阻,黃色區段被中斷,紫色區段執行裝置 I/O。
您可以放大以檢視更多詳細資料,或縮小以檢視較長的時間間隔。 選取圖表上的區段和點,以取得類別、開始時間、延遲和呼叫堆疊狀態的詳細資訊。
使用時間表來檢查平行迴圈或並行作業中涉及的執行緒之間的工作平衡。 如果一個執行緒比其他執行緒需要更長的時間才能完成,則工作可能會不平衡。 您可以藉由在執行緒之間更平均地分配工作來改善應用程式的效能。
如果只有一個執行緒在某個時間點執行,應用程式可能無法充分利用系統上的並行。 您可以使用時間軸圖表來檢查執行緒之間的相依性,以及封鎖與封鎖執行緒之間的時間關係。 若要重新排列線程,請選取線程,然後選取工具列上的向上或向下圖示。
您可以隱藏未執行工作或完全封鎖的執行緒,因為它們的統計資料無關緊要,並且可能會堵塞報告。 若要隱藏線程,請選取其名稱,然後選取工具列上的「 隱藏選取的線程 」或「 隱藏所選線程以外的所有線程 」圖示。 若要識別要隱藏的執行緒,請選取左下角的「 每個執行順序摘要」 連結。 您可以在「每個執行緒摘要」圖表中隱藏沒有活動的執行緒。
執行緒運行細節
若要取得有關執行區段的詳細資訊,請在時間軸的綠色區段上選取一個點。 並行視覺化工具會在選取的點上方顯示黑色標記,並在底部面板的 [目前] 索引標籤顯示其調用堆疊。 您可以在執行區段上選取多個點。
備註
如果區段的持續時間小於一毫秒,則並行視覺化工具可能無法解析執行區段上的選取項目。
若要取得目前所選時間範圍內所有未隱藏執行緒的執行設定檔,請在左下角的圖例中選取 [執行]。
執行緒封鎖詳細資料
若要取得執行緒上特定區域的相關資訊,請將滑鼠停留在時間軸上的該區域上以顯示工具提示。 工具提示包含類別、開始時間和延遲等資訊。 選取區域,以在底部窗格的 [目前] 索引標籤中顯示該時間點的呼叫堆疊。 窗格也會顯示類別、延遲、封鎖 API (如果有) ,以及解除封鎖執行緒 (如果有)。 透過檢查呼叫堆疊,您可以判斷執行緒封鎖事件的根本原因。
執行路徑可能有數個封鎖事件。 若要透過封鎖類別來檢查這些區域並更快地找到問題區域,請在左側圖例中選取封鎖類別。
執行緒之間的相依性
並行視覺化工具會顯示執行緒之間的相依性,因此您可以判斷封鎖的執行緒嘗試執行的動作,以及哪些其他執行緒可讓它執行。
若要判斷哪個執行緒解除封鎖另一個執行緒,請在時間軸上選取封鎖區段。 如果並行視覺化工具可以判斷解除封鎖執行緒,它會在解除封鎖執行緒與封鎖區段後面的執行區段之間繪製一條線。 選取底部窗格中的 [ 解除封鎖堆疊 ] 索引標籤,以查看相關的呼叫堆疊。
設定檔報告
時間軸圖表下方有一個窗格,其中包含 分析報告、目前 和 清理堆疊 報告標籤。 當您變更時間表和執行緒選項時,報告會自動更新。 對於大型追蹤,報告窗格在計算更新時可能會暫時無法使用。
個人資料報告分頁
設定檔報告有兩個篩選器:
- 若要篩選掉花費很少時間的呼叫樹狀結構條目,請在 [雜訊降低] 欄位中鍵入介於 0% 到 99% 之間的篩選器值。 預設值為 2%。
- 若要僅檢視程式碼的呼叫樹狀結構,請選取 [ 只我的程式碼 ] 核取方塊。 若要檢視所有呼叫樹狀結構,請取消勾選框的勾選。
「 設定檔報告」 標籤會顯示圖例中類別與連結的報告。 若要顯示報告,請選取左側的其中一個項目:
執行執行報告會顯示應用程式執行所花費時間的明細。
若要找出執行時間消耗的程式碼行,請展開呼叫樹狀結構,然後在呼叫樹狀結構項目的捷徑功能表上,選取 [ 檢視來源 ] 或 [ 檢視呼叫點 ]。 檢視原始碼 會找出已執行的程式碼行。 檢視呼叫點 可定位呼叫已執行程式碼行的行。 如果只有一個呼叫站台線路存在,則會醒目提示其程式碼。 如果存在多個通話網站,請在對話方塊中選取您想要的網站,然後選取 [ 移至來源]。 尋找具有最多實例、最多時間或兩者的通話網站通常最有用。 如需詳細資訊,請參閱 執行設定檔報告。
同步處理同步處理報告會顯示負責同步處理區塊的呼叫,以及每個呼叫堆疊的封鎖時間總計。 如需相關資訊,請參閱 同步處理時間。
I/OI/O 報告會顯示負責 I/O 區塊的呼叫,以及每個呼叫堆疊的總封鎖時間。 如需相關資訊,請參閱 I/O 時間 (執行緒檢視)。
睡眠報告會顯示導致睡眠阻塞的呼叫,以及每個呼叫堆疊的總封鎖時間。 如需詳細資訊,請參閱 睡眠時間。
記憶體管理記憶體管理報告會顯示發生記憶體管理區塊的呼叫,以及每個呼叫堆疊的總封鎖時間。 使用此資訊來識別具有過多分頁或記憶體回收問題的區域。 如需詳細資訊,請參閱 記憶體管理時間。
搶佔 「 先占」 報告會顯示系統上的處理程序先占現行處理程序的位置,以及取代現行處理程序中執行緒的個別執行緒。 您可以使用此資訊來識別最可能搶佔的處理程序和執行緒。 如需詳細資訊,請參閱 搶佔時間。
UI 處理UI 處理報告會顯示負責 UI 處理區塊的呼叫,以及每個呼叫堆疊的封鎖時間總計。 如需詳細資訊,請參閱 UI 處理時間。
每個執行緒摘要 選取 每個執行緒摘要 以顯示顯示目前所選時間間隔內執行緒狀態的圖表。 顏色編碼的直欄顯示每個執行緒在執行、封鎖、I/O 和其他狀態下花費的總時間。 螺紋在底部標有標籤。 當您調整時間軸圖表中的縮放等級時,此圖表會自動更新。
在某些縮放層級上,某些執行緒可能不會顯示在圖表中。 發生這種情況時,橢圓 (...) 會出現在右側。 如果沒有出現您想要的線程,您可以隱藏其他線程。 如需詳細資訊,請參閱 每個執行緒摘要報告。
磁碟操作 選取 [磁碟作業] 以顯示目前進程的磁碟 I/O 中涉及的進程和執行緒、它們接觸的檔案 (例如,它們載入的 DLL)、它們讀取的位元組數,以及其他資訊。 您可以使用此報告來評估執行期間存取檔案所花費的時間,尤其是當您的處理程序似乎是 I/O 限制時。 如需詳細資訊,請參閱 磁碟作業報告。
目前索引標籤
此索引標籤會顯示時間軸圖表中執行緒區段上所選點的呼叫堆疊。 呼叫堆疊會修剪,以僅顯示與您的應用程式相關的活動。
解除封鎖堆疊索引標籤
此索引標籤會顯示哪個執行緒解除封鎖所選執行緒,以及解除封鎖呼叫堆疊。
頻道(線程檢視)
並行視覺化工具會顯示四種通道:執行緒通道、磁碟通道、標記通道和 GPU 通道。
執行緒頻道
執行緒通道只會依色彩顯示一個執行緒的執行順序狀態。 當您暫停在通道名稱上時,會顯示給定執行緒的啟動函數。 並行視覺化工具會偵測數種執行緒。 最常見的種類如下表所示。
| Thread | Description |
|---|---|
| 主線程 | 啟動應用程式的執行串。 |
| 工作執行緒 | 應用程式主執行緒所建立的執行緒。 |
| CLR 背景工作執行緒 | 由共用語言執行階段(CLR)所建立的工作執行緒。 |
| 偵錯助手 | Visual Studio 偵錯工具所建立的工作執行緒。 |
| ConcRT 線程 | 由 Microsoft 並行執行階段所建立的執行緒。 |
| GDI 執行緒 | GDIPlus 建立的線程。 |
| OLE/RPC 執行緒 | 建立為 RPC 作業執行緒的線程。 |
| RPC 執行緒 | 作為 RPC 執行緒建立的執行緒。 |
| 溫索克線程 | 建立為 Winsock 線程的線程。 |
| 執行緒池 | 由 CLR 執行緒集區所建立的執行緒。 |
磁碟通道
磁碟通道對應於電腦中的實體磁碟機。 因為系統上的每一個實體磁碟機都有讀取及寫入作業的個別通道,所以每一個磁碟機都有兩個通道。 磁碟號碼對應於核心裝置名稱。 只有在磁碟上有活動時,才會顯示磁碟通道。
標記通道
標記通道對應於應用程式及其使用的程式庫所產生的事件。 例如,「工作平行程式庫」、「平行模式程式庫」和 C++ AMP 會產生顯示為標記的事件。 每一個標記通道都與執行緒 ID 相關聯,該 ID 會顯示在通道的說明旁邊。 識別碼會識別產生事件的執行緒。 通道的描述包含產生事件的 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)搭配使用。
只有我的程式碼 (執行緒視圖)
如果您選取此選項,您將篩選呼叫堆疊,以僅顯示您的程式碼加上一個層級的呼叫函式。
透過啟動此選項,您可以顯著降低呼叫堆疊的複雜性,並可能更容易診斷特定問題。
在某些情況下,選取此選項可能會篩選出封鎖呼叫。 如果您需要完整的呼叫堆疊詳細數據來進行判斷,請清除此選項以公開完整的呼叫堆疊。
管理頻道
在並行視覺化工具的 「執行緒視圖 」中,您可以組織程序的通道,以便檢查特定型樣。 您可以對頻道進行排序、上下移動以及隱藏或顯示它們。
排序依據:
您可以使用 [排序依據] 控制項,根據目前的縮放層級,依不同的準則排序執行緒。 當您尋找特定圖案時,這特別有用。 您可以依下列條件排序:
| 準則 | Definition |
|---|---|
| 開始時間 | 按開始時間排序執行緒。 這是預設排序順序。 |
| 結束時間 | 依據結束時間對執行緒進行排序。 |
| Execution | 依執行所花費的時間百分比來排序執行緒。 |
| Synchronization | 依同步處理所花費的時間百分比來排序執行緒。 |
| I/O | 依 I/O (讀取和寫入資料) 所花費的時間百分比來排序執行緒。 |
| 睡眠 | 根據執行緒處於休眠狀態的時間百分比進行排序。 |
| Paging | 按照執行緒在分頁上所花費時間的百分比進行排序。 |
| 搶佔 | 根據執行緒在搶占中所花費時間的百分比來排序。 |
| UI 處理 | 依使用者介面處理所花費的時間百分比來排序執行緒。 |
向上或向下移動選取的頻道
您可以使用這些控制項在列表中向上或向下移動頻道。 例如,您可以將相關通道彼此相鄰放置,以協助您檢查特定型樣或跨執行緒關係。
將選取的頻道移至頂端或底部
您可以將選取的通道移至清單的頂端或底部,以便檢查特定型樣,或在檢查其他通道時將某些通道移開。
隱藏選取的頻道
當您想要隱藏頻道時,請選擇此控制項。 例如,如果執行緒在受管理程序的生命週期內是 100% 同步處理,您可以在分析其他執行緒時隱藏它。
備註
隱藏執行緒也會將其從計算時間中移除,這些計算時間會顯示在作用中圖例和分析報告中。
顯示所有頻道
當隱藏一或多個通道時,此控制項會處於作用中狀態。 如果您選擇此選項,所有隱藏元素將會顯示,並重新納入時間計算。
將標記移至頂端
如果追蹤包含標記事件,您可以使用此命令將標記通道移至時間軸頂端。 它們的相對順序被保留。
依線程將標記分組
如果追蹤包含標記事件,您可以使用此指令將標記通道分組在產生標記事件的執行緒下。 磁碟通道會移至通道清單頂端、而 GPU 通道會移至底部。
測量模式開/關
透過使用此工具,您可以精確測量時間軸中的時間長度。 若要啟用測量模式,請按一下測量按鈕 (具有尺規圖示),然後在時間軸中拖曳。 當您拖曳時,請注意指標下方的區域會以黃色反白顯示,且測量的時間會顯示在按鈕右側的工具列中。 此值會在您拖曳時動態計算,以便您可以立即查看特定事件所花費的時間。 當您放開滑鼠按鈕時,時間值仍會保持可見。
您可以重複測量過程,但只會顯示最近的測量結果。 再次按一下測量按鈕以關閉測量模式。
降噪百分比
依預設,「降噪百分比」設定的值為 2。 只有包含時間百分比大於或等於此設定的項目才會顯示在呼叫樹中。 透過變更設定,您可以控制呼叫樹狀結構中顯示的條目數。 例如,將值變更為 10 只會顯示包容時間大於或等於 10% 的呼叫樹狀結構項目。 透過增加設定的值,您可以專注於對處理程序效能有較大影響的項目。
根據可見時間範圍進行報告
概況檢視會顯示根據目前可見的時間範圍和通道生成的報告。 若要查看資料不同子集的詳細資料,請按一下圖例中的項目。
您可以在 「執行緒檢視」報表中找到有關資料的詳細資訊。
螺紋就緒連接器
當您按一下封鎖區段以查看呼叫堆疊及其解除封鎖堆疊時,也可能會顯示執行緒就緒連接器。 如果解除封鎖事件發生在目前進程中的另一個執行緒上,則執行緒就緒連接器會以視覺化方式識別可讓封鎖執行緒繼續執行的執行緒和執行區段。
時間軸游標
當您在執行緒區段的時間軸上選取點時,時間軸游標會出現在該點的上方。 目前堆疊索引標籤上顯示的呼叫堆疊是時間上最接近您按一下區段位置的呼叫堆疊。 插入符號用於將顯示在 [目前] 標籤頁下方的呼叫堆疊與取樣後的瞬間相關聯。 游標顯示呼叫堆疊的準確位置,這是最接近使用者所選位置的呼叫堆疊。
解除封鎖堆疊
如果目前選取的執行緒元素代表封鎖的區段,稍後會在目前進程中的另一個執行處理程序解除封鎖之後開始執行,則執行解除封鎖之執行緒的呼叫堆疊會顯示在此索引標籤上。
可視時間軸概況
「執行緒封鎖檢視」的「可見時間軸設定檔」提供統計資訊及報告鏈結。 當您放大、縮小、水平捲動、隱藏頻道或顯示頻道時,作用中圖例中的數字會變更,以反映目前檢視中的內容。 若要檢視有關圖例中項目的報告,請按一下該項目。
縮放控制 (線程視圖)
縮放控制項是一個滑桿,可協助您放大和縮小時間軸,以便您可以專注於特別感興趣的區域。 由於此控制項會放大時間軸檢視的中心,因此在放大之前,請先將感興趣的區域置中。
在時間軸視圖中拖動來放大
在時間軸視圖中透過拖曳來放大,會顯示一個以黃色反白的區域。 當您放開滑鼠按鈕時,時間軸檢視會放大選取的範圍。
使用滑鼠滾輪放大和縮小
按一下時間軸上的任何點(以確保它具有滑鼠焦點),然後按 Ctrl 並移動滑鼠滾輪(向前放大,向後縮小)。