2017-07-27 18 views
1

長時間実行されているLinuxプロセスで、短い間隔で使用される最大量のメモリを取得しようとしています。例えば、何かのように:時間間隔でメモリの最高水準点を取得します。

resetmaxrss(); // hypothetical new command 
void* foo = malloc(4096); 
free(foo); 
getrusage(...); // 'ru_maxrss' reports 4096 plus whatever else is alive 

resetmaxrss(); 
void* bar = malloc(2048); 
free(bar); 
getrusage(...); // 'ru_maxrss' reports 2048 + whatever, *not* 4096 

オプション私が発見し、除外しました:

  • getrusageの最大RSSをリセットすることはできません。
  • cgmemtimeはフードの下でwait4を使用しているようですので、実行中のプロセスにクエリを実行することはできません。
  • tstimeプロセスの終了を報告するため、実行中のプロセスを照会することもできません。良いですどれも

その他のオプション、:

  • ポーリング。私たちの簡単な割り当てを逃し易い。
  • コードを計測しています。使用されているすべてのメモリアロケータにアクセスすることはできませんので、これはあまりエレガントではありません。私はむしろ正確にOSによって報告された値を使用したいと思う。

これを行う方法はありますか?Linuxカーネルにパッチを提案するのは簡単ですか?

答えて

2

これは、Linux 4.0以降、ピークRSS リセットすることができることが判明:/proc/[pid]/statusで読み出すことができHWM /ピークRSS

/proc/[pid]/clear_refs (since Linux 2.6.22) 

    This is a write-only file, writable only by owner of the 
    process. 

    The following values may be written to the file: 

    [snip] 

    5 (since Linux 4.0) 
     Reset the peak resident set size ("high water mark") to 
     the process's current resident set size value. 

- >VmHWMまたはgetrusage()

Patch RFC

関連する問題