2010-03-23 119 views
36

我以前用gprof做了我所有的Linux分析。如何在Linux上分析多線程C++應用程序?

但是,對於我的多線程應用程序,它的輸出看起來不一致。現在

,我挖了這件事:

http://sam.zoy.org/writings/programming/gprof.html

然而,從很久以前,在我gprof的輸出是,它出現在我的gprof的是列出由非主線程使用的功能。

所以,我的問題是:

1)2010年,我可以很容易地使用gprof的剖析多線程的Linux C++應用程序? (Ubuntu 9.10) 2)我應該研究哪些其他工具來進行性能分析?

+0

我推薦使用valgrind – sisis 2010-03-23 02:35:51

+4

最好不要像valgrind那樣減慢速度。 – anon 2010-03-23 02:36:31

+2

請告訴我的替代方案,但不是替代品。檢查。 – dmckee 2010-03-23 02:37:50

回答

9

編輯:在窮人的分析器上增加了另一個answer,這對於多線程應用程序來說是更好的選擇。

看看oprofile。該工具的性能分析開銷可以忽略不計,並且它支持多線程應用程序---只要您不想剖析互斥性爭用(這是剖析多線程應用程序中非常重要的部分)

+1

縮放(在http://rotateright.com下載)建立在oprofile上,使得它更容易理解數據。 – federal 2011-09-12 17:54:46

+0

@federal看來你必須是root用戶才能安裝Zoom + _ + – Alaya 2015-05-10 15:18:57

5

看一看Valgrind

+1

Valgrind + cachegrind – 2010-03-25 19:24:49

+0

導致此線程的問題是Callgrind奇怪的調度差異以及它在單個線程中運行所有內容的事實。我試圖從我的原子操作和螺旋鎖中發現瓶頸,單線程化所有東西都可以消除可能導致的爭用和性能問題。因此,儘管我願意相反,但Valgrind並不總是選擇的探索者。 – 2017-12-06 20:51:21

5

看一看Zoom

+0

看來,如果我不是根,我不能安裝它。 – Alaya 2015-05-15 13:53:43

6

Paul R說,看看Zoom。您也可以使用lsstack,這是一種低技術方法,但效果驚人,compared to gprof

補充:既然你明確表示你在33ms運行OpenGL,我先前的建議就是這樣。另外,我個人在這種情況下所做的事情既有效又不直觀。只需讓它運行一個典型或有問題的工作負載,然後只需手動停止它,並查看它在做什麼以及爲什麼。多次這樣做。 現在,如果它只是偶爾行爲不檢,你只想在它行爲不端時停下來。這並不容易,但我已經使用了一個鬧鐘時鐘中斷來設置正確的延遲時間。例如,如果100幀中的一幀超過33ms,則在幀開始時,將計時器設置爲35ms,並在幀結束時將其關閉。這樣,它只會在代碼花費太長時間纔會中斷,並且會告訴你爲什麼。當然,一個樣本可能會錯過有罪代碼,但有20個樣本不會錯過它。

5

看一看poor man's profiler。令人驚訝的是,對於多線程應用程序既執行CPU概要分析,又進行互斥性爭用分析,而PMP同時執行這兩種工具,甚至不需要安裝任何東西(只要您具有gdb)即可。

0

您可以隨機運行pstack找出給定點的堆棧。例如。 10或20次。 最典型的堆棧是應用程序花費大部分時間的地方(根據經驗,我們可以假設帕累託分佈)。

您可以將這些知識與strace的桁架(Solaris)上跟蹤的系統調用,併爲內存打印PMAP

如果應用程序在專用系統上運行,您還可以使用sar來測量cpu,內存,I/O等以分析整個系統。

+0

查看Mike Dunlavey https:// stackoverflow的投票內容。com/users/23771/mike-dunlavey - 他證明了5個調用堆棧樣本(gdb或pstack或...)在統計上足夠了。此外,分析標記中的400個帖子:https://stackoverflow.com/search?q=user:23771%20[profiling]%20isisansans – osgx 2017-05-30 20:31:45

0

因爲你沒有提到非商業,可能我建議英特爾VTune™可視化。這不是免費的,但細節水平非常令人印象深刻(開銷可以忽略不計)。