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