1. 程式人生 > >效能篇:分析程序的執行緒

效能篇:分析程序的執行緒

執行緒是瓶頸:

  分析在瓶頸時的單個執行緒或者多個執行緒,來了解更多關於處理器的消耗情況。無論是單程序還是多程序,監控以下的幾個因素,來分析執行緒是如何導致整個問題的。這幾個因素是:

  *每個程序在瓶頸時執行的執行緒總數

  *一個執行緒佔用的處理器時間

  *正在執行的執行緒的排程優先順序

  *在特權模式下執行緒使用處理的總時間

  你能用計數器來分析執行緒的活動情況,和調整執行緒的排程,來讓處在瓶頸的程序獲得更多的處理器時間

  除了調整執行緒排程的優先順序外,你不能改變執行緒的行為,不能改變香港應用程式的程式程式碼。儘管如此,如果你有應用程式的原始碼,你也可以寫在一個較低的水平計數器來監視執行緒的活動。要了解更多資訊的話, 可以檢視 the Platform Software Development Kit (SDK) link (

http://windows.microsoft.com/windows2000/reskit/webresources).

 上下文切換:

  效能監視器裡的每秒鐘切換執行緒上下文次數的計數器(Thread\Context Switches/sec counter),對作業系統如何排程執行緒方面,提供了另一種視角。當核心在處理器上將執行的執行緒切成另一個執行緒時,上下文切換就發生了。上下文切換出現的情況,也可能是一個高優先順序的執行緒出現,搶佔了正在執行的執行緒;也可能是一個執行的執行緒因為某些原因需要等待(例如IO操作)。當執行緒從處理器裡搶佔到時間或者喪失執行時間時,每秒切換執行緒上下文次數的計數器的值就會增加。

  在上下文切換的過程中,至少有兩個執行緒正在改變他們的執行緒狀態。仔細檢視上下文切換的資料,能發現處理器處理器使用執行緒的模式,而且還能顯示一個執行緒是如何與該程序的其他執行緒來共用處理器的。

   每秒系統上下文切換次數的計數器(System\Context Switches/sec counter),是反映整個系統的上下文切換次數的,整個值應該接近於或者相同於所有的的每秒鐘切換執行緒上下文次數的計數器(Thread\Context Switches/sec counter)的總和。長時間監測,應該可以幫助你判斷這兩種計數器的值得變化範圍。

  謹慎的分析該資料。執行緒大量使用處理器時,會降低上下文切換的頻率;因為他不允許其他的程序的執行緒來獲取處理器時間。上下文切換頻率高的話,意味著處理器是被反覆的共享使用的,例如很多執行緒擁有同樣的優先順序。通過減少系統的活動的執行緒的個數,來儘量減少上下文切換的頻率,是個好的做法。使用執行緒池、I/O完成埠、非同步IO,能減少活動執行緒的個數。如果你想要確定你的應用程式是否提供包括限制執行緒個數的功能,請諮詢你的內部開發人員或者應用程式供應商來決定。

  每秒每個處理器切換300次是一個比較正常的數值;每秒切換1000次就很高了。比這個值高的話,可能代表著有問題

圖示顯示每個執行緒CPU的利用率:

  觀察一個程序的執行緒佔用的處理器時間,會提供關於處理器活動情況的額外的資訊。系統監視器提供Thread%Process Time counter來監控一個正在執行的程式裡每個執行緒的處理器的使用情況。如果你的程序是單執行緒,你就不需要跟蹤程序裡的執行緒使用的處理器時間,因為他基本和你記錄處理器的時間是相同的。

  下圖顯示在瓶頸時,所有執行緒的時間情況。每欄都顯示了一個執行緒使用的處理器時間:

  

  圖7.12顯示有3個執行緒在主導處理器的使用,而其他的一些執行緒只能獲得很少的處理器時間。

  如果你的執行緒活動情況和上圖類似,那意味著你係統裡的一些應用程式,沒有達到你預期的那麼有效地使用處理器。觀察程序中的執行緒,以及他們怎麼使用處理器;監視上下文切換,監視使用者態和核心態CPU的利用率

瓶頸時的單執行緒和多執行緒:

  一個程序用多執行緒和多個程序都是單執行緒的,或者是多程序多執行緒,都可能會導致瓶頸。因為這些問題需要的解決方案不同,所以你需要區分它們各自的原因。

  先學習瓶頸時執行緒的情況,Log處理器、程序、執行緒物件的計數器。這些能幫助你觀察執行緒的活動情況,幫你分析處理的使用狀態看。

****

  在System Monitor或者計數器的log裡;選擇執行緒物件,並檢視Instance box裡的所有例項。如果有一些執行緒的ID被列舉出來,那麼表明它是多執行緒的。例如下圖就是多執行緒的。

  

  系統監視器裡會標識出線程所處的處理器名稱和執行緒數。這些執行緒在圖表中出現的順序是取決於額你新增它們到圖表裡的順序的。在例項框中現實的執行緒數代表著執行緒啟動的順序。執行緒ID是在這個執行緒消亡前一直有效的。當執行緒終止時,執行緒ID會被回收。執行緒數在執行過程中是可能會改變的,所以最好是監視執行緒ID。Tlist 會提供執行緒香港資訊,詳細的可以取下載對應的支援包

使用者模式和特權模式(Privileged Mode)

  你能決定一個程序在使用者模式和特權模式下執行時間的百分比。使用者模式是應用程式執行的處理方式。特權模式,或者說是核心模式,是允許程式碼直接訪問系統中硬體和記憶體的處理方式。開發這也許想知道一個程序每種模式下花了多少時間,以及處理器是用哪種方式來工作的。

  IO操作和其他系統服務,都是執行在核心模式下的;使用者應用程式是執行在使用者模式下的。除非他們是圖形密集型或者IO密集型的程式(例如檔案列印服務),大多數應用程式是不該在核心模式下有大量工作的。

  效能監視器裡有個關於系統、處理器、程序、執行緒物件的% Privileged Time和 % User Time counters。System Calls/sec也是核心時間佔用的一個有用的指標,因為應用程式要求系統進入核心模式下操作。效能監視器會展現使用者模式和核心模式花費的時間,如圖: