Google Performance Tools (GPT) — набор утилит, которые позволяют проводить анализ производительности программ, а также анализировать выделение памяти программами и производить поиск утечек памяти.
GPT может работать практически на всех Unix-совместимых операционных системах — Linux,
FreeBSD, Solaris, Mac OS X (Darwin), включая поддержку разных процессоров1 — x86,
x86_64 и PowerPC. Кроме того, tcmalloc можно скомпилировать также и для MS Windows, что
позволит искать утечки памяти в программах, разработанных для этой ОС.
Установка на Unix-совместимые системы достаточна проста — пакет использует стандартную инфраструктуру autotools, так что вам для установки необходимо лишь скачать исходные тексты с сайта проекта и выполнить последовательность команд:
./configure make make install
которые выполнят настройку, сборку и установку пакета. Вы можете установить пакет в
нужное вам место, задав аргументы команде ./configure.2
Google Performance Tools состоят из двух библиотек3:
malloc (быстрее
чем malloc в glibc 2.3). С помощью данной библиотеки можно анализировать выделение
памяти в программе, а также производить поиск утечек памяти. Про внутреннее устройство
tcmalloc можно прочитать на сайте проекта.Использовать эти библиотеки можно двумя способами — указав имя библиотеки при линковке
вашего кода (используя флаг -l), или загрузив ее с помощью LD_PRELOAD. Разработчики
рекомендуют по возможности использовать первый метод, а второй метод использовать только
если вы не имеете доступа к исходному коду.
Стоит отметить, что подключение библиотек не означает автоматического выполнения функций
профилирования процессора или памяти. Включение этих функций определяется наличием
определенных переменных среды, которые будут описаны в соответствующих разделах. В
процессе работы библиотеки могут создавать текстовые файлы, которые содержат собранную
информацию. Для преобразования этой информации в более удобную для анализа форму, в
поставку пакета входит программа pprof, краткое описание которой вы найдете в одном из
следующих разделов.
Разработчик может также использовать функции GPT в своих программах для того, чтобы выполнять проверку только определенных частей программ, или для запрещения "известных" утечек памяти. Про использование каждой из компонент GPT можно прочитать в соответствующем разделе документации данного пакета.
Поиск утечек памяти с помощью tcmalloc очень прост — надо слинковать программу с этой
библиотекой, и запустить ее вот так:
# HEAPCHECK=normal ./your-program
или вот так (без линковки):
# LD_PRELOAD=/usr/lib/libtcmalloc.so.0.0.0 HEAPCHECK=normal ./your-program
и после выполнения программы, она выдаст отчет о найденных утечках памяти, например вот так:
# LD_PRELOAD=/usr/lib/libtcmalloc.so.0.0.0 HEAPCHECK=normal ./test-hashes 1000000
HeapChecker: Starting check "_main_"
HeapChecker: Ignoring 12 reachable objects of 275 bytes
.... Вывод программы .....
HeapChecker: Checking for whole-program memory leaks
HeapChecker: Ending check "_main_"
HeapChecker: Ignoring 32 reachable objects of 1679 bytes
HeapChecker: Heap memory leaks of 1000 bytes and/or 1 allocations detected by check "_main_".
HeapChecker: To investigate leaks manually use e.g.
cd /home/ott/projects/cpp-tests; /usr/bin/pprof ./test-hashes \
"/tmp/test-hashes.2977._main_-end.heap" \
--inuse_objects --lines --edgefraction=1e-10 --nodefraction=1e-10 --gv 2>/dev/null
HeapChecker: Below is this pprof's output:
1 100.0% 100.0% 1 100.0% main test-hashes.cpp:106
0 0.0% 100.0% 1 100.0% 0xb7c8d450 ??:0
0 0.0% 100.0% 1 100.0% _start ??:0
HeapChecker: crashing because of leaks
[1] 2977 segmentation fault (core dumped) LD_PRELOAD=/usr/lib/libtcmalloc.so.0.0.0
HEAPCHECK=normal ./test-hashes
Заметьте, что при поиске утечек памяти отчет выводится сразу (вы можете изменить параметры анализа, поскольку данные записываются во временный файл). Пользователь также может с помощью дополнительных переменных среды изменить поведение библиотеки и получить дополнительные данные о работе программы (но об этом ниже).
Переменная среды HEAPCHECK указывает уровень проверок, которые будут применяться в
процессе работы. Определено 4 значения для данной переменной —
minimal, normal, strict и
draconian — от самых простых, до все более изощренных проверок, использование которых
конечно влияет на скорость работы анализируемой программы. Кроме этого, есть еще два
режима: as-is — когда пользователь с помощью опций может задать список выполняемых
проверок, и local — когда проверки выполняются только для кода, который явно отмечен для
проверки (путем добавления вызовов функций GPT в исходный код программы).
При нахождении утечки памяти (как в нашем примере) библиотека аварийно завершает
программу, но при этом выдает на экран стек вызовов функций, приведших к появлению утечки
памяти. В нашем примере, утечка памяти происходит в функции main, на 106 строке кода в
файле с исходным текстом (test-hashes.cpp).
В процессе работы библиотека учитывает значения следующих переменных среды (эти переменные определены для всех уровней проверок):
HEAP_CHECK_REPORTHEAP_CHECK_STRICT_CHECKSameHeap или NoLeaks;HEAP_CHECK_IDENTIFY_LEAKSHEAP_CHECK_TEST_POINTER_ALIGNMENTPPROF_PATHpprof;HEAP_CHECK_DUMP_DIRECTORYДополнительную информацию о библиотеке и об использовании режимов as-is и local можно
найти в данном документе.
Кроме нахождения утечек памяти, библиотека tcmalloc позволяет производить анализ
потребления памяти программами. Для выполнения данной задачи, библиотека отслеживает все
выделения и освобождения блоков памяти. К отслеживаемым функциям выделения памяти
относятся malloc, calloc, realloc и new.
Процедура использования библиотеки для анализа потребления памяти сходна с процедурой
поиска утечек памяти, но отличается именами переменных среды. При работе в режиме анализа
потребления памяти, библиотека выводит результаты в файл, указанный в переменной среды
HEAPPROFILE, наличие которой и заставляет библиотеку работать в данном режиме. Например:
LD_PRELOAD=/usr/lib/libtcmalloc.so.0.0.0 HEAPPROFILE=gpt-heapprofile.log ./your-program
Данные собранные в процессе работы библиотеки, после завершения работы становятся
доступными для анализа с помощью утилиты pprof, описанной ниже. Данные обработанные этой
утилитой можно получить как в текстовом, так и в графическом виде. Эти данные включают в
себя данные об выделении памяти функциями программы и отношение между различными
функциями, выделяющими память.
С помощью дополнительных переменных среды можно изменять поведение библиотеки, и например,
заставить ее также анализировать вызовы mmap в дополнение к стандартным функциям выделения
памяти (это происходит если переменную среды HEAP_PROFILE_MMAP установить в значение
true).
Описание дополнительных переменных среды, а также примеры анализа данных, собранных библиотекой, вы сможете найти в документации.
Использование профайлера очень просто — надо лишь слинковать программу с библиотекой
profiler, и указать имя файла куда будут выводиться собранные данные в переменной среды
CPUPROFILE, например вот так:
# CPUPROFILE=/tmp/cpuprofile.log ./your-program
или можно вот так (без линковки библиотеки) — если вам нужно провести всего один анализ, или вы не имеете доступа к исходному коду программы:
# LD_PRELOAD=/usr/lib/libprofiler.so.0.0.0 CPUPROFILE=/tmp/cpuprofile.log ./your-program
Кроме CPUPROFILE вы можете использовать и другие переменные среды для управления
поведением данной библиотеки, например, CPUPROFILE_FREQUENCY задает количество проверок,
выполняемых библиотекой каждую секунду.
После выполнения программы, собранные результаты оказываются в указанном вами файле, и вы
можете провести их анализ. Для выполнения анализа используется программа pprof. Данные
можно получать, как в текстовом:
23 2.4% 42.6% 309 32.4% std::less::operator
так и в графическом виде (это только часть графика, выводимого pprof):
При выводе результатов в виде текста, утилита выдает список функций, для каждой из которых указывается следующая информация (в колонке с соответствующим номером):
При выводе в виде графика, кроме этой информации, показываются еще и зависимости между вызовами функции.
Более подробно об использовании cpu profiler и об анализе собранных результатов вы можете прочитать на сайте проекта, а про использование утилиты pprof читайте в следующем разделе.
Утилита pprof предназначена для анализа данных, собранных во время сбора сведений о
потреблении памяти или производительности программы. В общем, командная строка для
запуска этой утилиты выглядит следующим образом:
pprof [необязательные опции] имя_программы имя_файла_с_результатами
Опции запуска утилиты можно разделить на общие, и специфичные для конкретных режимов
работы. Общие опции позволяют указать формат выводимой информации, и степень подробности
выводимой информации — опции --addresses, --lines, --functions (по умолчанию) или --files
определят то, какой уровень подробности будет использоваться — физический адрес, строка
кода, функция или файл с исходным текстом.
Утилита может выводить информацию как в текстовом (опция --text), так и в графическом виде
(опции --gif, --ps, --pdf и другие). Можно также заставить ее вывести результаты в виде
аннотированного исходного кода (опция --list), или дизассемблированного машинного кода
(опция --disasm). Если утилита не получает опций, указывающий формат выводимой
информации, то она переходит в режим интерактивной работы, где определены команды,
соответствующие опциям командной строки (только без знаков --).
При проведении анализа данных, собранных во время анализа потребления памяти, определены
опции, которые позволяют отображать количество используемых и/или выделенных объектов
(--inuse_objects или --alloc_objects), объем выделенной памяти (--alloc_space) или
использовать байты в качестве единицы измерения, вместо мегабайт, по умолчанию (опция
--show_bytes).
При проведении анализа производительности программы, могут использоваться опции,
определяющие подробность выводимой информации. Например, можно исключить из вывода
объекты, соответствующие заданному регулярному выражению (--ignore), или можно управлять
степенью детализации выводимых графиков (опции --nodecount, --nodefraction и
--edgefraction).
Полное описание утилиты pprof можно найти в справочной странице, поставляемой вместе с
исходными текстами, и устанавливаемой вместе с утилитой. А большее количество примеров
можно найти на страницах, описывающих использование компонентов GPT.
1. Имеются правда некоторые особенности при сборке на 64-битных системах, о которых вы
можете прочитать в файле INSTALL, входящем в архив с исходными текстами системы.
2. Для установки пакета на MS Windows вам необходимо скачать с сайта проекта специальную
версию, которая содержит файлы проекта для сборки с помощью Visual C++.
Дополнительную информацию можно найти в файле README.windows, входящем в состав
исходных текстов.
3. Обе библиотеки могут без ограничений использоваться с многопотоковыми программами.
Last change: 05.03.2013 16:54