[Из песочницы] Профилирование под Linux с помощью Performance Analyzer
Коллеги, считаю полезным рассказать об удобном и бесплатном профилировщике кода для Linux/Solaris. Он входит в пакет Sun/Oracle Developer Studio [1]. По моему мнению, другие части этой среды разработки несколько бесполезны, но профилировщик, который называется Performance Analyzer, очень удачный. Он прост в использовании, наглядно и удобно устроен анализ результатов. На мой взгляд, профилировщик все еще превосходит многие аналоги под Linux. При наличии этого инструмента использование gprof видится странной прихотью и потерей времени.
Если вы не планируете использовать Performance Analyzer немедленно, то дальше можно не читать. Просто запомните, что такой продукт существует. Если же интересно взглянуть, то добро пожаловать.
Профилировщик состоит из двух частей: collect — запускает приложение и собирает данные, записывает результаты эксперимента; analyzer — графический интерфейс, зачитывает данные эксперимента и предоставляет возможности для удобного анализа горячих точек и деревьев вызовов функций.
Коротко о важных преимуществах и недостатках:
Плюсы:
- бесплатный;
- не требует перекомпиляции кода и перелинковки исполняемого файла;
- работает с компиляторами gnu и sun;
- не меняет времени исполнения программы при сборе данных;
- обладает интуитивно понятным графическим интерфейсом;
- оснащен развитым интерфейсом командной строки для автоматического анализа;
- позволяет быстро взглянуть на результат работы компилятора;
- имеет статистический профилировщик, который достаточно точен даже для не особенно трудоемких кусков;
- удобно сделан анализ и сравнительный анализ нескольких запусков программы;
- не искажает результаты.
Некоторые минусы:
- rрафический интерфейс написан на Java. Иногда падает при загрузке, простой перезапуск помогает;
- измеряет только CPU время если есть возможность поправить ядро, то это ограничение можно снять;
- в многопоточных приложениях время, занимаемое функцией, — сумма времен, проведенных в этой функции в каждом потоке;
- статистический профилировщик шумит и затрудняет микроптимизацию циклов.
Платформы
Формально Oracle Developer Studio поддерживает только Solaris и Oracle Linux. Де-факто я успешно использовал его на Redhat, CentOS и Ubuntu. Collect/analyzer я использовал только для оптимизации С/C++/Fortran приложений. В документации утверждается, что с Java проектами инструмент тоже справляется.
Анализ кода, конечно, начинается со сборки исполняемого файла. В нем не должны быть удалены имена функций, иначе нечего будет анализировать. Отладочные символы нужны, если вы захотите разглядывать строчки кода из analyzer. Конечно, в первую очередь имеет смысл профилировать с вашими любимыми опциями оптимизации. Есть сценарии, когда полезно профилировать код без оптимизации, однако это бывает редко. Например, если Вам необходимо просто посмотреть граф вызовов, а не измерять производительность.
Итак, для запуска вам надо, как-обычно, собрать исполняемый файл, например:
g++ -O3 –g example.c –o ex
Второй шаг — запуск из-под collect:
$pathToSunStudio/collect ./ex
В результате работы профилировщика в текущей директории создается под-директория эксперимента test.N.er, где N — номер запуска. (Важно: если ваша программа была прервана, директория эксперимента окажется поломанной).
Самый приятный шаг — запуск GUI:
$pathToSunStudio/analyzer test.1.er
В случае нашего незатейливого примера ознакомимся с кодом прямо из GUI analyzer. Наш пример вычисляет сумму натурального и десятичного логарифмов целых чисел от 2 до 20 000 000. Желтым цветом выделяются «теплые» строки.
Перейдем к списку «тяжелых функций». Изначально функции отсортированы по времени, проведенному собственно в самой функции (exclusive time). Можно сортировать и по сумме времени в функции и в ее детях (inclusive time).
Как положено, можно походить по стеку вызовов. В нашем простом примере видно, что в t1() мы пришли из main (), а половина времени выполнения всей программы занимает функция sumlog ().
Очень удобно для автоматизации, что есть возможность вытаскивать данные с помощью командной строки. Например:
er_print -functions test.1.er test.2.er
напечает время работы функций из двух запусков.
Functions sorted by metric: Exclusive Total CPU Time
Excl. Incl. Name
Total Total
CPU sec. CPU sec.
4.160 4.160 Total
3.140 3.140 __ieee754_log
0.330 1.990 __ieee754_log10
0.270 1.880 sumlog(int)
0.180 2.280 sumlog10(int)
0.100 1.610 log
0.090 2.100 log10
0.050 0.050 isnan
- 4.160 __libc_start_main
- 4.160 main
- 1.880 t1(int)
- 2.280 t2(int)
Lifehack. Внимательно разглядывая граф вызовов программы, можно много полезного узнать работу и архитектуру новой для вас кодовой базы. Я очень часто начинаю работу с новым проектом с запуска Performance Analyzer, поскольку сразу можно понять какой код действительно запускается и в каких сценариях.
Sun/Oracle Studion Performance Analyzer достаточно мощный и удобный инструмент. В заметке я показал самый простой сценарий использования и, конечно, Performance Analyzer умеет гораздо больше. Если интересно узнать поподробнее, то обращайтесь к документации [2]. Основной вывод: такой инструмент существует и может нанести много пользы вашим проектам.
- Oracle Developer Studio
- Oracle Developer Studio 12.6: Performance Analyzer
- Performance Analyzer