簡體   English   中英

如何在 Linux 上分析多線程 C++ 應用程序?

[英]How to profile multi-threaded C++ application on Linux?

我曾經用gprof做我所有的 Linux 分析。

但是,對於我的多線程應用程序,它的輸出似乎不一致。

現在,我挖出了這個:

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

然而,它是很久以前的,在我的 gprof 輸出中,我的 gprof 似乎列出了非主線程使用的函數。

所以,我的問題是:

  1. 在 2010 年,我可以輕松地使用 gprof 來分析多線程 Linux C++ 應用程序嗎? ( Ubuntu 9.10 )
  2. 我應該使用哪些其他工具進行分析?

編輯:在窮人的分析器上添加了另一個答案,恕我直言,它更適合多線程應用程序。

看看oprofile 這個工具的分析開銷可以忽略不計,它支持多線程應用程序——只要你不想分析互斥爭用(這是分析多線程應用程序的一個非常重要的部分)

看看窮人的分析器 令人驚訝的是,對於多線程應用程序,很少有其他工具可以同時進行 CPU 分析和互斥爭用分析,而 PMP 可以同時進行,甚至不需要安裝任何東西(只要您有 gdb)。

看看Valgrind

看看Zoom

A Paul R 說,看看 Zoom。 您還可以使用lsstackgprof相比,這是一種技術含量低但非常有效的方法。

補充:由於您澄清您在 33 毫秒運行 OpenGL,因此我之前的建議成立。 此外,我個人在這種情況下所做的既有效又不直觀。 只需讓它在典型或有問題的工作負載下運行,然后手動停止它,看看它在做什么以及為什么。 這樣做幾次。 現在,如果它只是偶爾行為不端,您只想在它行為不端時停止它。 這並不容易,但我使用了一個鬧鍾中斷來設置恰到好處的延遲。 例如,如果 100 幀中有一個超過 33 毫秒,則在幀開始時將計時器設置為 35 毫秒,並在幀結束時將其關閉。 這樣,它只會在代碼花費太長時間時中斷,並且會告訴你原因。 當然,一個樣本可能會漏掉有罪代碼,但 20 個樣本不會漏掉。

嘗試現代 linux 分析工具perf (perf_events): https ://perf.wiki.kernel.org/index.php/Tutorial 和http://www.brendangregg.com/perf.html

perf record ./application
# generates profile file perf.data
perf report

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

您可以將這些知識與stracetruss (Solaris) 結合起來跟蹤系統調用,並使用pmap進行內存打印。

如果應用程序在專用系統上運行,您還需要sar來測量 cpu、內存、i/o 等,以分析整個系統。

既然你沒有提到非商業,我可以建議英特爾的VTune。 它不是免費的,但細節水平非常令人印象深刻(而且開銷可以忽略不計)。

Microprofile是另一個可能的答案。 它需要對代碼進行手動檢測,但它似乎可以很好地處理多線程代碼。 它還具有用於分析圖形管道的特殊鈎子,包括卡本身內部發生的事情。

稍微改變一下問題,您實際上可以很好地了解使用 ftrace 和 kernelshark 的多線程應用程序中發生的情況。 收集正確的跟蹤並按正確的按鈕,您可以看到各個線程的調度。

根據您的發行版內核,您可能必須構建一個具有正確配置的內核(但我認為現在很多人都構建了它)。

我試過valgrindgprof 令人遺憾的是,它們都不適用於多線程應用程序。 后來,我找到了Intel VTune Amplifier 好消息是,它可以很好地處理多線程,適用於大多數主要語言,適用於 Windows 和 Linux,並且具有許多出色的分析功能。 此外,應用程序本身是免費的。 但是,它僅適用於英特爾處理器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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