Linux repositories inspector

memusage(1) - Russkiy

GNU
2019-03-06

man-pages-ru

Russian man pages from the Linux Documentation Project

manpages

Manual pages about using a GNU/Linux system

man-pages

Linux kernel and C library user-space interface documentation

ИМЯ

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 строка "сводка использование памяти" содержит три поля:
heap total
Сумма аргументов size всех вызовов malloc(3), результат аргументов (nmemb*size) всех вызовов calloc(3) и сумма аргументов length всех вызовов mmap(2) . В случае realloc(3) и mremap(2), если новый размер блока адресов больше, чем в предыдущий размер, добавляется сумма всех таких различий (новый размер минус старый размер).
heap peak
Максимальное значение всех аргументов size у malloc(3), все произведения nmemb*size у calloc(3), все аргументы size у realloc(3), аргументы length у mmap(2) и аргументы new_size у mremap(2).
stack peak
Перед первым вызовом любой отслеживаемой функции сохраняется адрес указателя стека (базовый указатель стека). После каждого вызова функции читается текущий адрес указателя стека и вычисляет разница с базовым указателем стека. Максимальное значение среди вычитаний является пиком стека.
Сразу за строкой итога в таблице для каждой перехваченной функции показывается количество вызовов, общее количество выделенной и освобождённой памяти и количество вызовов с ошибками. Для realloc(3) и mremap(2) также есть поле «nomove», показывающее переразмещения, у которых изменился адрес блока, и поле «dec», показывающее переразмещения, у которых уменьшился размер блока. Для realloc(3) в дополнительном поле «free» показываются переразмещения, которые были вызваны освобождением блока (т. е., размер переразмещения был равен 0).
Таблица «realloc/total memory», выводимая memusage, не отражает случаи, где realloc(3) используется для переразмещения блока памяти меньшего размера, чем предыдущий. Это может привести к тому, что сумма всех ячеек «total memory» (кроме «free») будет больше, чем ячейка «free/total memory».

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

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

ПАРАМЕТРЫ

-n имя, --progname=имя
Имя файла профилируемой программы.
-p file, --png=file
Создать изображение в формате PNG и сохранить его в
-d файл, --data=файл
Создать двоичный файл данных и сохранить его в файл.
-u, --unbuffered
Не буферизуйте вывод.
-b size, --buffer=size
Собрать size записей перед тем, как записать их.
--no-timer
Отключить измерение значения указателя стека на основе таймера (SIGPROF).
-m, --mmap
Также трассировать mmap(2), mremap(2) и munmap(2).
-?, --help
Показать справку по использованию и завершить работу.
--usage Показать короткое сообщение об использовании и завершить работу.
-V, --version
Показать информацию о версии и завершить работу.
Следующие параметры применяются только когда используется графический вывод:
-t, --time-based
По оси X — время (а не количество вызовов функций).
-T, --total
Построить также график общего использования памяти.
--title=название
Использовать название в качестве заголовка графика.
-x size, --x-size=size
Рисовать график шириной в size пикселов.
-y size, --y-size=size
Рисовать график высотой в size пикселов.

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

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

ДЕФЕКТЫ

Сообщения об ошибках доступны по адресу

ПРИМЕР

Ниже показана простая программа, которая переразмещает блок памяти в цикле, который достигает пика до того как размер циклически переразмещаемой памяти достигнет нуля. После компиляции программы и запуска следующих команд график использования памяти программой можно найти в файле 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); }

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

⇧ Top