MEMUSAGE(1) Руководство пользователя Linux MEMUSAGE(1)

ИМЯ

memusage - исследует использование памяти программы

ОБЗОР

memusage [параметры]… программа [параметры_программы]…

ОПИСАНИЕ

Программа memusage представляет собой сценарий bash, который описывает использование памяти программой. Сценарий загружает библиотеку libmemusage.so в окружение вызывающего (через переменную окружения LD_PRELOAD, смотрите ld.so(8)). Библиотека libmemusage.so отслеживает распределение памяти путём перехвата вызовов malloc(3), calloc(3), free(3) и realloc(3); при необходимости, также могут быть перехвачены вызовы mmap(2), mremap(2) и munmap(2).

memusage может выводить собранные данные в текстовом виде, также может использовать memusagestat(1) (смотрите вариант -р далее) для того, чтобы создать файл PNG, содержащий графическое представление собранных данных.

Сводка использование памяти

Выводимая memusage строка "сводка использование памяти" содержит три поля:

Сумма аргументов size всех вызовов malloc (3), результат аргументов (nmemb*size) всех вызовов calloc(3) и сумма аргументов length всех вызовов mmap (2) . В случае realloc (3) и mremap (2), если новый размер блока адресов больше, чем в предыдущий размер, добавляется сумма всех таких различий (новый размер минус старый размер).
Максимальное значение всех аргументов size у malloc(3), все произведения nmemb*size у calloc(3), все аргументы size у realloc(3), аргументы length у mmap(2) и аргументы new_size у mremap(2).
Перед первым вызовом любой отслеживаемой функции сохраняется адрес указателя стека (базовый указатель стека). После каждого вызова функции читается текущий адрес указателя стека и вычисляет разница с базовым указателем стека. Максимальное значение среди вычитаний является пиком стека.

Сразу за строкой итога в таблице для каждой перехваченной функции показывается количество вызовов, общее количество выделенной и освобождённой памяти и количество вызовов с ошибками. Для realloc(3) и mremap(2) также есть поле «nomove», показывающее переразмещения, у которых изменился адрес блока, и поле «dec», показывающее переразмещения, у которых уменьшился размер блока. Для realloc(3) в дополнительном поле «free» показываются переразмещения, которые были вызваны освобождением блока (т. е., размер переразмещения был равен 0).

Таблица «realloc/total memory», выводимая memusage, не отражает случаи, где realloc(3) используется для переразмещения блока памяти меньшего размера, чем предыдущий. Это может привести к тому, что сумма всех ячеек «total memory» (кроме «free») будет больше, чем ячейка «free/total memory».

Гистограмма размеров блоков

«Гистограмма размеров блоков» выдает разбивку адресованных блоков по размерам.

ПАРАМЕТРЫ

Имя файла профилируемой программы.
Создать изображение в формате PNG и сохранить его в
Создать двоичный файл данных и сохранить его в файл.
Не буферизуйте вывод.
Собрать size записей перед тем, как записать их.
Отключить измерение значения указателя стека на основе таймера (SIGPROF).
Также трассировать mmap(2), mremap(2) и munmap(2).
-?, --help
Показать справку по использованию и завершить работу.
Показать короткое сообщение об использовании и завершить работу.
Показать информацию о версии и завершить работу.
Следующие параметры применяются только когда используется графический вывод:
По оси X — время (а не количество вызовов функций).
Построить также график общего использования памяти.
Использовать название в качестве заголовка графика.
Рисовать график шириной в size пикселов.
Рисовать график высотой в size пикселов.

КОД РЕЗУЛЬТАТА

Код завершения работы равен коду выхода профилируемой программы.

ДЕФЕКТЫ

Сообщения об ошибках доступны по адресу http://www.gnu.org/software/libc/bugs.html

ПРИМЕР

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

$ memusage --data=memusage.dat ./a.out
...
Memory usage summary: heap total: 45200, heap peak: 6440, stack peak: 224

        total calls  total memory  failed calls

 malloc|         1           400             0
realloc|        40         44800             0  (nomove:40, dec:19, free:0)

 calloc|         0             0             0

   free|         1           440
Histogram for block sizes:

  192-207             1   2% ================
...

 2192-2207            1   2% ================

 2240-2255            2   4% =================================

 2832-2847            2   4% =================================

 3440-3455            2   4% =================================

 4032-4047            2   4% =================================

 4640-4655            2   4% =================================

 5232-5247            2   4% =================================

 5840-5855            2   4% =================================

 6432-6447            1   2% ================
$ memusagestat memusage.dat memusage.png

Исходный код программы

#include <stdio.h>
#include <stdlib.h>
#define CYCLES 20
int
main(int argc, char *argv[])
{

     int i, j;

     int *p;

     printf("malloc: %zd\n", sizeof(int) * 100);

     p = malloc(sizeof(int) * 100);

     for (i = 0; i < CYCLES; i++) {

         if (i < CYCLES / 2)

             j = i;

         else

             j--;

         printf("realloc: %zd\n", sizeof(int) * (j * 50 + 110));

         p = realloc(p, sizeof(int) * (j * 50 + 100));

         printf("realloc: %zd\n", sizeof(int) * ((j+1) * 150 + 110));

         p = realloc(p, sizeof(int) * ((j + 1) * 150 + 110));

     }

     free(p);

     exit(EXIT_SUCCESS);
}

СМОТРИТЕ ТАКЖЕ

memusagestat(1), mtrace(1) ld.so(8)

2019-03-06 GNU