簡體   English   中英

Linux上的線程利用率分析

[英]Thread Utilization profiling on linux

Linux perf-tools非常適合在CPU周期中查找熱點並優化這些熱點。 但是,一旦某些部件被並行化,就很難發現順序部件,因為它們占用了大量的牆壁時間,但不一定需要很多CPU周期(並行部件已經燒掉了這些部件)。

為了避免XY問題:我的基本動機是在多線程代碼中找到順序瓶頸。 並行階段很容易控制聚合CPU周期統計數據,即使由於amdahl定律 ,連續階段占據了時間。

對於java應用程序,使用具有線程利用時間軸的visualvm或yourkit相當容易實現。

yourkit線程時間軸

請注意,它顯示了所選范圍或時間點的線程狀態(可運行,等待,阻塞)和堆棧樣本。

如何在Linux上實現與perf或其他原生剖析器相媲美的東西? 它不一定是GUI可視化,只是一種查找與它們相關的順序瓶頸和CPU樣本的方法。

Oracle的Developer Studio性能分析器可能完全符合您的要求。 (如果你在Solaris上運行,我知道它完全符合你的要求,但我從未在Linux上使用它,而且我現在無法訪問適合嘗試它的Linux系統)。

這是在x86 Solaris 11系統上運行的多線程IO測試程序的屏幕截圖:

多線程IO性能測試prorgam的屏幕截圖

請注意,您可以看到每個線程的調用堆棧以及線程如何交互 - 在發布的示例中,您可以看到實際執行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

快速使用概述:

您可以使用我們用於分析脫離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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM