行為錯誤之多執行緒應用程式的一般模式
「並行視覺化檢視」可協助開發人員視覺化多執行緒應用程式的行為。此工具包含行為不佳之多執行緒應用程式一般模式庫。這個一般模式庫包含透過工具公開的常見以及可辨識的視覺化模式,以及每個模式所代表行為的說明、該行為的可能結果,以及最常見的解決方法。
鎖定爭用與序列化執行
在某些情況下,即使平行化應用程式有數個執行緒,且電腦也有足夠的邏輯核心,此應用程式仍然會固執地以序列化方式繼續執行。第一個徵兆就是多執行緒效能不佳,甚至可能比序列化實作還稍慢。在 [執行緒檢視] 中,您看不到平行執行的多個執行緒,而是任何時刻都只見一個在執行中的執行緒。這時候,如果按一下執行緒中的同步處理區段,您可能看見遭封鎖之執行緒的呼叫堆疊 (封鎖呼叫堆疊) 以及已將封鎖狀況移除的執行緒 (解除封鎖呼叫堆疊)。此外,如果解除封鎖呼叫的堆疊發生在您正在分析的處理序中,便會顯示 [執行緒就緒] 連接器。在這裡,您可以從封鎖和解除封鎖的呼叫堆疊巡覽至程式碼,進一步調查序列化的原因。
如下圖所示,「並行視覺化檢視」也可以在「CPU 使用率檢視」中公開此徵兆,雖然有多個執行緒存在,但應用程式卻只使用一個邏輯核心。
如需詳細資訊,請參閱 Hazim Shafi 在 MSDN 部落格網站上的 Windows 的平行效能工具 的<效能模式 1:識別鎖定爭用>。
工作負載分佈不均
當應用程式中數個平行執行緒所分配到的工作不均時,隨著每個執行緒完成其工作,會出現一般階梯式模式,如上圖所示。「並行視覺化檢視」通常會顯示每個並行執行緒的開始時間非常接近。不過,這些執行緒一般會以不規律的方式結束,而非同時終止。此模式表示一組平行執行緒的工作分佈不均,可能會導致效能降低。解決上述問題的最佳方法是重新評估分配工作給平行執行緒的演算法。
如下圖所示,「並行視覺化檢視」也可以在 [CPU 使用率檢視] 中公開此徵兆,顯示 CPU 使用率逐步下降。
過度訂閱
在過度訂閱的情況中,處理序的使用中執行緒數目會大於系統上可用的邏輯核心數目。上圖顯示過度訂閱的結果,顯示所有使用中執行緒均有大量的先佔頻帶。此外,圖例也顯示有很大比例的時間花在先佔 (在此例中為 84%)。這可能表示處理序要求系統執行的並行執行緒超過邏輯核心數目。不過,這也可能表示系統上的其他處理序正在使用本來應提供給此處理序的資源。
當您評估這個問題時,您應該考慮下列各點:
整個系統可能都過度訂閱。考量系統上的其他處理序可能先佔了您的執行緒。當您停留在執行緒檢視中的先佔區段時,工具提示會指出執行緒以及先佔執行緒的處理序。此處理序不一定是您的處理序先佔整段期間執行的處理序,但可提供提示,了解是什麼對您的處理序產生先佔壓力。
評估您的處理序如何判斷在此工作階段執行的適合執行緒數目。如果您的處理序直接計算使用中平行執行緒的數目,請考慮修改該演算法,進一步將系統上可用的邏輯核心數目列入考量。如果您使用「並行執行階段」、「工作平行程式庫」或 PLINQ,這些程式庫就會執行計算執行緒數目的工作。
無效率 I/O
過度使用或誤用 I/O 是造成應用程式沒有效率的常見原因。以上圖為例。「可見時間表分析」會顯示可見執行緒時間有 42% 由 I/O 所佔用。時間表顯示有大量的 I/O,表示剖析的應用程式常被 I/O 封鎖。若要查看 I/O 的類型以及程式的哪個部分受到封鎖,請放大有問題的區域,然後檢查 [可見時間表分析],再按一下特定 I/O 區塊來查看目前的呼叫堆疊。
鎖定護送
當應用程式依先到先服務 (First-Come,First Serve) 的順序取得鎖定,且鎖定的抵達率高於擷取率時,就會發生鎖定護送。這兩種條件加在一起會讓鎖定要求開始出現壅塞狀況。其中一個解決這個問題的方法是使用「不公平」,或給予第一個執行緒存取權,以尋找處於非鎖定狀態的鎖定。上圖即顯示這種護送行為。若要解決問題,請嘗試減少同步處理物件的爭用並嘗試使用不公平鎖定。