Linux 上のプロセスによって malloc() で予約されたメモリの量を確認する

Linux 上のプロセスによって malloc() で予約されたメモリの量を確認する

プロセスが実行して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情報がダンプされます。

関連情報