%20%E3%81%A7%E4%BA%88%E7%B4%84%E3%81%95%E3%82%8C%E3%81%9F%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%AE%E9%87%8F%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B.png)
プロセスが実行してmalloc()
も実際にはこのメモリに書き込まない場合、Linux はこのメモリが空いていて他のプロセスで使用できる (オーバーコミット) と見なすことがわかっています。
malloc()
とにかく、特定のプロセスによってどれだけのメモリが使用されたかを知る方法はありますか?(使用されていない場合でも)
この情報はシステム全体で存在しますが/proc/meminfo
、特定のプロセスについて知りたいのです。
調べてみました/proc/<PID>/{smaps,stat,statm}
が、この情報が表示されているかどうかはわかりません。
答え1
malloc()
データセグメントのサイズを変更する呼び出し(つまりsbrk()
、これは以前に割り当てられたメモリを再利用しません。そのため、またはの呼び出しにつながる割り当てはおよびmmap()
に表示されます。/proc/$PID/statm
/proc/$PID/stat
ではstatm
、最初のフィールドにはプログラムの合計サイズが表示され、6 番目のフィールドにはデータのページ数が表示されます。これらは両方ともメモリ割り当てを反映しています (未使用の場合でも)。
でstat
、注目するフィールドはvsize
(現在23番目のフィールド)です。
(表1-3と1-4を参照)proc
ドキュメンテーション。
malloc()
これらは合計メモリ使用量と合計データ セグメント サイズを示すため、使用されたメモリとその他のメモリ使用量を区別できないことに注意してください。
次のプログラムでこれを実際に見ることができます。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv) {
void *buf;
puts("Waiting before allocating...");
sleep(20);
buf = malloc(10*1024*1024*1024L);
puts("Sleeping after allocating...");
sleep(20);
free(buf);
return 0;
}
(いつものようにエラー処理は優れています。)その後
$ ./356532&
[1] 4239
Waiting before allocating...
$ cat /proc/4239/statm
1043 172 154 1 0 81 0
$ cat /proc/4239/stat | awk '{print $23}'
4272128
Sleeping after allocating...
$ cat /proc/4239/statm
2622484 172 154 1 0 2621522 0
$ cat /proc/4239/stat | awk '{print $23}'
10741694464
アンドリュー・ヘンレ 指摘した malloc_info(3)
実際に、これはほぼすべてのプロセスで使用できます。上記のサンプルプログラムを使用すると、デバッグ情報なし(必要ではないことを示すため):
$ gdb ./356532
> break free
free
(これにより、プログラム内の の呼び出しにブレークポイントが設定されます。実際には の任意の呼び出しですfree
が、まず「私たちの呼び出し」をヒットします。 でこれを試しても、malloc
起動コードが を使用しているため、あまり役に立ちませんmalloc
。)
> run
gdb
ブレークポイントに到達したら、malloc_info
次のように呼び出すことができます。
> call malloc_info(0, stdout)
これによりmalloc
情報がダンプされます。