在一段时间内获得记忆高水位线

时间:2017-07-27 22:11:01

标签: linux memory memory-management

对于长时间运行的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报告退出流程,因此在流程运行时查询流程也不可行。

其他选项,其中没有一个是好的:

  • 轮询。很容易错过我们的简短分配。
  • 检测我们的代码。我们无法访问所有正在使用的内存分配器,因此这不会非常优雅或直接。我还宁愿使用操作系统报告的值来确保准确性。

有没有办法做到这一点,没有提出Linux内核的补丁?

1 个答案:

答案 0 :(得分:3)

事实证明,自Linux 4.0起,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.

可以使用/proc/[pid]/status - >读取HWM /峰值RSS VmHWMgetrusage()

Patch RFC