Подтвердить что ты не робот

Профайлер фрагментации памяти

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

Спасибо, Эндрю

4b9b3361

Ответ 1

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

Ответ 2

Я боюсь, что ответ Valgrind.

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

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

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

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

19.63^                                               ###                      
     |                                               #                        
     |                                               #  ::                    
     |                                               #  : :::                 
     |                                      :::::::::#  : :  ::               
     |                                      :        #  : :  : ::             
     |                                      :        #  : :  : : :::          
     |                                      :        #  : :  : : :  ::        
     |                            :::::::::::        #  : :  : : :  : :::     
     |                            :         :        #  : :  : : :  : :  ::   
     |                        :::::         :        #  : :  : : :  : :  : :: 
     |                     @@@:   :         :        #  : :  : : :  : :  : : @
     |                   ::@  :   :         :        #  : :  : : :  : :  : : @
     |                :::: @  :   :         :        #  : :  : : :  : :  : : @
     |              :::  : @  :   :         :        #  : :  : : :  : :  : : @
     |            ::: :  : @  :   :         :        #  : :  : : :  : :  : : @
     |         :::: : :  : @  :   :         :        #  : :  : : :  : :  : : @
     |       :::  : : :  : @  :   :         :        #  : :  : : :  : :  : : @
     |    :::: :  : : :  : @  :   :         :        #  : :  : : :  : :  : : @
     |  :::  : :  : : :  : @  :   :         :        #  : :  : : :  : :  : : @
   0 +----------------------------------------------------------------------->KB     0                                                                   29.48

Number of snapshots: 25
 Detailed snapshots: [9, 14 (peak), 24]

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

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

Ответ 3

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

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

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

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

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

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

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

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

Ответ 4

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

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