Отслеживание активно используемой памяти в программах Linux - PullRequest
6 голосов
/ 14 мая 2009

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

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

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


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

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

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

Ответы [ 2 ]

2 голосов
/ 16 мая 2009

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

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

2 голосов
/ 16 мая 2009

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...