Ответ 1
Я рекомендую принимать stackshots, для которых полезно pstack. Вот еще информация:
Если вы хотите потратить деньги, Zoom выглядит довольно неплохим инструментом.
Каковы наилучшие инструменты для профилирования приложений C/С++ на * nix?
(Я надеюсь профилировать сервер, представляющий собой сочетание (блокирующего) файла IO, epoll для сети и fork()/execv() для некоторого тяжелого подъема, но общая помощь и более общие инструменты также приветствуются.)
Можете ли вы получить большое системное изображение ОЗУ, ЦП, сети и диска в одном обзоре и развернуть его?
Было много разговоров о списках ядра о таких вещах, как perf timechart
, но я еще ничего не нашел в Ubuntu.
Я рекомендую принимать stackshots, для которых полезно pstack. Вот еще информация:
Если вы хотите потратить деньги, Zoom выглядит довольно неплохим инструментом.
Для повышения производительности вы можете попробовать Callgrind, инструмент Valgrind. Вот хорошая статья, показывающая его в действии.
Канонический пример полного инструмента профилирования системы (для Solaris, OS X, FreeBSD) DTrace. Но он еще не полностью доступен в Linux (вы можете попробовать здесь, но сайт сейчас для меня не работает, и у меня нет попробовал сам). Существует множество инструментов в различных состояниях полезности для полного профилирования системы и профилирования ядра в Linux.
Вы можете рассмотреть возможность изучения:
Allinea MAP является профилировщиком для С++ и других родных языков в Linux. Он коммерчески поддерживается моим работодателем. Он имеет графический интерфейс и профилирование уровня исходного кода и профилирует код практически без замедления, что делает его очень точным, когда релевантность времени в других подсистемах - например, для ввода-вывода.
Callgrind был полезен и точным, но замедление было ~ 5x, поэтому я мог выполнять только небольшие тиражи. Он может фактически подсчитать количество раз, когда функция вызывается, что полезно для понимания асимптотического поведения.
Скомпилируйте с -pg, запустите программу, а затем используйте gprof
Компиляция (и связывание) с -pg добавляет к исполняемому файлу код профилирования и библиотеки профилирования, который затем создает файл gmon.out, который содержит информацию о времени. gprof отображает графики вызовов и их (абсолютные и относительные) тайминги.
Подробнее см. man gprof
.
Если вы можете принять ваше приложение во FreeBSD, OS X или Solaris, вы можете использовать dtrace, хотя dtrace - это инструмент, ориентированный на аналитик, т.е. вам нужно управлять им - читайте: script. Ничто другое не может дать вам уровень детализации, который вам нужен; Dtrace не может просто профилировать задержки вызовов функций в пользовательской зоне; он также может следовать за контекстным переключателем в ядро.
oprofile может вас заинтересовать. Ubuntu должен иметь все необходимые вам пакеты.
Как уже упоминалось в принятом ответе, Zoom может сделать некоторые удивительные вещи. Я использовал его для понимания поведения потоков вплоть до оптимизации сборки, сгенерированной компилятором.
Описание использования -gp и gproff здесь http://www.ibm.com/developerworks/library/l-gnuprof.html
Ответ FOSS, как уже упоминалось, заключается в создании с -pg, а затем с помощью gprof для анализа вывода. Если это продукт/проект, который оправдывает бросание денег, у меня также возникнет соблазн использовать профилировщик IBM/Rationals Quantify, так как это упростит просмотр данных профилирования, развернется до уровня линии или просмотрит его в "10000ft Уровень.
Конечно, может быть доступен просмотрщик gprof, который может делать то же самое, но я ничего не знаю.