Подтвердить что ты не робот

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

Я использовал все профилирование Linux с помощью gprof.

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

Посмотрите Valgrind.

Ответ 5

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

Ответ 7

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

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

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

Ответ 8

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