我想在Linux上剖析我的C++應用程序。 我想知道我的應用程序花費在CPU處理上多少時間與IO處於空閒狀態所花費的時間。如何在Linux上剖析我的C++應用程序
我知道有一個配置文件工具在Linux上調用valgrind。但是它打破了每種方法花費的時間,它並沒有給我一個關於CPU處理和閒置花費多少時間的整體情況?或者有沒有辦法用valgrind做到這一點。
我想在Linux上剖析我的C++應用程序。 我想知道我的應用程序花費在CPU處理上多少時間與IO處於空閒狀態所花費的時間。如何在Linux上剖析我的C++應用程序
我知道有一個配置文件工具在Linux上調用valgrind。但是它打破了每種方法花費的時間,它並沒有給我一個關於CPU處理和閒置花費多少時間的整體情況?或者有沒有辦法用valgrind做到這一點。
我可以推薦valgrind
的callgrind工具結合KCacheGrind進行可視化。 KCacheGrind可以很容易地看到熱點在哪裏。
注意:我使用它的時間太長,所以我不確定您是否能夠獲得I/O等待時間。也許與iostat或pidstat一起,您可以看到所有時間都花在哪裏。
Callgrind只記錄系統時間,而不是空閒時間。 – 2010-05-12 20:40:55
valgrind中的走狗和/或helgrind工具應該允許你這樣做。
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的手冊頁
LTTng是一個用於完整系統分析的好工具。
您可能想看看Zoom,這是比oprofile 等更多的拋光和全功能。它需要花費(199美元),但你可以獲得免費的30天評估許可。
如果你的應用程序只運行「扁平」(即它使用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。我認爲你在尋找哪些信息。
然而,在這個簡單的分析技術分解是:
嗯,我認爲我正在尋找相同的工具,但我必須說這不是非常有用的信息。 問題是找到代碼區域,這是(爲某些現在未知的原因)等待的東西,確定等待的原因,並試圖消除它。例如我有一個三部分的網絡軟件,我需要提高性能,但即使在極端的工作負載下,系統也會花費大部分時間等待。 – 2010-05-13 09:42:15
基本上,程序啓動,並且當它完成,它有一個調用棧中的時間之間。在I/O期間,堆棧在系統調用中終止。在計算過程中,它會以典型的指令結束。
無論哪種方式,如果您可以在隨機掛鐘時間對棧進行採樣,您可以準確瞭解它爲何花費時間。
剩下的唯一的一點是 - 數千個樣本可能會給人一種自信心,但他們不會告訴你比10或20個樣本多得多的樣本。
@Downvoter:小心解釋? – 2010-05-23 19:23:47
google-perf-tools - 更快的替代callgrind(它可以生成與callgrind相同格式的輸出,因此您可以使用KCacheGrind)。
時間+ gprof + valgrind和朋友+ oprofile – Tom 2010-05-12 20:04:51
讓我們說'時間'告訴我我的申請需要20秒。 valgrind如何分解我在CPU處理上花費了多少時間VS在那20秒我閒置了多少時間?我理解valgrind會在CPU處理時分解每個函數的成本。我想知道CPU處理時間與空閒時間之間的比率(等待網絡流量,IO調用等)。 – richard 2010-05-12 20:29:08