gprof показывает каждую функцию как 100%

Я использую модифицированный пакет auditd и связал с ним gprof.

Но из вывода gprof XX | gprof2dot | dot -Tpng output.png все функции используются на 100%, поэтому я не могу сказать, кто потребляет большую часть ресурсов ЦП.

(Щелкните правой кнопкой мыши по изображению, чтобы открыть его полностью)

введите здесь описание изображения

Любые идеи? Это нормально, и самое главное, как я должен знать, какая функция потребляет больше всего ресурсов процессора?

PS: исходный вывод gprof http://pastie.org/8546568


person daisy    schedule 12.12.2013    source источник
comment
Что выводит прямо gprof (без gprof2dot)?   -  person Joe Z    schedule 12.12.2013
comment
@JoeZ обновил вопрос   -  person daisy    schedule 12.12.2013
comment
Как долго работала эта программа? Похоже, он не собирал образцы.   -  person Joe Z    schedule 12.12.2013
comment
@JoeZ в течение 30 секунд, я распечатал журналы, поэтому я знаю, что это работает, затем я отправляю SIGINT, чтобы он завершился   -  person daisy    schedule 12.12.2013
comment
Если вы запустите команду с time, сколько user времени она использует? Если он проводит большую часть своего времени в системных вызовах, сетевом вводе-выводе или дисковом вводе-выводе, он может не собирать никаких выборок.   -  person Joe Z    schedule 12.12.2013
comment
Кроме того, когда вы отправляете SIGINT, есть ли обработчик SIGINT, который завершает программу упорядоченным образом, или он завершает работу без сброса файлов? Возможно, инструментарий gprof не сбросил собранную статистику.   -  person Joe Z    schedule 12.12.2013
comment
@JoeZ это прекращено, я начал аудит на переднем плане, я вижу, что он мирно существует   -  person daisy    schedule 12.12.2013
comment
Мне все еще интересно, является ли проблема SIGINT. Есть ли способ настроить auditd так, чтобы он выходил сам по себе через 30 секунд, а не отправлять SIGINT?   -  person Joe Z    schedule 12.12.2013
comment
Я бы не стал трогать gprof (и эти графики крысиных гнезд). Во-первых, вы задаете неправильный вопрос. Не спрашивайте, какая функция потребляет больше всего ЦП?, что двусмысленно и не имеет значения. Спросите Почему тратится время? Пока вы выполняете SIGINT, используйте gdb и эту технику. Если у вас есть проблемы с производительностью, вы точно увидите, что это такое.   -  person Mike Dunlavey    schedule 12.12.2013
comment
@JoeZ Я использую SIGALRM плюс обработчик для выхода из аудита, тот же результат, поле времени всех функций равно нулю   -  person daisy    schedule 15.12.2013
comment
@warl0ck: Я думаю, я недостаточно ясно выразился. Можете ли вы заставить auditd выйти через exit() или вернуться из main(), не используя сигнал?   -  person Joe Z    schedule 15.12.2013


Ответы (1)


В верхней части плоского профиля (по ссылке pastie.org) находится немедленный ответ:

Flat profile:

Each sample counts as 0.01 seconds.
 no time accumulated

Поскольку все не занимало времени вообще, все занимало столько же времени, сколько и все остальное.

Более интересный вопрос, почему все вообще не заняло времени? Проблема здесь в том, что auditd имеет setuid, и (по крайней мере, в целом) вы не можете профилировать программы с setuid.

(Чтобы получить профиль программы, которая будет иметь setuid, создайте ее не-suid-версию и профилируйте ее. Иногда вам нужно немного настроить внутренности, чтобы заставить ее работать хорошо теперь, когда она не setuid.)

Поковырявшись еще немного, я не знаю, почему это не удается. Linux использует подпрограмму совместимости с libc для имитации системного вызова profil() для gprof. Для этого требуется интервальный таймер ITIMER_PROF на основе SIGPROF, но в целом он должен работать.

Альтернативой является использование OProfile, который является более универсальным (может профилировать системные вызовы) и, возможно, лучше поддерживается в эти дни.

person torek    schedule 12.12.2013
comment
Хм, я начал аудит как root, а не в фоновом режиме. Это не suided .. как вы можете сказать, что ;-P - person daisy; 12.12.2013
comment
Ха, может я ошибаюсь. (У меня нет под рукой Linux, чтобы проверить.) Но он определенно не брал образцы профилей. Теперь я не уверен, почему. Обратите внимание, что плоский профиль имеет количество вызовов, поэтому часть подсчета работает, а не выборка ЦП. - person torek; 12.12.2013
comment
Другая возможность: эта справочная страница подразумевает, что Linux profil является libc, которая использует setitimer(ITIMER_PROF), а не системный вызов. Может быть, auditd сбрасывает таймер? - person torek; 12.12.2013