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 строка "сводка использование памяти" содержит три поля:

    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 и сохранить его в file.

-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 равен коду завершения профилируемой программы.

ДЕФЕКТЫ
Сообщения об ошибках доступны по адресу 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 (https://www.gnu.org/licenses/gpl-3.0.html) или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

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