名 前
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">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/ に 書 か れ て い る 。