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