Профилировщик памяти

Есть ли хорошие профилировщики фрагментации памяти? (Linux-версия GCC будет хорошо). Valgrind не может проанализировать это, потому что он использует пользовательские функции malloc/free.

Спасибо Андрей

4 ответа

Я бы начал с mtrace. Когда у вас есть трассировка, glibc поставляется с Perl-скриптом mtrace(1), который находит утечки. Тем не менее, формат трассировки прост для понимания, поэтому он должен быть простым процессом для анализа фрагментации.

Боюсь, ответ - Вальгринд.

Вы можете указать Valgrind, какие функции используются для выделения ресурсов и как он это делает, используя расширения кода valgrind (поэтому вам нужно изменить и перекомпилировать ваше приложение, но изменения скомпилируются в noops, если вы не отлаживаете), подробности в Руководство Valgrind Пулы памяти: работа с пользовательскими распределителями.

После того, как вы это сделали, у вас есть два инструмента, которые позволяют вам диагностировать использование кучи: массив и DHAT (быстрое напоминание, Valgrind - это набор инструментов, он просто запускает тот, который мы все знаем и любим, Memcheck, по умолчанию),

Massif "- это профилировщик кучи. Он измеряет, сколько кучи памяти использует ваша программа. Это включает как полезное пространство, так и дополнительные байты, выделенные для целей бухгалтерского учета и выравнивания. Он также может измерять размер стека (ов) вашей программы., хотя это не делает по умолчанию."

Он может создавать "графики", поэтому он выглядит графически:

19,63^                                               ###                      
     |                                               #                        
     |                                               #::                    
     |                                               #::::                 
     |:::::::::#::::               
     |:        #:::::             
     |:        #:::::::          
     |:        #:::::::        
     |:::::::::::        #:::::::::     
     |::        #:::::::::   
     |::::::        #:::::::::: 
     |                     @@@:::        #::::::::: @
     |::@:::        #::::::::: @
     |:::: @:::        #::::::::: @
     |:::: @:::        #::::::::: @
     |::::: @:::        #::::::::: @
     |::::::: @:::        #::::::::: @
     |::::::: @:::        #::::::::: @
     |::::::::: @:::        #::::::::: @
     |::::::::: @:::        #::::::::: @
   0 +----------------------------------------------------------------------->KB     0                                                                   29,48

Количество снимков: 25
 Подробные снимки: [9, 14 (пик), 24]

Более того, есть Massif Visualizer, который создает действительно красивые графики.

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

У меня проблемы с пониманием того, как любой инструмент, который вы можете найти, будет понимать структуру данных сегмента вашего собственного управления памятью. Возможно, вы сможете получить занятый дистрибутив (подключив его к malloc/free), но бесплатный дистрибутив (который по сути является фрагментацией) кажется в воздухе.

Так почему бы не добавить занятую / свободную статистику / гистограммы в свой менеджер памяти. Если ячейки индексируются чем-то пропорциональным log2 (размер), то это O(1), чтобы сохранить эту статистику, например, когда вы разделяете и объединяете, вы знаете размеры, и вы можете найти мусорное ведение путем прямого поиска, используя индекс, пропорциональный log2 (размер).

например, интервалы гистограммы

[2 ^ n, 2 ^ (n + 1))...

(например, если вы хотите более мелкие ячейки, используйте квадратный корень из журнала 2 (размер), который можно рассчитать с помощью 4 целочисленных инструкций в x86 [сканирование битов, сравнение, установка, добавление])

другой набор разумных размеров бина для использования - следующие открытые интервалы

[2^n, 2^n+2^(n-1)),[2^n+2^(n-1),2^(n+1))...

снова легко вычисляется [битное сканирование, сдвиг и добавление])

nedmalloc - очень хороший пользовательский распределитель, поставляется с исходным кодом, оптимизированным для избежания фрагментации.

Я бы подключил это и начал смотреть на его внутреннюю регистрацию для статистики фрагментации.

Другие вопросы по тегам