memusage(1)

исследует использование памяти программы · man1 · Русский

memusage(1) General Commands Manual memusage(1)

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

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

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

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

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

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

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

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

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

Имя файла профилируемой программы.
Создать изображение в формате PNG и сохранить его в file.
Создать двоичный файл данных и сохранить его в файл.
Не буферизуйте вывод.
Собрать size записей перед тем, как записать их.
Отключить измерение значения указателя стека на основе таймера (SIGPROF).
Также трассировать mmap(2), mremap(2)EN и 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 версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.

7 января 2023 г. Linux man-pages 6.03