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 строка "сводка использование памяти" содержит три поля:
Сразу за строкой итога в таблице для каждой перехваченной функции показывается количество вызовов, общее количество выделенной и освобождённой памяти и количество вызовов с ошибками. Для realloc(3) и mremap(2) также есть поле «nomove», показывающее переразмещения, у которых изменился адрес блока, и поле «dec», показывающее переразмещения, у которых уменьшился размер блока. Для realloc(3) в дополнительном поле «free» показываются переразмещения, которые были вызваны освобождением блока (т. е., размер переразмещения был равен 0).
Таблица «realloc/total memory», выводимая memusage, не отражает случаи, где realloc(3) используется для переразмещения блока памяти меньшего размера, чем предыдущий. Это может привести к тому, что сумма всех ячеек «total memory» (кроме «free») будет больше, чем ячейка «free/total memory».
«Гистограмма размеров блоков» выдает разбивку адресованных блоков по размерам.
The exit status of memusage is equal to the exit status of the profiled program.
Сообщения об ошибках доступны по адресу 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); }
Русский перевод этой страницы руководства был сделан 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>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.
7 января 2023 г. | Linux man-pages 6.03 |