2010-05-12 2 views
15

Я хотел бы профайл my C++ application on linux. Я хотел бы узнать, сколько времени мое приложение потратило на обработку ЦП и время, затраченное на блокирование IO/бездействия.Как профилировать мое приложение на C++ на linux

Я знаю, что есть инструмент для вызова профиля valgrind on linux. Но это ломает время, затрачиваемое на каждый метод, и это не дает мне общую картину того, сколько времени потрачено на обработку ЦП против простоя? Или есть способ сделать это с valgrind.

+4

время + gprof + valgrind & friends + oprofile – Tom

+0

Скажите «время» скажите мне, что мое приложение занимает 20 секунд. Как разбивка valgrind, сколько времени я трачу на обработку ЦП VS сколько времени за эти 20 секунд я простаиваю? Я понимаю, что valgrind ломает стоимость каждой функции, когда процессор обрабатывает. Я хочу узнать соотношение между временем обработки процессорного времени VS (ожидание сетевого трафика, вызовы ввода-вывода и т. Д.). – richard

ответ

3

Я могу порекомендовать valgrindcallgrind в сочетании с KCacheGrind для визуализации. KCacheGrind позволяет легко увидеть, где находятся горячие точки.

Примечание: Это было слишком долго, так как я использовал его, поэтому я не уверен, что вы сможете получить время ожидания ввода-вывода. Возможно, в сочетании с iostat или pidstat вы сможете увидеть, где все время было потрачено.

+0

Callgrind только записывает системное время, а не время простоя. –

6

Отъезд oprofile. Также для более подробной диагностики системного уровня попробуйте systemtap.

+0

Проблема win OProfile - это только измерение времени процессора. Время, заблокированное при IO или системных вызовах, не будет отображаться в его отчетах. –

+0

@Caspin: вы можете вычесть io-time из часов настенных часов. – florin

0

Инструменты лакей и/или helgrind в valgrind должны позволить вам сделать это.

1

callgrind - очень хороший инструмент, но я нашел OProfile для меня более «полным». Кроме того, это единственный, который позволяет вам указать модуль и/или источник ядра, чтобы глубже понять ваши узкие места. Предполагается, что выход может взаимодействовать с KCacheGrind, но у меня были проблемы с этим, поэтому вместо этого я использовал Gprof2Dot. Вы можете экспортировать свой callgraph в .png.

Edit:

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

+0

Что такое 'vmlinux'? Где я могу найти его? – richard

2

LTTng - хороший инструмент для полного профилирования системы.

3

Возможно, вы захотите ознакомиться с Zoom, который является намного более полированным и полнофункциональным, чем oprofile. и др.. Это стоит денег ($ 199), но вы можете получить бесплатную 30-дневную оценочную лицензию.

2

Если ваше приложение просто запускает «плоский выход» (то есть оно либо использует процессор, либо ожидает ввода-вывода), пока оно не выйдет, и нет других конкурирующих процессов, просто выполните time myapp (или, возможно, /usr/bin/time myapp, другой выход для встроенной оболочки).

Это поможет вам что-то вроде:

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

В этом случае, пользователь + SYS (ядро) время счета для почти всех реального времени и есть только 0.068s неучтенных ... (вероятно, время, затраченное сначала загружать приложение и его поддерживающие библиотеки).

Однако, если вы должны были видеть:

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

тогда ваше приложение потратил 4.51s не потребляя процессор и, предположительно, блокируется на IO. Какую информацию я думаю, что вы ищете.

Однако, когда этот простой метод анализа расщепляет является:

  • приложения, которые ждут на таймер/часы или других внешних стимулов (например управляемых событиями GUI приложений). Не может различать время ожидания на часах и время ожидания на диске/сети.
  • Многопоточные приложения, которые требуют немного больше размышлений об интерпретации чисел.
+0

Ну, я думаю, что я ищу тот же инструмент, но должен сказать, что это не очень информативный пост. Проблема заключается в том, чтобы найти области кода, которые (по какой-то неизвестной причине) ждут чего-то, определяют причины ожидания и пытаются его устранить. Например, у меня есть сетевое программное обеспечение с тремя частями, мне нужно улучшить производительность, но даже при экстремальной нагрузке система тратит большую часть времени на ожидание. –

-1

See this post.

And this post.

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

В любом случае,, если вы можете опробовать стек случайным образом, вы можете точно увидеть, почему он тратит это время.

Единственная оставшаяся точка - тысячи образцов могут дать чувство уверенности, но они не скажут вам больше, чем 10 или 20 образцов.

+0

@Downvoter: Позаботьтесь, чтобы объяснить? –

0

google-perf-tools - гораздо более быстрая альтернатива callgrind (и она может генерировать выходные данные в том же формате, что и callgrind, поэтому вы можете использовать KCacheGrind).