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
пикселов.
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);
}
memusagestat(1),
mtrace(1),
ld.so(8)
Русский
перевод
этой
страницы
руководства
был сделан
aereiae <
[email protected]>, Alexey <
[email protected]>, Azamat
Hackimov <
[email protected]>, Dmitriy S. Seregin
<
[email protected]>, Dmitry Bolkhovskikh <
[email protected]>,
ITriskTI <
[email protected]>, Max Is <
[email protected]>, Yuri
Kozlov <
[email protected]>, Иван
Павлов <
[email protected]>
и Малянов
Евгений
Викторович
<
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]