GNU/Linux >> Linux の 問題 >  >> Linux

C での現在のプロセスのメモリ使用量

/proc の「ファイル」はいつでも開くことができます 通常のファイルと同じようにシステムを作成します ('self' シンボリック リンクを使用するため、独自の pid を検索する必要はありません):

FILE* status = fopen( "/proc/self/status", "r" );

もちろん、ファイルを解析して必要な情報を選択する必要があります。


この投稿を見つけました:http://appcrawler.com/wordpress/2013/05/13/simple-example-of-tracking-memory-using-getrusage/

簡易版:

#include <sys/resource.h>
#include <stdio.h>

int main() {
  struct rusage r_usage;
  getrusage(RUSAGE_SELF,&r_usage);
  // Print the maximum resident set size used (in kilobytes).
  printf("Memory usage: %ld kilobytes\n",r_usage.ru_maxrss);
  return 0;
}

(Linux 3.13 でテスト済み)


これは、メモリ使用量を取得するための非常に醜く、移植性のない方法ですが、Linux では getrusage() のメモリ追跡は本質的に役に立たないため、/proc//statm を読み取ることが、メモリ使用量を取得する唯一の方法です。 Linux に関する情報

メモリ使用量を追跡するためのよりクリーンな方法、できればより Unix 間での方法を知っている人がいれば、その方法を知りたいと思っています。

typedef struct {
    unsigned long size,resident,share,text,lib,data,dt;
} statm_t;

void read_off_memory_status(statm_t& result)
{
  unsigned long dummy;
  const char* statm_path = "/proc/self/statm";

  FILE *f = fopen(statm_path,"r");
  if(!f){
    perror(statm_path);
    abort();
  }
  if(7 != fscanf(f,"%ld %ld %ld %ld %ld %ld %ld",
    &result.size,&result.resident,&result.share,&result.text,&result.lib,&result.data,&result.dt))
  {
    perror(statm_path);
    abort();
  }
  fclose(f);
}

proc(5) マンページから:

   /proc/[pid]/statm
          Provides information about memory usage, measured in pages.  
          The columns are:

              size       total program size
                         (same as VmSize in /proc/[pid]/status)
              resident   resident set size
                         (same as VmRSS in /proc/[pid]/status)
              share      shared pages (from shared mappings)
              text       text (code)
              lib        library (unused in Linux 2.6)
              data       data + stack
              dt         dirty pages (unused in Linux 2.6)

getrusage ライブラリ関数は、以下を含む現在のプロセスに関する大量のデータを含む構造を返します:

long   ru_ixrss;         /* integral shared memory size */
long   ru_idrss;         /* integral unshared data size */
long   ru_isrss;         /* integral unshared stack size */

ただし、最新の Linux ドキュメントには、これら 3 つのフィールドについて記載されています

(unmaintained) This field is currently unused on Linux

マニュアルでは次のように定義されています:

<ブロック引用>

すべてのフィールドが完了しているわけではありません。維持されていないフィールドは、カーネルによってゼロに設定されます。 (メンテナンスされていないフィールドは、他のシステムとの互換性のために提供されており、いつか Linux でサポートされる可能性があるためです。)

getrusage(2) を参照


Linux
  1. メモリ使用量のログを記録できるツール?

  2. Linux で合計 RAM サイズとメモリ使用量を確認する方法

  3. Linuxで単一プロセスのCPU使用率とメモリ使用率を取得しますか?

  1. Linux でのプロセス メモリ/CPU 使用量の制限

  2. Linux でプロセスのヒープ サイズを確認する方法

  3. Java プロセスの常駐メモリ使用量 (RSS) の増加

  1. 1 つのプロセスのメモリ使用量を呼び出して追跡する

  2. 単一の Linux プロセスのメモリ使用量を制限する

  3. メモリ使用量が多いが、それを使用しているプロセスがない