URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4845
[ Назад ]

Исходное сообщение
"Профилирование программ"

Отправлено DeadMustdie , 15-Ноя-05 18:46 
Каким профилировщиком можно получить данные о времени выполнения программы в разбивке по функциям, с учётом времени выполнения непрофилированных функций и вызовов ядра? Сколько я gprof ни ковырял, нужного эффекта не получил - считает только время исполнения профилированного кода (собственно, счёт), без учёта, например, затрат времени на исполнение внешней непрофилированной библиотеки.

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


Содержание

Сообщения в этом обсуждении
"Профилирование программ"
Отправлено ACCA , 15-Ноя-05 21:29 
>время исполнения профилированного кода (собственно, счёт), без учёта, например, затрат времени
>на исполнение внешней непрофилированной библиотеки.

Этот вопрос имеет смысл только в real-time OS. Для обычных систем управление может в любой момент уйти к другому процессу, особенно кому-нибудь вроде kswapd, ksoftirq или kjornald.

Посмотри http://oprofile.sourceforge.net, man time


"Профилирование программ"
Отправлено DeadMustdie , 15-Ноя-05 21:51 
>Этот вопрос имеет смысл только в real-time OS. Для обычных систем
>управление может в любой момент уйти к другому процессу, особенно
>кому-нибудь вроде kswapd, ksoftirq или kjornald.

Здесь весь вопрос в необходимой точности измерений и условиях их
проведения. Меня, например, сильно интересуют сравнительные затраты
времени на исполнение разных SQL-команд, вызываемых в весьма большом
количестве из моей программы. Расставить счётчики вручную можно, но
безбожно хлопотно. И результаты потом обрабатывать нетривиально:
call graph сооружать - геморрой преизрядный.

Вот и хотелось бы найти софтину, которая хотя бы на границах функций
главного, управляющего модуля тайминги померяла, поглядела структуру
вызовов и выдала отчётЪ. A la то, что даёт gprof, только с учётом
затрат времени на "внешние", непрофилируемые вызовы. Пусть даже с
погрешностями - вызовы крупные, на незагруженной посторонними
задачами машинке погрешность будет небольшая.

>Посмотри http://oprofile.sourceforge.net, man time

Про time оно понятно, а вот oprofile - слегка накрученный вариант
на тему gprof. Не то.

В любом случае спасибо за ответ.


"Профилирование программ"
Отправлено ACCA , 15-Ноя-05 23:07 
>проведения. Меня, например, сильно интересуют сравнительные затраты
>времени на исполнение разных SQL-команд, вызываемых в весьма большом
>количестве из моей программы. Расставить счётчики вручную можно, но

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


"Профилирование программ"
Отправлено DeadMustdie , 15-Ноя-05 23:18 
>Это вообще из SQL-сервера проще выцепить.

Интересно, как? Меня слабо интересует, как оптимизировать какой-то один
конкретный запрос, мне интересно, какие многократно исполняемые запросы
пожирают время исполнения моей программы?

>Если же хочется именно из программы, то я бы сделал макро,
>который вставит необходимый код вокруг SQL-вызова.

Запросов штук двести. Около каждого писать по макросу, да ничего при
этом не сломать, да результат иерархически разложить по процедурам -
работы на неделю. Причём работы весьма трудоёмкой и тупой.


"Профилирование программ"
Отправлено ACCA , 15-Ноя-05 23:38 
>>Это вообще из SQL-сервера проще выцепить.
>
>Интересно, как? Меня слабо интересует, как оптимизировать какой-то один

grep + awk


>Запросов штук двести. Около каждого писать по макросу, да ничего при

Чуть проще - заменить вызов SQL макросом, который определить один на всех. Макрос допустим сваливает в дамп текст запроса + имя модуля + номер строки + время.


"Профилирование программ"
Отправлено DeadMustdie , 16-Ноя-05 15:54 
>grep + awk

Над данными трассировки СУБД? Хм, вариант. Правда, здесь уже можно получить
искажение реальной картины, так как включение трассировки исполнения
запросов значительно тормозит работу. Во всяком случае, в ORACLE.

>Чуть проще - заменить вызов SQL макросом, который определить один на всех.
>Макрос допустим сваливает в дамп текст запроса + имя модуля +
>номер строки + время.

Видимо, так и придётся. Если тулза не найду.


"Профилирование программ"
Отправлено MaximKuznetsov , 16-Ноя-05 21:16 
ltrace - трассировка библиотечных вызовов,
strace - системных..
возможно ещё понадобится пачка скриптов чтоб соотнести их вывод
с текстом программы и результатом gprof



"Профилирование программ"
Отправлено ACCA , 17-Ноя-05 17:05 
>ltrace - трассировка библиотечных вызовов,
>strace - системных..

В них времени нет. А "соотносить результаты" - совсем нетривиальная задача.


"Профилирование программ"
Отправлено horsh , 20-Ноя-05 19:36 
>Каким профилировщиком можно получить данные о времени выполнения программы в разбивке по
>функциям, с учётом времени выполнения непрофилированных функций и вызовов ядра? Сколько
>я gprof ни ковырял, нужного эффекта не получил - считает только
>время исполнения профилированного кода (собственно, счёт), без учёта, например, затрат времени
>на исполнение внешней непрофилированной библиотеки.
>
>Понятно, что можно вручную расставить таймеры, но программа большая, и хотелось бы
>минимизировать ручную работу при поиске как раз тех самых мест, где
>оные таймеры и нужны.

это делается с помощью Performance Analyzer из Sun Studio. он бесплатный.

там есть программа collect для сборки семплов
что-то типа
$collect myprog myarg1 myarg2
потом можно запустить гуевый analyzer и он покажет все, что вас интересует.
Вместо гуевего аналайзера можно использовать CLI утилиты er_print с друзьями.

Для профилировки ядра есть er_kernel он сидит поверх Dtrace и собирает семплинг кернельлэнда. Чтоб профилировать и ядро и юзерлэнд можно запустить так:

$er_kernel collect myprog myarg1 myarg2
все соберется вместе.

доки тут: http://docs.sun.com/app/docs/doc/819-3687
качать тут: https://sdlcweb1b.sun.com/ECom/EComActionServlet;jsessionid=...


"Профилирование программ"
Отправлено DeadMustdie , 20-Ноя-05 21:13 
Спасибо за наводку. Попробую. Если сработает, в очередной раз подтвердится моё старое убеждение, что Sun - rulez.

"Профилирование программ"
Отправлено DeadMustdie , 16-Дек-05 14:06 
>это делается с помощью Performance Analyzer из Sun Studio. он бесплатный.

Похоже, что не делается. Проблема в том, что оный analyzer точно так же, как и прочие испробованные мной тулзы, не выдаёт время реального выполнения тех или иных функций. В счётчики накапливается только время, в течение которого данная программа жрала процессорное время. Что для моих целей непригодно.

Жаль.


"Профилирование программ"
Отправлено horsh , 22-Дек-05 21:59 
>>это делается с помощью Performance Analyzer из Sun Studio. он бесплатный.
>
>Похоже, что не делается. Проблема в том, что оный analyzer точно так
>же, как и прочие испробованные мной тулзы, не выдаёт время реального
>выполнения тех или иных функций. В счётчики накапливается только время, в
>течение которого данная программа жрала процессорное время. Что для моих целей
>непригодно.

В аналайзере это называется
"Total LWP time, hich is the real time, summed across threads"

нужно галочку в View->Set Data Presentation поставить.

кроме того имеет смысл пораспросить товарищей вот тут:
http://forum.sun.com/forum.jspa?forumID=256