обрабатывать выделенные блоки памяти из ядра - PullRequest
1 голос
/ 12 июля 2011

мне нужно иметь надежное измерение выделенной памяти в процессе Linux. Я искал mallinfo , но я читал, что устарела . Какова современная альтернатива для такой статистики?

В основном меня интересуют как минимум два числа:

  • количество (и размер) выделенных блоков / страниц памяти из ядра любым malloc или любой другой реализацией, использующей выбранную библиотеку C

  • (необязательный, но все же важный) номер выделенной памяти по коду пользовательского пространства (через malloc, new и т. Д.) Минус выделенная им память (через free, delete и т. Д. )

у меня есть одна возможность - переопределить вызовы malloc с помощью LD_PRELOAD , но это может привести к нежелательным издержкам во время выполнения, а также может не работать должным образом с другими библиотеками, которые я использую, которые также полагаются на LD_PRELOAD aop -ness.

еще одна возможность, которую я прочитал, с rusage .

Для ясности, это НЕ для целей отладки, использование памяти является внутренней особенностью приложения (аналогично Mathematica или Matlab, которые отображают объем используемой памяти, только более точно в блоке -уровень)

Ответы [ 2 ]

4 голосов
/ 12 июля 2011

Для этой цели - функция самоанализа "использования памяти" в приложении - наиболее подходящий интерфейс - malloc_hook(3). Это расширения GNU, которые позволяют вам перехватывать каждый вызов malloc(), realloc() и free(), сохраняя вашу статистику.

Чтобы увидеть, сколько памяти отображается вашим приложением с точки зрения ядра, вы можете прочитать и сопоставить информацию в псевдофиле /proc/self/smaps. Это также позволяет увидеть, какая часть каждого выделения является резидентной, подкаченной, общей / частной, чистой / грязной и т. Д.

3 голосов
/ 12 июля 2011

/proc/PID/status содержит несколько полезных фрагментов информации (например, попробуйте запустить cat /proc/$$/status).

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

VmSize - текущий размер пространства виртуальной памяти вашего процесса.

VmRSS - размер резидентного набора вашего процесса;то есть, сколько из этого занимает физическая оперативная память прямо сейчас.(Типичный процесс будет иметь много сопоставленных материалов, которые он никогда не использует, как большая часть библиотеки C. Если процессам страница не нужна, в конечном итоге она будет удалена и станет нерезидентной. RSS измеряет страницы, которые остаются резидентными и отображаютсяв ваш процесс.)

VmHWM - Знак Высшей Воды VmRSS;то есть наибольшее это число было за время существования процесса.

VmData - размер сегмента «данных» вашего процесса;то есть примерно его использование кучи.Обратите внимание, что небольшие блоки, над которыми вы сделали malloc, а затем free, все еще будут использоваться с точки зрения ядра;большие блоки будут возвращены ядру после освобождения.(Если память служит, «большой» означает больше, чем 128k для текущего glibc.) Это, вероятно, самое близкое к тому, что вы ищете.

Эти измерения, вероятно, лучше, чем попытки отследить malloc и free, поскольку ониуказать, что "на самом деле происходит" с точки зрения всей системы.То, что вы вызвали free() для некоторой памяти, не означает, что она была возвращена в систему для использования другими процессами.

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