2010-05-12 78 views
15

我想在Linux上剖析我的C++應用程序。 我想知道我的應用程序花費在CPU處理上多少時間與IO處於空閒狀態所花費的時間。如何在Linux上剖析我的C++應用程序

我知道有一個配置文件工具在Linux上調用valgrind。但是它打破了每種方法花費的時間,它並沒有給我一個關於CPU處理和閒置花費多少時間的整體情況?或者有沒有辦法用valgrind做到這一點。

+4

時間+ gprof + valgrind和朋友+ oprofile – Tom 2010-05-12 20:04:51

+0

讓我們說'時間'告訴我我的申請需要20秒。 valgrind如何分解我在CPU處理上花費了多少時間VS在那20秒我閒置了多少時間?我理解valgrind會在CPU處理時分解每個函數的成本。我想知道CPU處理時間與空閒時間之間的比率(等待網絡流量,IO調用等)。 – richard 2010-05-12 20:29:08

回答

3

我可以推薦valgrindcallgrind工具結合KCacheGrind進行可視化。 KCacheGrind可以很容易地看到熱點在哪裏。

注意:我使用它的時間太長,所以我不確定您是否能夠獲得I/O等待時間。也許與iostatpidstat一起,您可以看到所有時間都花在哪裏。

+0

Callgrind只記錄系統時間,而不是空閒時間。 – 2010-05-12 20:40:55

6

結賬oprofile。對於更多系統級診斷,請嘗試systemtap

+0

問題贏得OProfile它只測量CPU時間。 IO上阻塞的時間或系統調用不會顯示在其報告中。 – 2010-05-12 20:08:08

+0

@Caspin:你可以從掛鐘時間中扣除io時間。 – florin 2010-05-12 21:10:49

0

valgrind中的走狗和/或helgrind工具應該允許你這樣做。

1

callgrind是一個非常好的工具,但我發現OProfile更加'完整'。此外,它是唯一允許您指定模塊和/或內核源代碼以便更深入地洞察瓶頸的人。輸出應該能夠與KCacheGrind接口,但是我遇到了麻煩,所以我使用了Gprof2Dot。您可以將您的調用圖導出爲.png。

編輯:

OProfile的着眼於整個系統,這樣的過程將只是:

[設置oprofile的]

opcontrol --init 
opcontorl --vmlinux=/path/to/vmlinux  (or --no-vmlinux) 
opcontrol --start 

運行[這裏您的應用程序]

opcontrol --stop (or opcontrol --shutdown [man for difference] 

然後開始看結果看看opreport的手冊頁

+0

我是否需要使用特殊標誌來編譯我的程序以使OProfile正常工作? – richard 2010-05-12 20:35:08

+0

'vmlinux'是什麼?我在哪裏可以找到它? – richard 2010-05-13 00:16:13

2

LTTng是一個用於完整系統分析的好工具。

3

您可能想看看Zoom,這是比oprofile 更多的拋光和全功能。它需要花費(199美元),但你可以獲得免費的30天評估許可。

2

如果你的應用程序只運行「扁平」(即它使用CPU或等待I/O),直到它退出,並且沒有其他進程在競爭,只需要執行time myapp(或者可能是/usr/bin/time myapp,不同的輸出到shell內置)。

這將讓你像:

real 0m1.412s 
user 0m1.288s 
sys  0m0.056s 

在這種情況下,用戶+ SYS(內核)的時間佔幾乎所有的實時而且也只是0.068s下落不明......(大概花費的時間初始加載應用程序及其支持的庫)。

但是,如果你看看:

real 0m5.732s 
user 0m1.144s 
sys  0m0.078s 

那麼你的應用程序花費了4.51s不消耗CPU想必阻塞IO。我認爲你在尋找哪些信息。

然而,在這個簡單的分析技術分解是:

  • 應用該等待一個計時器/時鐘或其他 外部刺激(例如 事件驅動GUI應用程序)。它不能 區分等待時鐘 的時間和在磁盤/網絡上等待的時間。
  • 多線程應用程序,需要更多的思考解釋數字。
+0

嗯,我認爲我正在尋找相同的工具,但我必須說這不是非常有用的信息。 問題是找到代碼區域,這是(爲某些現在未知的原因)等待的東西,確定等待的原因,並試圖消除它。例如我有一個三部分的網絡軟件,我需要提高性能,但即使在極端的工作負載下,系統也會花費大部分時間等待。 – 2010-05-13 09:42:15

-1

See this post.

And this post.

基本上,程序啓動,並且當它完成,它有一個調用棧中的時間之間。在I/O期間,堆棧在系統調用中終止。在計算過程中,它會以典型的指令結束。

無論哪種方式,如果您可以在隨機掛鐘時間對棧進行採樣,您可以準確瞭解它爲何花費時間。

剩下的唯一的一點是 - 數千個樣本可能會給人一種自信心,但他們不會告訴你比10或20個樣本多得多的樣本。

+0

@Downvoter:小心解釋? – 2010-05-23 19:23:47

0

google-perf-tools - 更快的替代callgrind(它可以生成與callgrind相同格式的輸出,因此您可以使用KCacheGrind)。