Фрагментация кучи Linux

У меня есть вопрос, который продолжает беспокоить меня в течение последней недели.

В отладчике Windows есть !heap -s Команда, которая выводит состояние кучи виртуальной памяти и вычисляет внешнюю фрагментацию по формуле:

External fragmentation = 1 - (larget free block / total free size)

Есть ли аналогичный метод в Linux, который выводит статистику, необходимую для расчета эффекта?

Длинная история теперь: у меня есть приложение на C, которое продолжает выделять и освобождать пространство разных размеров, используя malloc и free, каждое распределение имеет различную продолжительность жизни. Я использую платформу Lubuntu, поэтому ptmalloc2 алгоритм по умолчанию.

Мне известно, что эти выделения обслуживаются в куче виртуального пространства пользователя (кроме тех, которые имеют размер более 128 КБ, где используется распределитель). mmap) и отображаются на физические страницы при фактическом доступе. Большая часть выделений имеет размер < 80 байтов, поэтому они обслуживаются из FastBins.

С помощью Valgrind а также Massif Я могу получить внутреннюю фрагментацию, так как она сообщает о дополнительных байтах, используемых для каждого выделения.

Тем не менее, моя главная задача - как определить внешнюю фрагментацию. Я знаю о /proc/[pid]/smaps размер кучи и pmap-d[pid] anon статистика, но мне трудно интерпретировать их с точки зрения внешней фрагментации.

Я тоже в курсе LD_PRELOAD и я могу динамически подключить /lib/i386-linux-gnu/libmemusage.so, Эта библиотека выводит общее количество кучи, пик и распределение запрошенных размеров выделения.

я знаю это __malloc__hook сейчас устарела, и я не очень хочу полагаться на статистику конкретной реализации, например malloc_stats() а также mallinfo(), Однако, если у вас есть какие-либо предложения по использованию этих двух, пожалуйста, дайте мне знать.

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

Я до сих пор не понял, как получить необходимую статистику, чтобы я мог рассчитать этот эффект. Например, различные формулы, утверждающие, что я должен захватить live_memory или получить total_free_pagesили получить размер largest_free_block, Как я могу иметь функцию для "прохождения" через кучу и сбора этой статистики?

Спасибо всем заранее.

1 ответ

Я считаю, что это будет зависеть от используемого вами распределителя. То есть вам, вероятно, понадобится другая стратегия для любого используемого malloc (и др.) И бесплатная реализация. Если реализация не предлагает информацию, которую вы ищете в качестве расширения, вам, вероятно, придется прочитать ее исходный код и ввести собственную логику, чтобы проверить состояние распределений.

Я считаю, что отображение страниц в пространство подкачки и физическую оперативную память находится на более низком уровне и поэтому не поможет вам в достижении вашей цели. Malloc (и др.) И бесплатная реализация могут или не могут заботиться об этих деталях более низкого уровня.

Если вы уверены, что используете ptmalloc2, можете ли вы найти его исходный код?

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