Отслеживание активно используемой памяти в программах Linux

Я хотел бы отслеживать, сколько памяти занимают различные программы, находясь в определенных состояниях. Например, у меня есть графическая программа. Когда он свернут, он может использовать значительно меньше памяти, поскольку он не будет перерисовывать окно, что требует чтения изображений и шрифтов и выполнения большого количества библиотечных функций. Эти объекты по-прежнему доступны в памяти, но фактически не используются.

Такие инструменты, как top, имеют ограниченное применение, поскольку они просто сообщают, сколько памяти отображено в адресное пространство программы, а какая - резидентно в физической ОЗУ. Точно так же детекторы утечки сообщают только о недоступности памяти, а не о том, что она просто не используется.

Есть ли существующий инструмент, который может таким образом отслеживать активно используемую / неиспользуемую память? Если возможно, я хотел бы отслеживать использование не только в куче, но и в памяти, где хранится код программы / библиотеки.


РЕДАКТИРОВАТЬ: Я хотел бы уточнить: я хочу знать много памяти, которую программа действительно читает, записывает или выполняет после определенного момента, то есть, когда она достигает определенного состояния. Хотя количество страниц в адресном пространстве и количество резидентных страниц являются важными измерениями, это не то, что я ищу.

Сейчас я использую три подхода:

  1. Я написал библиотеку, которая очищает биты защиты всех областей памяти (кроме стека и собственного кода), считываемых из / proc / self / maps с помощью mprotect. У него есть обработчик segfault, который восстанавливает биты защиты и увеличивает счетчик. Я загружаю его с помощью LD_PRELOAD, и он начинает отслеживать доступ к памяти при получении сигнала. Это привело к некоторым подлинным сбоям с кажущимися поддельными адресами (они не сохраняются ни в каких регистрах или соседней памяти во время сбоя).
  2. Я написал программу «purge», которая выделяет и читает из памяти с помощью «mmap», пока «mmap» не вернет ошибку. Мы надеемся, что это вытеснит все страницы из целевого процесса, который приостанавливается на время выполнения `purge`. Затем я подсчитываю количество страниц, когда целевой процесс возобновляется, используя pidstat. Кажется, это работает, но это очень тупой инструмент. Он не дает никакой информации о том, какие страницы были затронуты.
  3. Мне сказали, что valgrind позволяет писать плагины, которые вызывают выполнение определенных действий при определенных событиях, например, при доступе к памяти. Пока это выглядит многообещающим.

person Jay Conrod    schedule 13.05.2009    source источник
comment
дубликат: stackoverflow.com/questions/131303/   -  person lothar    schedule 14.05.2009


Ответы (2)


Это можно получить из данных в / proc / pid / smaps. Это разбивает значение RSS для каждой отображаемой области (включая стек, текст / данные и анонимно отображаемые области), поэтому вы можете точно видеть, что является резидентным для каждого загруженного объекта, а также для стека и кучи.

Некоторые ссылки, которые могут быть полезны:

person Lance Richardson    schedule 16.05.2009
comment
первая ссылка теперь является блогом только для приглашенных. - person hyperwiser; 08.10.2020

Инструмент valgrind cachegrind хорошо отслеживает использование памяти.

Также есть несколько инструментов, которые графически показывают вывод cachegrind.

Отредактируйте, чтобы ответить на обновленную информацию:
До появления valgrind я использовал проект под названием mpatrol.
Он использует mprotect (), чтобы сделать страницы доступными только для чтения и отслеживать доступ к страницам
. Он также позволяет указать, когда начинать и останавливать отчет, например, после n-го malloc, среди других спецификаций.

Он может выполнять многие или все функции, которые вы ищете.

Одно предостережение: он намного медленнее, чем valgrind.

person codeDr    schedule 16.05.2009