memusage(1) General Commands Manual 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 и сохранить его в file.
Создать двоичный файл данных и сохранить его в файл.
Не буферизуйте вывод.
Собрать size записей перед тем, как записать их.
Отключить измерение значения указателя стека на основе таймера (SIGPROF).
Также трассировать mmap(2), mremap(2) и munmap(2).
-?--help
Показать справку по использованию и завершить работу.
Показать короткое сообщение об использовании и завершить работу.
Показать информацию о версии и завершить работу.
Следующие параметры применяются только когда используется графический вывод:
По оси X — время (а не количество вызовов функций).
Построить также график общего использования памяти.
Использовать название в качестве заголовка графика.
Рисовать график шириной в size пикселов.
Рисовать график высотой в size пикселов.

КОД ЗАВЕРШЕНИЯ

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

ОШИБКИ

Сообщения об ошибках доступны по адресу 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;
    size_t size;
    int *p;
    size = sizeof(*p) * 100;
    printf("malloc: %zu\n", size);
    p = malloc(size);
    for (i = 0; i < CYCLES; i++) {
        if (i < CYCLES / 2)
            j = i;
        else
            j--;
        size = sizeof(*p) * (j * 50 + 110);
        printf("realloc: %zu\n", size);
        p = realloc(p, size);
        size = sizeof(*p) * ((j + 1) * 150 + 110);
        printf("realloc: %zu\n", size);
        p = realloc(p, size);
    }
    free(p);
    exit(EXIT_SUCCESS);
}

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

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

ПЕРЕВОД

Русский перевод этой страницы руководства разработал aereiae <aereiae@gmail.com>, Alexey <a.chepugov@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy S. Seregin <dseregin@59.ru>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, ITriskTI <ITriskTI@gmail.com>, Max Is <ismax799@gmail.com>, Yuri Kozlov <yuray@komyakino.ru>, Иван Павлов <pavia00@gmail.com>, Малянов Евгений Викторович <maljanow@outlook.com> и Сухичев Михаил Иванович <sukhichev@yandex.ru>

Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику по его адресу электронной почты или по адресу списка рассылки русских переводчиков.

2 мая 2024 г. Linux man-pages 6.8