簡體   English   中英

如何在Linux上分析我的C ++應用程序

[英]How to profile my C++ application on linux

我想在linux上分析我的c ++應用程序。 我想知道我的應用程序在CPU處理上花費了多少時間與IO /空閑時在塊上花費的時間。

我知道在linux上有一個配置文件工具調用valgrind。 但它打破了在每種方法上花費的時間,並沒有讓我全面了解CPU處理與閑置相比花費了多少時間? 或者有沒有辦法用valgrind做到這一點。

查看oprofile 另外,對於更多系統級診斷,請嘗試systemtap

我可以推薦valgrindcallgrind工具和KCacheGrind一起進行可視化。 KCacheGrind可以很容易地看到熱點的位置。

注意:自從我使用它以來已經太久了,所以我不確定你是否能夠獲得I / O等待時間。 也許與iostatpidstat一起,您將能夠看到所有時間花在哪里。

你可能想看看Zoom ,它比oprofile 更精致,功能更全面。 它需要花錢(199美元),但你可以獲得30天的免費評估許可證。

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

如果你的應用程序只是運行“平坦”(即它使用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應用程序)。 它無法區分等待時鍾的時間和等待磁盤/網絡的時間。
  • 多線程應用程序,需要更多思考解釋數字。

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上的手冊頁

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

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

看這篇文章。

這篇文章。

基本上,在程序啟動和完成之間,它有一個調用堆棧。 在I / O期間,堆棧在系統調用中終止。 在計算期間,它終止於典型指令。

無論哪種方式,如果您可以在隨機的掛鍾時間對堆棧進行采樣,您可以確切地看到為什么要花費那么多時間。

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

暫無
暫無

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

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