Ответ 1
Я бы начал с mtrace. Когда у вас есть след, glibc поставляется с perl script mtrace (1), который обнаруживает утечки. Однако формат трассировки легко понять, поэтому он должен быть прямым процессом для анализа фрагментации.
Есть ли хорошие фрагментаторы фрагментации памяти? (версия linux gcc будет приятной). Valgrind не может проанализировать это, поскольку использует пользовательские функции malloc/free.
Спасибо, Эндрю
Я бы начал с mtrace. Когда у вас есть след, glibc поставляется с perl script mtrace (1), который обнаруживает утечки. Однако формат трассировки легко понять, поэтому он должен быть прямым процессом для анализа фрагментации.
Я боюсь, что ответ 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 позволяет вам определить, как именно приложение использует свою кучу, какие части недолговечны, которые хранятся в течение всей жизни программы, но используется только в начале и т.д. К сожалению, у него нет хороших графиков или графических инструментов, которые идут с ним, вывод - чистый текст. К счастью, вы можете сказать, сколько данных вы хотите получить и как их сортировать, чтобы это было не так плохо, как кажется.
У меня возникли проблемы с пониманием того, как любой инструмент, который вы могли бы найти, мог бы понять структуры данных сегмента вашего пользовательского управления памятью. Возможно, вы сможете получить занятое распределение (подключение к 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))...
снова легко вычислить [бит сканирования, сдвиг, и, добавить])
nedmalloc - очень хороший пользовательский распределитель, поставляется с источником, оптимизированным для предотвращения фрагментации.
Я бы подключил это и начал смотреть на его внутренний журнал для статистики фрагментации.