簡體   English   中英

使用 linux perf 和不同的調用圖模式分析我的程序會給出不同的結果

[英]Profiling my program with linux perf and different call graph modes gives different results

我想用 linux perf 來分析我的 c++ 程序。 為此,我使用了以下三個命令,但我不明白為什么我會得到三個完全不同的報告。

perf record --call-graph dwarf ./myProg
perf report

在此處輸入圖片說明

perf record --call-graph fp ./myProg
perf report

在此處輸入圖片說明

perf record --call-graph lbr ./myProg
perf report

在此處輸入圖片說明

我也不明白為什么main函數不是列表中的最高函數。

我的程序的邏輯如下, main函數調用getPogDocumentFromFile函數,該函數調用fromPoxml調用toPred調用applySubst調用subst 此外, toPredapplySubstsubst是遞歸函數。 我希望它們成為瓶頸。

更多評論:我的程序運行大約 25 分鍾,它是高度遞歸的並分配了大量(~17Go)內存。 此外,我使用-fno-omit-frame-pointer編譯並使用最新的英特爾 CPU。

任何的想法?

編輯:

再次思考我的問題,我意識到我不明白兒童專欄的含義。

到目前為止,我假設 Self 列是我們在調用堆棧頂部查看的函數的樣本百分比,而 Children 列是調用堆棧中任何位置的函數的樣本百分比。 顯然情況並非如此,否則主函數的子列將離 100% 不遠。 也許調用堆棧被截斷了? 還是我完全誤解了分析器的工作原理?

首選項pref report記錄了調用鏈顯示的子項累積:

 --children Accumulate callchain of children to parent entry so that then can show up in the output. The output will have a new "Children" column and will be sorted on the data. It requires callchains are recorded. See the 'overhead calculation' section for more details. Enabled by default, disable with --no-children.

我可以建議您使用perf report --no-children選項嘗試非默認模式(或perf top -g --no-children -p $PID_OF_PROGRAM

所以在默認模式下,當 perf.data 文件中有一些調用鏈數據時,perf report 會計算“self”和“self+children”的開銷並對累積的數據進行排序。 這意味着如果某個函數f1()有 10% 的“self”樣本並調用了一些帶有 20%“self”樣本的葉函數f2() ,那么f1() self+children 將是 30%。 累積數據適用於提及當前函數的所有堆棧:用於在其本身完成的工作,以及在所有直接和間接子代(后代)中的工作。

您可以在--call-graph選項(dwarf / lbr / fp)中指定一些調用堆棧采樣方法,它們可能有一些限制。 有時方法(尤其是 fp)可能無法提取部分調用堆棧。 -fno-omit-frame-pointer選項可能會有所幫助,但是當它在您的可執行文件中使用而不是在某些帶有回調的庫中時,調用堆棧將被部分提取。 一些很長的調用鏈可能不會被某些方法提取出來。 或者perf report可能無法處理某些情況。

要檢查截斷的調用鏈樣本,請在中間的某個地方使用perf script|less 在這種模式下,它會使用所有檢測到的函數名稱打印每個記錄的樣本,檢查不以main__libc_start_main結尾的樣本 - 它們被截斷。

否則主函數的子列就會離 100% 不遠

是的,對於單線程程序和正確記錄和處理的調用堆棧, main在“Children”列中應該有 99% 之類的東西。 對於多線程程序,第二個和其他線程將有另一個根節點,如 start_thread。

暫無
暫無

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

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