bionic (1) memusage.1.gz

Provided by: manpages-ja_0.5.0.0.20161015+dfsg-1_all bug

名前

       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" (メモリー使用量概要) の行には以下のフィールドが含まれる。

           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), mmap(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);
       }

バグ

       バグ報告については ⟨http://www.gnu.org/software/libc/bugs.html⟩ を参照のこと。

関連項目

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

この文書について

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