[英]Thread Utilization profiling on linux
Linux perf-tools非常適合在CPU周期中查找熱點並優化這些熱點。 但是,一旦某些部件被並行化,就很難發現順序部件,因為它們占用了大量的牆壁時間,但不一定需要很多CPU周期(並行部件已經燒掉了這些部件)。
為了避免XY問題:我的基本動機是在多線程代碼中找到順序瓶頸。 並行階段很容易控制聚合CPU周期統計數據,即使由於amdahl定律 ,連續階段占據了時間。
對於java應用程序,使用具有線程利用時間軸的visualvm或yourkit相當容易實現。
請注意,它顯示了所選范圍或時間點的線程狀態(可運行,等待,阻塞)和堆棧樣本。
如何在Linux上實現與perf或其他原生剖析器相媲美的東西? 它不一定是GUI可視化,只是一種查找與它們相關的順序瓶頸和CPU樣本的方法。
Oracle的Developer Studio性能分析器可能完全符合您的要求。 (如果你在Solaris上運行,我知道它會完全符合你的要求,但我從未在Linux上使用它,而且我現在無法訪問適合嘗試它的Linux系統)。
這是在x86 Solaris 11系統上運行的多線程IO測試程序的屏幕截圖:
請注意,您可以看到每個線程的調用堆棧以及線程如何交互 - 在發布的示例中,您可以看到實際執行IO的線程的起始位置,並且您可以在執行時看到每個線程。
這是一個顯示線程2在突出顯示時刻的確切位置的視圖:
此視圖啟用了同步事件視圖,顯示線程2卡在突出顯示的時段的sem_wait
調用中。 注意額外的圖形數據行,顯示同步事件( sem_wait()
, pthread_cond_wait()
, pthread_mutex_lock()
等):
其他視圖包括調用樹:
一個線程概述(對於少數幾個線程來說不是很有用,但如果你有數百個或更多線程可能非常有用
以及顯示功能CPU利用率的視圖
您可以看到每行代碼花費了多少時間:
不出所料,編寫大文件以測試IO性能的進程幾乎一直花在write()
函數中。
完整的Oracle簡介位於https://www.oracle.com/technetwork/server-storage/solarisstudio/documentation/o11-151-perf-analyzer-brief-1405338.pdf
快速使用概述:
collect
實用程序收集性能數據。 請參閱https://docs.oracle.com/cd/E77782_01/html/E77798/afadm.html#scrolltoc analyzer
GUI以分析上面收集的數據。 您可以使用我們用於分析脫離CPU分析的優秀工具來獲得您想要的結果 - 脫離CPU火焰圖 ,這是火焰圖的一部分
我使用了Off-CPU分析
脫離CPU分析是一種性能方法,可以測量和研究CPU外時間,以及堆棧跟蹤等上下文。 它與CPU分析不同,后者只檢查線程是否在CPU上執行。
這個工具基於你提到的首選工具 - perf,bcctools,然而,它提供了一個非常容易使用的輸出,稱為火焰圖,交互式SVG文件看起來像這個SVG脫CPU時間火焰圖 。
寬度與代碼路徑中的總時間成比例,因此首先要尋找最寬的塔,以了解最大的延遲來源。 從左到右排序沒有意義,y軸是堆棧深度。
2個更有用的分析是Off-CPU Flame Graphs的一部分,也可以幫助你 - 就我個人而言,我沒有嘗試過。
這使得我們可以解決比單獨的CPU外跟蹤更多的問題,因為喚醒信息可以解釋阻塞的真正原因。
和鏈圖
鏈圖是一種實驗性可視化,它將CPU外堆棧與其喚醒堆棧相關聯
還有一個實驗可視化,它結合了CPU和Off-CPU火焰圖熱/冷火焰圖
這顯示了一個圖形中的所有線程時間,並允許在CPU和CPU外代碼路徑持續時間之間進行直接比較。
它需要一點時間來閱讀這個分析工具並理解它的概念,但是,使用它非常簡單,其輸出比上面提到的其他工具更容易分析。
祝好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.