.\" Copyright (c) 2013, Peter Schiffer .\" and Copyright (C) 2014, Michael Kerrisk .\" .\" %%%LICENSE_START(GPLv2+_DOC_FULL) .\" This is free documentation; you can redistribute it and/or .\" modify it under the terms of the GNU General Public License as .\" published by the Free Software Foundation; either version 2 of .\" the License, or (at your option) any later version. .\" .\" The GNU General Public License's references to "object code" .\" and "executables" are to be interpreted as the output of any .\" document formatting or typesetting system, including .\" intermediate and printed output. .\" .\" This manual is distributed in the hope that it will be useful, .\" but WITHOUT ANY WARRANTY; without even the implied warranty of .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the .\" GNU General Public License for more details. .\" .\" You should have received a copy of the GNU General Public .\" License along with this manual; if not, see .\" . .\" %%%LICENSE_END .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH MEMUSAGE 1 2020\-11\-01 GNU "Linux user manual" .SH 名前 memusage \- プログラムのメモリー使用量のプロファイルを行う .SH 書式 \fBmemusage\fP [\fIoption\fP]... \fIprogram\fP [\fIprogramoption\fP]... .SH 説明 \fBmemusage\fP は、 プログラム \fIprogram\fP のメモリー使用量のプロファイルを行う bash スクリプトである。 呼び出し元の環境に (\fBLD_PRELOAD\fP 環境変数を使って) \fBlibmemusage.so\fP ライブラリをプレロードする。 \fBld.so\fP(8) を参照。 \fBlibmemusage.so\fP ライブラリは、 \fBmalloc\fP(3), \fBcalloc\fP(3), \fBfree\fP(3), \fBrealloc\fP(3) の呼び出しを横取りし、 メモリー割り当て状況の追跡を行う。 追加で、 \fBmmap\fP(2), \fBmremap\fP(2), \fBmunmap\fP(2) を追跡することもできる。 .PP \fBmemusage\fP は収集したデータをテキスト形式で出力することもできるし、 \fBmemusagestat\fP(1) を使って収集したデータをグラフにした PNG ファイルを作成することもできる (以下の \fB\-p\fP オプションを参照)。 .SS メモリー使用量概要 \fBmemusage\fP が出力する "Memory usage summary" (メモリー使用量概要) の行には以下のフィールドが含まれる。 .RS 4 .TP \fBheap total\fP \fBmalloc\fP(3) のすべての呼び出しの \fIsize\fP 引数の合計、 \fBcalloc\fP(3) のすべての呼び出しの引数の積 (\fInmemb\fP*\fIsize\fP)、 \fBmmap\fP(2) のすべての呼び出しの \fIlength\fP 引数の合計。 \fBrealloc\fP(3) と \fBmremap\fP(2) の場合、 割り当ての新しいサイズが以前のサイズよりも大きい場合、 差分 (新しいサイズから古いサイズを引いた値) の合計が加算される。 .TP \fBheap peak\fP \fBmalloc\fP(3) の \fIsize\fP 引数、 \fBcalloc\fP(3) の \fInmemb\fP*\fIsize\fP の積、 \fBrealloc\fP(3) の \fIsize\fP 引数、 \fBmmap\fP(2) の \fIlength\fP 引数、 \fBmremap\fP(2) の \fInew_size\fP 引数、 の中の最大値。 .TP \fBstack peak\fP 監視される関数の最初の呼び出しが行われる前に、 スタックポインターアドレス (ベーススタックポインター) が保存される。 関数のそれぞれの呼び出し後には、 実際のスタックポインターアドレスを読み込み、 ベースポインターアドレスを元に差分を計算する。これらの差分の最大値がスタックのピーク値となる。 .RE .PP この概要行の直後には、 監視対象の各関数の呼び出し回数、 割り当て・割り当て解除された全メモリー量、 失敗した回数がテーブルで表示される。 \fBrealloc\fP(3) と \fBmremap\fP(2) の場合には、 フィールド "nomove" でブロックアドレスを変更した再割り当て数を、 フィールド "dec" でブロックサイズが減少した再割り当て数が追加で表示される。 \fBrealloc\fP(3) の場合、 フィールド "free" でブロックの解放が行われた再割り当て (サイズが 0 の再割り当て) の数も追加で表示される。 .PP \fBmemusage\fP が出力するテーブルの "realloc/total memory" (再割り当てメモリー/全メモリー) には、 \fBrealloc\fP(3) を使ってメモリーブロックをその前よりも小さいサイズに再割り当てされた場合は含まれない。 このため、 ("free" 以外の) すべての「総メモリー」のセルは "free/total memory" セルよりも大きくなることがある。 .SS ブロックサイズのヒストグラム "Histogram for block sizes" (ブロックサイズのヒストグラム) は、 メモリー割り当てをバケットサイズ単位に分割した情報である。 .SH オプション .TP \fB\-n\ \fP\fIname\fP,\ \fB\-\-progname=\fP\fIname\fP プロファイル対象のプログラムファイル名。 .TP \fB\-p\ \fP\fIfile\fP,\ \fB\-\-png=\fP\fIfile\fP PNG 画像を生成し、 \fIfile\fP に格納する。 .TP \fB\-d\ \fP\fIfile\fP,\ \fB\-\-data=\fP\fIfile\fP バイナリーデータファイルを生成し、 \fIfile\fP に格納する。 .TP \fB\-u\fP,\ \fB\-\-unbuffered\fP 出力バッファーリングを行わない。 .TP \fB\-b\ \fP\fIsize\fP,\ \fB\-\-buffer=\fP\fIsize\fP 出力する前に \fIsize\fP 個のエントリーの収集を行う。 .TP \fB\-\-no\-timer\fP スタックポインター値の時間ベースのサンプリング (\fBSIGPROF\fP) を無効にする。 .TP \fB\-m\fP,\ \fB\-\-mmap\fP \fBmmap\fP(2), \fBmremap\fP(2), \fBmunmap\fP(2) も追跡対象とする。 .TP \fB\-?\fP,\ \fB\-\-help\fP ヘルプを表示し、終了する。 .TP \fB\-\-usage\fP 簡潔な使用方法を表示して終了する。 .TP \fB\-V\fP,\ \fB\-\-version\fP バージョン情報を表示して終了する。 .TP 以下のオプションは画像出力を行う場合にのみ適用される。 .TP \fB\-t\fP,\ \fB\-\-time\-based\fP X 軸の目盛として (関数呼び出し数ではなく) 時間を使用する。 .TP \fB\-T\fP,\ \fB\-\-total\fP メモリーの全使用量のグラフも生成する。 .TP \fB\-\-title=\fP\fIname\fP グラフのタイトルとして \fIname\fP を使用する。 .TP \fB\-x\ \fP\fIsize\fP,\ \fB\-\-x\-size=\fP\fIsize\fP グラフの幅を \fIsize\fP ピクセルにする。 .TP \fB\-y\ \fP\fIsize\fP,\ \fB\-\-y\-size=\fP\fIsize\fP グラフの高さを \fIsize\fP ピクセルにする。 .SH 終了ステータス 終了ステータスはプロファイルしたプログラムの終了ステータスと同じになる。 .SH バグ バグ報告については .UR http://www.gnu.org/software/libc/bugs.html .UE を参照のこと。 .SH 例 以下の簡単なプログラムは、 ピークに達するまで繰り返しメモリーブロックの再割り当てを行い、 その後ブロックサイズが 0 になるまで繰り返し順に小さなブロックに再割り当てを行う。 このプログラムをコンパイルして以下のコマンドを実行すると、 このプログラムのメモリー使用量がファイル \fImemusage.png\fP に出力される。 .PP .in +4n .EX $ \fBmemusage \-\-data=memusage.dat ./a.out\fP \&... 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% ================ $ \fBmemusagestat memusage.dat memusage.png\fP .EE .in .SS プログラムのソース .EX #include #include #define CYCLES 20 int main(int argc, char *argv[]) { int i, j; size_t size; int *p; size = sizeof(*p) * 100; printf("malloc: %zu\en", 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\en", size); p = realloc(p, size); size = sizeof(*p) * ((j + 1) * 150 + 110); printf("realloc: %zu\en", size); p = realloc(p, size); } free(p); exit(EXIT_SUCCESS); } .EE .SH 関連項目 \fBmemusagestat\fP(1), \fBmtrace\fP(1), \fBld.so\fP(8) .SH この文書について この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は \%https://www.kernel.org/doc/man\-pages/ に書かれている。