Фрагментация кучи 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, можете ли вы найти его исходный код?