Как профилировать многопоточное приложение C ++ в Linux?

Раньше я делал все свое профилирование Linux с помощью gprof.

Однако в моем многопоточном приложении его результаты кажутся несовместимыми.

Теперь я откопал это:

http://sam.zoy.org/writings/programming/gprof.html

Однако это было сделано очень давно, и в моем выводе gprof, похоже, мой gprof перечисляет функции, используемые неосновными потоками.

Итак, мои вопросы:

  1. Могу ли я легко использовать gprof для профилирования многопоточных приложений Linux C ++ в 2010 году? (Ubuntu 9.10)
  2. Какие еще инструменты мне следует использовать для профилирования?

person anon    schedule 23.03.2010    source источник
comment
Желательно то, что не тормозит так сильно, как valgrind.   -  person anon    schedule 23.03.2010
comment
Подскажите, пожалуйста, альтернативы, но не альтернативы. Проверять.   -  person dmckee --- ex-moderator kitten    schedule 23.03.2010
comment
ну, вам нужен профилировщик, профилировщик загружает приложение в ваш двоичный файл и добавляет дополнительные хуки для отслеживания выполнения, поэтому он всегда будет медленнее, чем если вы запустите его без valgrind. По какой причине у вас проблемы с замедлением? Я думаю, что valgrind использовался для профилирования некоторых больших приложений, и у него не было проблем - если у вас нет причины, по которой он не может работать медленнее во время профилирования.   -  person stefanB    schedule 23.03.2010
comment
@stefanB: замедление от gprof с g ++ s -pg в порядке; замедление valgrind как минимум в 10 раз   -  person anon    schedule 23.03.2010
comment
Итак, когда вы запускаете gprof vs valgrind, получаете ли вы огромную разницу в результатах? Или вам просто не нравится, что он работает медленнее? Я имею в виду, что могут быть веские причины, по которым вы не можете использовать более медленный профилировщик, но я предполагаю, что вы хотите видеть, на что ваше приложение тратит время.   -  person stefanB    schedule 23.03.2010
comment
@dmckee @stefanB почему ты такой резкий? Совершенно верно, что valgrind очень сильно замедляет работу программы. Я, например, тоже использую самый быстрый профилировщик, если у меня есть выбор.   -  person Laurynas Biveinis    schedule 23.03.2010
comment
Замедление особенно раздражает, когда у вас есть программы с таймерами ... нам нужно увеличить все наши значения тайм-аута на 10, когда мы запускаем valgrind для отслеживания утечек памяти, что раздражает: /   -  person Matthieu M.    schedule 23.03.2010
comment
@Laurynas: Потому что задавать вопросы, а затем менять условия после, когда начинают поступать ответы, является нормой для курса с этим OP. Потому что вопрос на самом деле не отстой, но подход плаката бесполезен. Потому что, если он уже знал, что valgrind не подходит для этого использования, и не упомянул об этом, он делает это неправильно.   -  person dmckee --- ex-moderator kitten    schedule 23.03.2010
comment
Valgrind очень лоялен к бренду, несмотря на то, что он в 10 раз медленнее. Проблема в том, что он не замедляет ввод-вывод пропорционально, поэтому, если обычно 30% времени тратится на ненужный ввод-вывод, в Valgrind это будет выглядеть только как 3%.   -  person Mike Dunlavey    schedule 23.03.2010
comment
@dmckee Понятно. Я предположил, что OP просто забыл сообщить обо всех ограничениях, что-то, что происходит со мной все время, но я полагаю, что я слишком великодушен, чтобы не сомневаться.   -  person Laurynas Biveinis    schedule 24.03.2010
comment
@everyone: я пытаюсь профилировать интерактивное приложение OpenGL, работающее со скоростью 30 кадров в секунду. 10-кратное замедление недопустимо. dmckee: вы правы в том, что это требование никогда не было заявлено в исходной задаче.   -  person anon    schedule 24.03.2010


Ответы (11)


Изменить: добавлен еще один ответ на профайлер бедняги, который ИМХО лучше для многопоточных приложений.

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

person Laurynas Biveinis    schedule 23.03.2010
comment
Zoom (загрузить с rotateright.com) основан на профиле и значительно упрощает понимание данных. - person federal; 12.09.2011
comment
@federal Похоже, что вы должны быть пользователем root, чтобы установить Zoom + _ + - person Alaya; 10.05.2015
comment
К сожалению, RotateRight прекратил поддержку Zoom и не выпустил исходный код. - person Omnifarious; 21.08.2018

Взгляните на профайлер для бедняков. Удивительно, но есть несколько других инструментов, которые для многопоточных приложений выполняют как профилирование процессора, так и профилирование конфликтов мьютексов, и PMP делает и то, и другое, даже не требуя ничего устанавливать (если у вас есть gdb).

person Laurynas Biveinis    schedule 13.09.2011

Взгляните на Valgrind.

person stefanB    schedule 23.03.2010
comment
Проблема, которая привела меня к этому потоку, - это странные различия в расписании Callgrind и тот факт, что он выполняет все в одном потоке. Я пытаюсь найти узкие места в своих атомарных операциях и спин-блокировках. Однопоточная обработка всего убивает конфликты и проблемы с производительностью, которые могут вызвать. Таким образом, Valgrind, вопреки моему желанию, не всегда является предпочтительным профилировщиком. - person James Matta; 06.12.2017

Взгляните на Zoom.

person Paul R    schedule 23.03.2010
comment
Кажется, что если я не рут, я не могу его установить. - person Alaya; 15.05.2015

Пол Р сказал, взгляните на Zoom. Вы также можете использовать lsstack, который является низкотехнологичным подходом, но удивительно эффективным, по сравнению с gprof.

Добавлено: поскольку вы пояснили, что используете OpenGL на скорости 33 мс, моя предыдущая рекомендация остается в силе. Кроме того, то, что я лично делал в подобных ситуациях, одновременно эффективно и не интуитивно понятно. Просто запустите его с типичной или проблемной рабочей нагрузкой, остановите его вручную и посмотрите, что он делает и почему. Сделайте это несколько раз. Теперь, если он только иногда плохо себя ведет, вы хотели бы остановить его только тогда, когда он плохо себя ведет. Это непросто, но я использовал прерывание от будильника для правильной задержки. Например, если один кадр из 100 занимает более 33 мс, в начале кадра установите таймер на 35 мс, а в конце кадра выключите его. Таким образом, он будет прерываться только тогда, когда код занимает слишком много времени, и покажет вам, почему. Конечно, один образец может пропустить виновный код, но 20 образцов его не пропустят.

person Mike Dunlavey    schedule 23.03.2010

Попробуйте современный инструмент профилирования Linux, perf (perf_events): https://perf.wiki.kernel.org/index.php/Tutorial и http://www.brendangregg.com/perf.html:

perf record ./application
# generates profile file perf.data
perf report
person osgx    schedule 30.05.2017

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

Вы можете объединить эти знания с strace или truss (Solaris) для отслеживания системных вызовов и pmap для печати памяти.

Если приложение работает в выделенной системе, у вас также есть sar для измерения ЦП, памяти, ввода-вывода и т. Д. Для профилирования всей системы.

person Jose Manuel Gomez Alvarez    schedule 15.12.2016
comment
Проверьте сообщения Майка Данлави, получившие наибольшее количество голосов, stackoverflow.com/users/23771/mike-dunlavey, где он доказал, что 5 образцов стека вызовов (gdb, pstack или ...) статистически достаточно. Кроме того, 400 сообщений в теге профилирования: stackoverflow.com/search?q=user:23771 % 20 [profiling]% 20is: ответ - person osgx; 30.05.2017

Поскольку вы не упомянули некоммерческий, могу предложить Intel VTune. Это не бесплатно, но уровень детализации очень впечатляет (а накладные расходы незначительны).

person rustyx    schedule 30.05.2017

С другой стороны, вы можете получить довольно хорошее представление о том, что происходит в многопоточном приложении, используя ftrace и kernelshark. Собирая правильную трассировку и нажимая правильные кнопки, вы можете видеть планирование отдельных потоков.

В зависимости от ядра вашего дистрибутива вам, возможно, придется собрать ядро ​​с правильной конфигурацией (но я думаю, что многие из них уже построили его в наши дни).

person bazza    schedule 06.09.2018

Microprofile - еще один возможный ответ на этот вопрос. Для этого требуется ручная обработка кода, но похоже, что он довольно хорошо справляется с многопоточным кодом. И у него также есть специальные крючки для профилирования графических конвейеров, включая то, что происходит внутри самой карты.

person Omnifarious    schedule 06.09.2018

Я пробовал valgrind и gprof. Очень жаль, что ни один из них не работает с многопоточными приложениями. Позже я нашел Intel VTune Amplifier. Хорошо то, что он хорошо справляется с многопоточностью, работает с большинством основных языков, работает в Windows и Linux и имеет множество отличных функций профилирования. Более того, само приложение бесплатное. Однако он работает только с процессорами Intel.

person Shashank Avusali    schedule 18.07.2019