memusage(1) | General Commands Manual | memusage(1) |
НАИМЕНОВАНИЕ
memusage - исследует использование памяти программы
ОБЗОР
memusage |
[option ...] program [programoption ...] |
ОПИСАНИЕ
memusage is a bash(1) script which profiles memory usage of the program, program. It preloads the libmemusage.so library into the caller's environment (via the LD_PRELOAD environment variable; see ld.so(8)). The libmemusage.so library traces memory allocation by intercepting calls to malloc(3), calloc(3), free(3), and realloc(3); optionally, calls to mmap(2), mremap(2), and munmap(2) can also be intercepted.
memusage может выводить собранные данные в текстовом виде, также может использовать memusagestat(1) (смотрите вариант -р далее) для того, чтобы создать файл PNG, содержащий графическое представление собранных данных.
Сводка использование памяти
Выводимая memusage строка "сводка использование памяти" содержит три поля:
- heap total
- Sum of size arguments of all malloc(3) calls, products of arguments (n*size) of all calloc(3) calls, and sum of length arguments of all mmap(2) calls. In the case of realloc(3) and mremap(2), if the new size of an allocation is larger than the previous size, the sum of all such differences (new size minus old size) is added.
- heap peak
- Maximum of all size arguments of malloc(3), all products of n*size of calloc(3), all size arguments of realloc(3), length arguments of mmap(2), and new_size arguments of 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); }
СМОТРИТЕ ТАКЖЕ
ПЕРЕВОД
Русский перевод этой страницы руководства разработал(и) 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> и Kirill Rekhov <krekhov.dev@gmail.com>
Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.
Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков.
25 ноября 2024 г. | Linux man-pages 6.12 |