linux perf: как интерпретировать и находить горячие точки

Я попробовал сегодня утилиту linux perf , и у меня возникли проблемы с интерпретацией ее результатов. Я привык к callgrind valgrind, который, конечно же, представляет собой совершенно другой подход к основанному на выборке методу perf.

Что я сделал:

perf record -g -p $(pidof someapp)
perf report -g -n

Теперь я вижу что-то вроде этого:

+     16.92%  kdevelop  libsqlite3.so.0.8.6               [.] 0x3fe57                                                                                                              ↑
+     10.61%  kdevelop  libQtGui.so.4.7.3                 [.] 0x81e344                                                                                                             ▮
+      7.09%  kdevelop  libc-2.14.so                      [.] 0x85804                                                                                                              ▒
+      4.96%  kdevelop  libQtGui.so.4.7.3                 [.] 0x265b69                                                                                                             ▒
+      3.50%  kdevelop  libQtCore.so.4.7.3                [.] 0x18608d                                                                                                             ▒
+      2.68%  kdevelop  libc-2.14.so                      [.] memcpy                                                                                                               ▒
+      1.15%  kdevelop  [kernel.kallsyms]                 [k] copy_user_generic_string                                                                                             ▒
+      0.90%  kdevelop  libQtGui.so.4.7.3                 [.] QTransform::translate(double, double)                                                                                ▒
+      0.88%  kdevelop  libc-2.14.so                      [.] __libc_malloc                                                                                                        ▒
+      0.85%  kdevelop  libc-2.14.so                      [.] memcpy 
...

Хорошо, эти функции могут работать медленно , но как мне узнать, откуда им звонят? Поскольку все эти горячие точки находятся во внешних библиотеках, я не вижу возможности оптимизировать свой код.

В основном я ищу какой-то граф вызовов, аннотированный накопленной стоимостью, где мои функции имеют более высокую инклюзивную стоимость выборки, чем библиотечные функции, которые я вызываю.

Возможно ли это с perf? Если да, то как?

Примечание: я обнаружил, что «E» разворачивает граф вызовов и дает немного больше информации. Но граф вызовов часто бывает недостаточно глубоким и / или завершается случайным образом без предоставления информации о том, сколько информации было потрачено и где. Пример:

-     10.26%  kate  libkatepartinterfaces.so.4.6.0  [.] Kate::TextLoader::readLine(int&...
     Kate::TextLoader::readLine(int&, int&)                                            
     Kate::TextBuffer::load(QString const&, bool&, bool&)                              
     KateBuffer::openFile(QString const&)                                              
     KateDocument::openFile()                                                          
     0x7fe37a81121c

Может быть проблема, что я использую 64-разрядную версию? См. Также: http://lists.fedoraproject.org/pipermail/devel/2010-November/144952.html (я не использую Fedora, но, похоже, применим ко всем 64-битным системам).

43
задан Benjamin 8 July 2014 в 16:40
поделиться