pprof говорит мне, что getaliasbyname_r () занимает 56% процессорного времени? - PullRequest
2 голосов
/ 24 ноября 2011

Я использую google-perftools для профилирования моей программы, написанной на C ++ и скомпилированной с g ++ 4.5.2. pprof говорит мне, что getaliasbyname_r() заняло 56% процессорного времени! Что на земле делает getaliasbyname_r()? Почему это занимает так много времени процессора? Есть ли способ облегчить эту проблему? Благодарю. Флаги похвалы были: -O3 -DNDEBUG -Wall -Wno-deprecated -Wno-sign-compare. Система: Ubuntu 11.04.

Извините, что не прояснил вопрос. Я непосредственно не использовал getaliasbyname_r () в своем коде. На графике вызовов, сгенерированном инструментом профилирования "pprof", я вижу дерево " start -> _libc_start_main -> main -> ...", насчитывающее около 44% времени процессора. Помимо этого большого дерева, в графе вызовов есть еще одно изолированное одноузловое дерево - getaliasbyname_r. Как показано на графике, он не вызывал и не вызывал никакие другие функции. Я погуглил эту функцию и привел к http://linux.die.net/man/3/getaliasbyname_r. Но это не сильно помогло. Я до сих пор не имею представления о том, как getaliasbyname_r () был вызван и почему это заняло так много времени. Имеет ли смысл этот вопрос сейчас?

В ответ Адриану: Спасибо за ваш ответ. Общее время выполнения составило около 28 секунд. Профилировщик образцов со скоростью 100 / сек. Всего было около 2800 образцов. Около 1500 выпало в getaliasbyname_r (), придумав написанную мной функцию (отловил около 450 сэмплов).

Ответы [ 2 ]

3 голосов
/ 06 марта 2013

Эта проблема часто возникает, если у вас нет символов для libc6.getaliasbyname_r экспортируется из libc6, но многие внутренние функции не экспортируются, и многие из этих внутренних функций косвенно вызываются вашим кодом и появляются после getaliasbyname_r в двоичном файле.

Поэтому, когда профилировщик выполняет поиск символов, он неверно присваиваетвремя неправильной функции.Упс.

Решение состоит в том, чтобы установить символы и затем повторить попытку.http://randomascii.wordpress.com/2013/01/08/symbols-on-linux-part-one-g-library-symbols/

0 голосов
/ 24 ноября 2011

Из того, что я мог найти, getaliasbyname_r использует что-то под названием Name Service Switch, которое похоже на какую-то удаленную службу (немного похоже на DNS).

Во-вторых, измеренное здесь время, по-видимому, не соответствует фактическому использованию процессора.

Так что я думаю, что getaliasbyname_r просто ожидает ответа от какой-либо сетевой службы, и это отнимает много времени, а процессор фактически простаивает большую часть этого времени (последняя часть неверна в большинстве операционных систем). поскольку процессор просто позаботится о других задачах, но ваше приложение «застрянет» в getaliasbyname_r до тех пор, пока не придет ответ от NSS).

...