MEMUSAGE

Section: Linux user manual (1)
Updated: 2020-06-09
Index Return to Main Contents
 

名前

memusage - プログラムのメモリー使用量のプロファイルを行う  

書式

memusage [option]... program [programoption]...  

説明

memusage は、 プログラム program のメモリー使用量のプロファイルを行う bash スクリプトである。 呼び出し元の環境に (LD_PRELOAD 環境変数を使って) libmemusage.so ライブラリをプレロードする。 ld.so(8) を参照。 libmemusage.so ライブラリは、 malloc(3), calloc(3), free(3), realloc(3) の呼び出しを横取りし、 メモリー割り当て状況の追跡を行う。 追加で、 mmap(2), mremap(2), munmap(2) を追跡することもできる。

memusage は収集したデータをテキスト形式で出力することもできるし、 memusagestat(1) を使って収集したデータをグラフにした PNG ファイルを作成することもできる (以下の -p オプションを参照)。  

メモリー使用量概要

memusage が出力する "Memory usage summary" (メモリー使用量概要) の行には 3 つのフィールドが含まれる。
heap total
malloc(3) のすべての呼び出しの size 引き数の合計、 calloc(3) のすべての呼び出しの引き数の積 (nmemb*size)、 mmap(2) のすべての呼び出しの length 引き数の合計。 realloc(3) と mremap(2) の場合、 割り当ての新しいサイズが以前のサイズよりも大きい場合、 差分 (新しいサイズから古いサイズを引いた値) の合計が加算される。
heap peak
malloc(3) の size 引き数、 calloc(3) の nmemb*size の積、 realloc(3) の size 引き数、 mmap(2) の length 引き数、 mremap(2) の new_size 引き数、 の中の最大値。
stack peak
監視される関数の最初の呼び出しが行われる前に、 スタックポインターアドレス (ベーススタックポインター) が保存される。 関数のそれぞれの呼び出し後には、 実際のスタックポインターアドレスを読み込み、 ベースポインターアドレスを元に差分を計算する。 これらの差分の最大値がスタックのピーク値となる。

この概要行の直後には、 監視対象の各関数の呼び出し回数、 割り当て・割り当て解除された全メモリー量、 失敗した回数がテーブルで表示される。 realloc(3) と mremap(2) の場合には、 フィールド "nomove" でブロックアドレスを変更した再割り当て数を、 フィールド "dec" でブロックサイズが減少した再割り当て数が追加で表示される。 realloc(3) の場合、 フィールド "free" でブロックの解放が行われた再割り当て (サイズが 0 の再割り当て) の数も追加で表示される。

memusage が出力するテーブルの "realloc/total memory" (再割り当てメモリー/全メモリー) には、 realloc(3) を使ってメモリーブロックをその前よりも小さいサイズに再割り当てされた 場合は含まれない。 このため、 ("free" 以外の) すべての「総メモリー」のセルは "free/total memory" セルよりも大きくなることがある。  

ブロックサイズのヒストグラム

"Histogram for block sizes" (ブロックサイズのヒストグラム) は、 メモリー割り当てをバケットサイズ単位に分割した情報である。  

オプション

-n name--progname=name
プロファイル対象のプログラムファイル名。
-p file--png=file
PNG 画像を生成し、 file に格納する。
-d file--data=file
バイナリーデータファイルを生成し、 file に格納する。
-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=name
グラフのタイトルとして name を使用する。
-x size--x-size=size
グラフの幅を size ピクセルにする。
-y size--y-size=size
グラフの高さを size ピクセルにする。
 

終了ステータス

終了ステータスはプロファイルしたプログラムの終了ステータスと同じになる。  

バグ

バグ報告については を参照のこと。  

以下の簡単なプログラムは、 ピークに達するまで繰り返しメモリーブロックの再割り当てを行い、 その後ブロックサイズが 0 になるまで繰り返し順に小さなブロックに再割り当てを行う。 このプログラムをコンパイルして以下のコマンドを実行すると、 このプログラムのメモリー使用量がファイル 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;
     int *p;


     printf("malloc: %zd\n", sizeof(int) * 100);
     p = malloc(sizeof(int) * 100);


     for (i = 0; i < CYCLES; i++) {
         if (i < CYCLES / 2)
             j = i;
         else
             j--;


         printf("realloc: %zd\n", sizeof(int) * (j * 50 + 110));
         p = realloc(p, sizeof(int) * (j * 50 + 100));


         printf("realloc: %zd\n", sizeof(int) * ((j+1) * 150 + 110));
         p = realloc(p, sizeof(int) * ((j + 1) * 150 + 110));
     }


     free(p);
     exit(EXIT_SUCCESS); }  

関連項目

memusagestat(1), mtrace(1), ld.so(8)  

この文書について

この man ページは Linux man-pages プロジェクトのリリース 5.07 の一部である。 プロジェクトの説明、バグ報告に関する情報、このページの最新版は、 http://www.kernel.org/doc/man-pages/ に書かれている。


 

Index

名前
書式
説明
メモリー使用量概要
ブロックサイズのヒストグラム
オプション
終了ステータス
バグ
プログラムのソース
関連項目
この文書について

This document was created by man2html, using the manual pages.
Time: 11:41:01 GMT, December 28, 2020